Vue 组件间的传值(通讯)
组件之间的通讯分为三种 父给子传 子给父传 兄弟组件之间的通讯
1 父组件给子组件传值
子组件嵌套在父组件内部,父组件给子组件传递一个标识,在子组件内部用props接收,子组件在模板里可以通过{{}}的形式进行使用。如果父组件给子组件传递的标识中含有—,子组件在接收时采用驼峰式接收。
- 父组件调用子组件的地方,
- 添加自定义属性,属性名随便定义(但是不要定义id,class等)
- 属性值为你需要传递的值(这个值可以是变量,如果是变量则使用绑定属性)
- 定义子组件的地方,
- 添加一个选项props,它是一个数组
- 数组中的元素就是父元素提供的属性名
- 那么,在子组件内部就可以直接使用父组件中定义的属性名,得到传递过来的属性值
2 子组件给父组件传值
- 子组件給父组件传值(相对于父给子传麻烦一点,就如我们常说的人往高处走,水往低处流嘛,如果要想水井里面的水到达地面上来,最起码我们要有个管,这个管就是子组件给父组件传值的通道)
- 子组件中,定义好一个事件标识,--- to-parent(相当于定义好了通道)(注意不要驼峰式命名)
- 然后通过this.$emit('to-parent', 传递的值)
- 父组件调用子组件的地方,执行这个事件,-----事件标识 to-parent
- <v-son @to-parent="getMoney"></v-son>
- 父组件实现方法getMoney,得到的值就是子组件传递给父组件的值
<template id="son">
<div>
我是孩子
<button @click="giveMoney(10000)">給父母打钱</button>
</div>
</template>
<template id="test">
<div>
<button @click='count++'>点击次数{{count}}</button>,
这个月孩子打了{{money}}元钱
<v-son @to-parent="getMoney"></v-son>
</div>
</template>
const Son = {
template: "#son",
data () {
return {
}
},
methods: {
giveMoney (val) {
// 你办了卡,把卡给了父母,你打钱
this.$emit('to-parent', val)
}
}
}
// 1、定义组件 ---- 组件的首字母必须大写
const Test = {
template: "#test",
data () {
return {
money: 0
}
},
methods:{
getMoney ( val ) {
this.money = val
}
},
components: {
'v-son': Son
}
}
3 非父子间的传值
非父子间的传值我个人觉得算是组件传值中最麻烦的一个,你说它难她也难,说它简单它也简单,我们只要定义好一方负责监听一方负责触发即可,他们之间相互传值依据的是中央事件总线,也就是new vue ,相当于飞机场中的塔台一样,都受它指挥。
$on 负责监听事件
$emit 负责触发事件 并传递参数
如果有AB两个组件,如果A要给B传值,B就必须先监听A,使用起来比较麻烦。
事件的中央总线 (飞机塔台,邮差的故事)
在src下创建bus.js
var bus = new Vue() //中央事件总线
export default bus ;
假如有AB两个组件
在AB组件中引入bus中央事件总线
在A组件中发送一个信息给B组件
methods:{
sendData(val){
bus.$emit("A-B",val)
}
}
mounted(){
bus.$on("B-A",function(val){
console.log(val)
})
}
在B组件内接收
mounted(){
bus.$on("A-B",function(val){
console.log(val)
bus.$emit("B-A",val)
})
}
如果AB组件有两次交互,就会有四次事件,如果做三次事件就会有六次事件
其实最麻烦的不是他们之间的传值,而是定义他们之间的事件名称,如果没有一套完备定义事件名称的规则,会无端的增加项目开发的周期,降低了开发效率,代码的耦合度会增加,维护性也低了。
所以不建议使用
可以在main.js中
vue.prototype.$bus = new Vue()在原型上扩展一个$bus
不用单创建bus文件
通过this.$bus.$on()进行使用
Vue 组件间的传值(通讯)的更多相关文章
- vue组件间的传值方式及方法调用汇总
1.传值 a.父组件传子组件 方法一: 父页面: <myReportContent v-if="contentState==1" :paramsProps='paramsPr ...
- [Props] vue组件间的传值及校验
基本用法 Prop的基本用法很简单,只需要在子组件的Vue实例中定义该属性并把值设为目标属性的数组即可 Vue.component('child', { ... // 接收message props: ...
- Vue 组件间传值
前言 Vue 作为现在比较火的框架之一,相信您在使用的过程中,也会遇到组件间传值的情况,本文将讲解几种 Vue 组件间传值的几种方法,跟着小编一起来学习一下吧! 实现 注意: 学习本文,需要您对 Vu ...
- vue组件定义方式,vue父子组件间的传值
vue组件定义方式,vue父子组件间的传值 <!DOCTYPE html> <html lang="zh-cn"> <head> <met ...
- Vue—非父子组件间的传值(Bus/发布订阅模式/观察者模式/总线)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue组件间通信六种方式(完整版)
本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...
- Vue组件间通信-Vuex
上回说到Vue组件间通讯,最后留了一个彩蛋~~~Vuex.Vuex是另一种组件通讯的方法,这节来说说Vuex(store仓库). 首先Vuex需要安装,安装的方式有很多,在这里就不一一细说了.我是通过 ...
- Vue组件间通信6种方式
摘要: 总有一款合适的通信方式. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的 ...
- react组件间的传值方法
关于react的几个网站: http://react.css88.com/ 小书:http://huziketang.mangojuice.top/books/react/ http://www.re ...
随机推荐
- 在vue中如何引jquer
最近学习vue,习惯性的通过<script>标签引入jquery,写完后报错才想起来,这种方式在vue是不适用的. 1:因为已经安装了vue脚手架,所以需要在webpack中全局引入jqu ...
- chales抓包,模拟异常情况
抓包能做什么? 1 .可以抓取客户端和server的请求和返回,可以借助判断是客户端问题是server问题 2.可以模拟各种异常情况用来测试异常情况 3.无接口文档情况下测试接口 怎么修改你抓到的请求 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_4_transient关键字_瞬态关键字
不想被序列化的成员变量用 transient修饰 age加上static关键字 反序列化age就读取不到正确的值了
- Spring学习02——控制反转、依赖注入
有两个人,张三和李四 package com.su.service; public class ZhangSan implements Tester{ public void test(){ Syst ...
- vue组件生命周期
分为4个阶段:create/mount/update/destroy 每一个阶段都对应着有自己的处理函数 create: beforeCreate created 初始化 mount: beforeM ...
- 剑指offer--day03
1.1题目:斐波那契数列:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 1.2解题思路:斐波那契数列公式为: 这道题递归很好写 ...
- VS2008 项目启动时报:“无法直接启动带有类库输出类型的项目”
解决办法一: 右击要解决方案项目--属性-通用属性—单启动项目 解决方法二:直接选中界面类,右击设为启动项目, 如果还是这样,那么在此项目上按右键 (VS2010的资源管理工具中),点属性,更改设置.
- C/C++ 引入头文件时 #include<***.h> 与 #include"***.h" 区别
两种情况区分: 1.#include <> 编译器只会去系统文件目录中查找,找不到就报错. 2.#include " " 编译器会先在用户目录中查找,再到编译器设定的 ...
- Django中orm的惰性机制
那么首先要知道什么是ORM 专业化的角度来说:叫对象关系映射(Object-Relation Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 那具体ORM是什么呢?:( ...
- 待补 http://acm.hdu.edu.cn/showproblem.php?pid=6602
http://acm.hdu.edu.cn/showproblem.php?pid=6602 终于能够看懂的题解: https://blog.csdn.net/qq_40871466/article/ ...