Vue.js中的组件通信

简介: Vue.js中的组件通信

注意:组件通信, 无论效果是如何的, Vue都是单向数据流(组件之间的数据通信)

Vue.js中组件通信一共分为四种:

  • 父子组件通信
  • 子父组件通信
  • 非父子组件通信
  • 多组件状态共享

下面一一介绍:

父子组件通信

绑定的是简单数据类型:

父组件中定义数据, 通过单向数据绑定的形式, 将数据绑定在子组件身上, 属性是自定义属性

子组件通过配置项中的props接收数据, props可以是一个数组,数组中放的是自定义属性名称

那么这个自定义属性可以向data中的数据一样直接在子组件模板中使用

父组件中数据一旦修改, 子组件数据就会修改, 那么这也就是单项数据流

结构:

image.png

子父通信

绑定了复杂的数据类型:


父组件中的数据是一复杂数据类型, 那么父组件绑定数据的时候, 给子组件的是一个引用地址

子组件可以通过这个引用地址, 修改这个数据

效果上像, 子组件和父组件通信了, 违背单项数据流

父组件可以传递一个方法给子组件:


父组件定义方法, 然后将这个方法通过单向数据绑定的形式传递给子组件

子组件通过props属性接收, 然后通过 @click = "方法名"

通过自定义事件来实现通信:


父组件中定义 数据 和 方法(方法时用来操作数据的)

在子组件身上绑定自定义事件

子组件定义方法, 在这个方法中通过 this.$emit(eventType,实际参数) 来调用自定义事件的事件处理程序

结构:

image.png

//步骤1,父组件中定义数据和方法,gk,getMoney
    Vue.component('King',{
       template:'#king',
       data(){
           return {
               gk:0
           }
       },
       methods:{
           getMoney(value){
              this.gk+=value;
           }
       }
    })
    //步骤3,子组件定义方法,这个方法中通过方法中通过 this.$emit(eventType,实际参数)触发了步骤2的自定义事件
    Vue.component('People',{
        template:'#people',
        data(){
            return {
                money:2000
            }
        },
        methods:{
            giveMoney(){
                this.$emit('getmoney',this.money/2)
            }
        }
    })
   new Vue({
       el:'#app'
   })

非父子通信

使用ref来绑定组件, (注意:ref也可以绑定DOM元素) 【ref链】


  1. 在父组件的模板中, 使用ref = refName 绑定在两个兄弟组件身上
  2. 在任意一个子组件中, 就可以通过 this.$parent.$refs.refName 就可以获得另一个子组件了, 同时这个自组件身上的数据和方法同样也得到了

结构:

image.png

image.png

Vue.component('Father',{
    template: '#father',
    data () {
      return {
        name: 'father'
      }
    }
  })
Vue.component('Boy',{
    template: '#boy',
    data () {
      return {
        cash: 2000
      }
    },
    methods: {
      incrementCash (value) {
        this.cash += value
      }
    }
  })
Vue.component('Girl',{
    template: '#girl',
    data () {
      return {
        money: 1000
      }
    },
    methods: {
      give(){
        console.log('====================================');
        console.log(this.$parent);
        console.log('====================================');
        // console.log( this.$parent.$refs ) // { body: Vuecomponent,girl: VueComponent }
        this.$parent.$refs.boy.incrementCash( this.money )
        // this.$parent.$children
      }
    }
  })
  new Vue({
    el: '#app'
  })

通过事件总线(bus)

  1. 它是通过事件的发布(声明), 以及事件的订阅(触发)来做的
  2. 首先在js中 创建一个bus对象(vm)
var bus = new Vue()
  1. 在Boy组件中定义数据, 和修改数据的方法
  2. 在Boy组件中 通过 created 钩子 , 进行bus事件的发布
  3. 注意:参数传递问题实参写在 bus.$emit('add',1000)
created: {
    bus.$on('add',this.addCount)
 }
  1. 在MyButton组件的方法中通过 bus进行事件的订阅

结构:

image.pngimage.png

/*
         1.它是通过事件的发布(声明), 以及事件的订阅(触发)来做的
         2.首先在js中  创建一个bus对象(vm) 
         3.在Boy组件中定义数据, 和修改数据的方法
         4.在Boy组件中 通过 created 钩子 , 进行bus事件的发布
         注意:参数传递问题实参写在 bus.$emit('add',1000)
        */
       let bus=new Vue();
      Vue.component('Boy',{
          template:'#boy',
          data(){
              return {
                  cash:0
              }
          },
          methods:{
              getMoney(value){
               this.cash+=value;
              }
          },
          created(){
              bus.$on('add',this.getMoney)
          }
      })
      Vue.component('Girl',{
          template:'#girl',
          methods:{
             giveMoney(){
                 bus.$emit('add',1000)
             }
          }
      })
       new Vue({
           el:'#app'
       })
相关文章
|
14天前
|
JavaScript
vue 函数化组件
vue 函数化组件
|
1月前
|
资源调度 JavaScript API
vue3封装城市联动组件
vue3封装城市联动组件
|
5天前
|
JavaScript
vue组件中的插槽
本文介绍了Vue中组件的插槽使用,包括单个插槽和多个具名插槽的定义及在父组件中的使用方法,展示了如何通过插槽将父组件的内容插入到子组件的指定位置。
|
14天前
|
存储 API
vue3中如何动态自定义创建组件并挂载
vue3中如何动态自定义创建组件并挂载
206 90
|
2月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
94 0
|
7天前
|
JavaScript
Vue使用element中table组件实现单选一行
如何在Vue中使用Element UI的table组件实现单选一行的功能。
26 5
Vue使用element中table组件实现单选一行
|
9天前
|
JavaScript
关于Vue非父子组件通信遇到的细节问题
本文讨论了Vue中非父子组件通信的一个细节问题,即当使用事件总线($eventsBus)进行通信时,需要确保两个组件能够同时在页面上显示,否则可能无法正确触发和监听事件。作者通过组件A和B的例子说明了这一点,并指出解决方案是在一个共同的父组件C中监听事件。
14 1
关于Vue非父子组件通信遇到的细节问题
|
9天前
|
JavaScript
Vue2.0、Vue3.0分别使用v-model封装组件[Vue必会]
本文介绍了在Vue 2和Vue 3中如何使用`v-model`来实现组件间的双向数据绑定,包括在Vue 2中使用`value`和`input`事件,以及在Vue 3中使用`modelValue`和`update:modelValue`事件的方法。
51 22
|
4天前
|
JavaScript
vue 函数化组件
vue 函数化组件
|
6天前
|
JavaScript 前端开发 Java
vue-day03 组件基础
文章介绍了Vue.js中组件的基础概念、注册格式、命名方式、全局与局部注册的区别、prop属性的详细使用以及通过prop向子组件传递数据的方法,并提供了计数器和博文小组件的实例。
下一篇
无影云桌面