vue组件间通信的6中方式(全)

方式一、 props / $emit

  父组件铜鼓偶 props 向子组件传递数据,子组件通过 $emit 向父组件传递数据,在父组件中通过 v-on 接受。

  不详细说明了,比较简单

方式二、$emit $on 中央事件总线

  这种方法通过一个空的 vue 实例作为中央事件总线,用它来触发事件和监听事件,可以实现任何组件间的通信,包括父子,兄弟,跨级。

    (个人觉得不如直接使用vuex)

  1.具体实现方式

      this.$emit('fun', data)
      this.$on('fun', data => {})

  首先建立一个空的 Vue 实例,将通信事件挂载到该实例上

  // ab.js
  import Vue from 'vue'
  export default new Vue()

  兄弟组件a

  import ab from './ab'
  export default {
    name: "A",
    data() {
      return {
        name: 'zhangningA'
      }
    },
    mounted() {
      ab.$emit('aname', this.name)
    }
  }

  兄弟组件b

import ab from "./ab";
export default {
  name: "B",
  data() {
    return {
      name: 'zhangningB',
      getaname: ''
    }
  },
  mounted() {
    ab.$on('aname', data => {
      this.getaname = data
    })

  }
}

  注:不推荐这种组件间传值的实现方式

方式三、vuex

  参考另一篇博客  https://www.cnblogs.com/zhangning187/p/fendouzailushang2.html

方式四、provide / inject

  在 vue 2.2.0 之后的版本中添加了 provide 和 inject 。他们成对出现,用于组件中传递数据。主要解决了跨级组件间的通信问题。

Root
  └─ List
      ├─ Item
      └─ Footer
          ├─ Button
          └─ Statistics

  当这种深层次的结构,需要将 root 组件中的数据传递给 statistics 组件的时候,如果仍然使用 prop 沿着组件逐级传递下去可能会很麻烦。这个时候我们可以使用 provide 和 inject 进行传递数据。无论层次结构多深,父组件都可以作为其所有子组件的依赖者。父组件通过 provide 提供数据,子组件通过 inject 接收数据.

// root组件
export default {
  name: 'root',
  components: {
    List: () => import('./list')
  },
  data(){
    return {
      name: '我是tname'
    }
  },
  /*provide:{
    // 这里访问不到实例中的 property ,需要将 provide 转换为返回对象的函数
    tname: this.name
  }*/
  provide(){// 向子组件发送数据
    return {
      rootName: this.name
    }
  }
}    
// statistics组件
export default {
  name: 'statistics',
 // 接收父组件通过 provide 传递过来的数据
 inject:['rootName']
}

  注:父组件不需要知道哪些子组件使用了它的 provide 的 property

    子组件也不需要知道 inject 的 property 来自哪个父组件

  解决响应式问题

    将一个函数赋值给 provide 的一个值,这个函数返回父组件的动态数据,然后在子孙组件里面调用这个函数。

    实际上这个函数存储了父组件实例的引用,所以每次子组件都能获取到最新的数据。

// 父组件
export default {
  name: 'index',
  components: {
    Aco: () => import('./a')
  },
  data() {
    return {
      name: '我是tname'
    }
  },
  provide() {// 向子组件发送数据
    return {
      // 传递组件的实例 this
      rootName: this,
    getParentName: () => this.name
  }
 }
}

 

// 子组件
export default {
  name: 'b',
  inject: ['name', 'getParentName'],
  computed: {
    // 接收数据
    parentName() {
      return this.getParentName()
    }
  }
}

方式五、$parent / $children ref

  ref:如果在普通的 dom 上使用,引用指向的就是 dom 元素,在子组件上使用,引用的就是组件实例

  $parent / $children :访问父子组件实例

    这两种都是直接得到组件的实例,使用后可以直接调用组件中的方法或者数据。但是无法在跨级或兄弟组件间通信。理论上用的不太多

方式六、$attrs / $listeners

   多级组件嵌套需要传递数据时,通常使用vuex,但是如果仅仅时数据的传递,而不做中间的处理,有点大材小用了。vue 2.4 提供了另一种方法 $attrs / $ listeners

  $attrs:存放的是负组件中绑定的非 props 属性

  $listeners:存放的是负组件中绑定的非原生事件

  详情查看这篇博客 :https://www.cnblogs.com/zhangning187/p/vueapixxzj.html

 
原文地址:https://www.cnblogs.com/zhangning187/p/vuezjtx6fsq.html