vue—组件间通信

166 阅读2分钟

  • A与b、c、d为父子关系
  • b、c、d为兄弟关系
  • A与b1、b2、c1、c2、d1、d2为隔代关系

一、父子组件

1. 父向子传递数据 (props):子组件中需要用到父组件中的数据

  • 子组件:js中用props接收
  • 父组件::子组件中的变量名 :要传递的名字="要传递的值"

2. 子向父传递数据 ($refs/$emit):父组件中需要用到子组件中的数据

  • 情况1:父组件只有在初始化的时候需要获取子组件中的数据,并且数据不再变化 通过this.$refs.子组件名.数据获取 image.png

  • 情况2:父组件需要从子组件中获取数据,并且这个数据会受到子组件中的某些操作而发生变化
    • 子组件:js中添加自定义事件(this.$emit('event', params))
    • 父组件:js中监听自定义事件(event),并在父组件中处理该事件 子组件发射自定义事件 image.png image.png 父组件监听并处理自定义事件 image.png image.png

3. 父组件直接访问子组件中的方法和属性 ($refs $children)

  • $children 访问所有子组件
  • $refs.子组件名.方法 访问特定的子组件 通过ref给子组件赋予一个ID引用

4. 子组件直接访问父组件中的方法和属性 ($parent $root)

  • $parent 访问父组件
  • **root访问根组件与root** 访问根组件 与ref类似

二、非父子

1️⃣事件总线、2️⃣VueX、3️⃣混入、4️⃣依赖注入、5️⃣v-model

1. 事件总线EventBus

  • 总体思路:使用一个空的vue实例作为中央事件总线
  • 原型链
  • $emit $on
    • $emit 触发当前实例上的事件,参数传递给监听自定义事件的函数。
    • $on 监听当前实例上的自定义事件,回调函数接收所有额外参数。

2. Vuex

待补充

3. 混入

  • 分为全局混入和局部混入,混入内容与组件自身发生冲突时,以组件自身内容为主
  • 使用
  • (1)定义并导出一个混入对象及内容(data, methods...)
  • (2)混入(全局 or 局部)
    • 全局混入:在main.js中通过Vue.mixin混入,不需要在组件中再引入
    Vue.mixin({需要全局混入的内容})
    
    • 局部混入:需要在组件内部通过mixins: [mixin名字]混入
    mixins: [test] // 将test混入到当前组件
    

4. 依赖注入(provide && inject)

优点:
① 祖先组件不需要知道哪些后代组件使用它提供的 property
② 后代组件不需要知道被注入的 property 来自哪里

  • 数据
    • 父组件:提供一个依赖
    • 孙子组件:注入一个依赖 image.png image.png
  • 方法
    • 同数据