vue 组件通信

2020-04-14  本文已影响0人  杨晨1994

一、什么是组件化

组件系统是 Vue 的一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。
组件化可以使代码复用,维护性高,方便测试

二、父组件 => 子组件

// 子组件通过props接受父组件传过来的值
props:{
  msg:String
}
// 父组件传值给子组件
<hello-world msg="hellow"></hello-world>
<hello-world ref="hello" msg="hello"></hello-world>
console.log(this.$refs.hello.msg)

这里注意一点这里获取的是组件节点,如果你想获取dom元素节点要加上$el

三、子组件 => 父组件(自定义事件)

// 子组件派发一个事件(handleClick),传参数为(success)
this.$emit('handleClick','success')
// 父组件监听(handleClick)事件,并做事件的回调处理event就是子组件传过来的参数
<hello-world msg="hello" @handleClick="handleClickParent(event)"></hello-world>

四、兄弟组件通信(通过共同祖辈搭桥$parent或者$root)

//子组件1
this.$parent.$emit('add',1)
//子组件2
this.$parent.$on('add', (val) => {
  console.log(val)
})

五、兄弟组件通信(通过bus总线)

这种方式其实和上面那种差不多少

// main.js
Vue.prototype.$bus =new Vue();
//子组件1
this.$bus.$emit('add',1)
//子组件2
this.$bus.$on('add', (val) => {
  console.log(val)
})

六、祖先和后代多层传值

// 祖先
provide () {
  return {
    msg:'hello'
  }
}
// 后代
inject:['msg']

注意:provide/inject主要在高阶插件或组件库里面使用,尽量不要直接应用在程序代码中

vue当中后代给祖先传值是不行的,所以我们手动写一个dispatch方法

// 实现方法
methods:{
  dispatch(eventName,data,name){
    let parent = this.$parent;
    while (parent){
      if(parent){
        if(parent.$options.name === name){ // 这一步主要是判断在哪一个父组件派发
            parent.$emit(eventName,data);
            break
          }else{
            parent = parent.$parent
          }
      }else{
        break
      }
    }
  }
}
// 调用
<button @click="dispatch('add',1,'Home')">点击</button>
// 祖先组件监听
mounted () {
  this.$on('add',(val)=>{
    console.log(val)
  })
 }

七、vuex

上面那几种方式只适合小项目或者组件之间相互传值,真正工作中的大型项目还是要用vuex中的store来管理全局数据,并通知组件状态变更。这里我就不多说了,说的话一篇文章也讲不完关于vuex的使用,这里我们只是简单地介绍了这几种模式,更深层次的功能还需要自己研究

上一篇 下一篇

猜你喜欢

热点阅读