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()进行使用

原文地址:https://www.cnblogs.com/jlfw/p/11875633.html

时间: 2024-10-27 06:58:15

Vue 组件间的传值(通讯)的相关文章

vue组件间通信六种方式(完整版)

vue组件间通信六种方式(完整版) 前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D 都是父子关系,C 和 D 是兄弟关系,A 和 C 是隔代关系(可能隔多代). 针对不同的使用场景,如何选择行之有效的通信方式?这是我们所要探讨的主题.本文总结了vue组件间通信的几种方式,如props.$emit/$on.vuex.$parent / $chil

非父子组件间的传值

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>非父子组件间的传值(Bus/总线/发布订阅模式/观察者模式)</title> <script src="./vue.js"></script> </head> <body> <div

Vue 组件间通信有哪几种方式?

父子通信 (1)父组件向子组件传值props <button-counter :title="send"></button-counter> Vue.component('button-counter', { props: ['title'], data: function() { return { count: 0 } }, 子向父通信 (2)子组件向父组件传值  $emit('enlarge-text',10)   on 子组件通过自定义事件向父组件传递数据

vue组件间的通信之pubsub-js

本文介绍使用发布订阅的方式进行vue组件间的通信 我认为这种方式比较自由, 不存在组件间的关系问题 1. 首先安装pubsub-js npm install --save pubsub-js 2. 订阅方组件 import PubSub from 'pubsub-js' mounted(){ // 执行异常代码 // 订阅消息 PubSub.subscribe('deleteTodo',(msg,index)=>{ this.deleteTodo(index) // 调用deleteTodo方法

vue组件间传值

父组件向子组件传递数据 // 父组件传递 <dialogAttendee :dialogcascaderVisible="dialogcascaderVisible"></dialogAttendee> // 子组件接接收 props:{ dialogcascaderVisible: { type: Boolean, default: false }, reservation: Array, } 父组件改变子组件中的数据 // 父组件中引用子组件 <son

vue组件间通信子与父

二.组件间通信(子组件传值给父组件) 通过事件的方式来完成数据的传输. ①在父组件中 定义一个方法,用来接收子组件所通过事件传来的值 methods:{ recvMsg:function(msg){ //参数msg就是子组件通过事件出来的数据 }} ②绑定事件处理函数事件一般情况 都是自定义事件 <child-component @myEvent="recvMsg"></child-component> ③在子组件触发事件 事件名,值this.$emit('my

Vue组件之间的传值方法

在vue当中有两种组件之间的传值方法,分别是 * 父子组件* 之间的传值和* 非父子组件 *之间的传值方法 父子组件之间的传值方法 父子组件之间的传值分为两种 * 父组件给子组件传值 子组件给父组件之间的传值 父组件给子组件传值方法 // 父 <div id = "app"> <my-content></my-content> </div> // 子 <template id="content"> <

vue 组件之间的传值

组件之间的传值有三种  1,父组件给子组件传值 ,   2,子组件给父组件传值   3, 非父子组件之间的传值(又叫兄弟组件传值) 1.父组件给子组件传值   (父组件给子组件传值需要通过props) 首先我的页面结构是这样的  child是子组件   father是父组件, 在这里我新建一个父组件  father.vue <template> <div> <div>这是父组件</div> <!-- 使用组件child --> <child

父子组件间的传值

父子组件间通信 父组件-->子组件 1.父组件通过给子组件添加属性给子组件传值,子组件通过props来接受. 2但是要在属性前加“:”,即使用v-bind指令,才能使属性值是js代码,不然就是字符串. 3.单项输出流.即子组件不允许修改父组件传递的值,只能使用,不能修改. 父组件通过属性向子组件传值时,如果传递的是引用型的值,这时候子组件对父组件传递的值进行修改可能会影响其他子组件对这个引用类型值的使用. 解决办法:子组件在data项中新赋值父组件的变量,操作新的变量即可. 子组件-->父组件