vue 组件通信

一、什么是组件化

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

二、父组件 => 子组件

  • 属性props
// 子组件通过props接受父组件传过来的值
props:{
  msg:String
}
// 父组件传值给子组件
<hello-world msg="hellow"></hello-world>
  • 引用refs 获取子组件的值
<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)
})

六、祖先和后代多层传值

  • 由于嵌套层数过多,用props不太现实,vue提供了provide/inject来实现该操作
// 祖先
provide () {
  return {
    msg:'hello'
  }
}
// 后代
inject:['msg']

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

  • dispatch 后代向祖先传值

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的使用,这里我们只是简单地介绍了这几种模式,更深层次的功能还需要自己研究

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 能工摹形,巧匠窃意。必三省吾身,万不可怠惰因循。 foreword 这篇容纳了我个人所知道的一些Vue 2.x组件...
    aichisuan阅读 2,900评论 0 1
  • 背景   Vue是单页面应用,单页面应用又是由组件构成,各个组件之间又互相关联,那么如何实现组件之间通信就显得尤为...
    A郑家庆阅读 4,477评论 0 1
  • 组件作为Vue中的核心概念,是值得我们深入研究的课题之一,通过研究它,我们可以理解更高深的思想,可以提升自己的开发...
    北辰_狼月阅读 4,108评论 2 7
  • 对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的各种方式的总结,总共有8种方式。 1....
    edc余悸阅读 2,860评论 0 3
  • 简介 组件是Vue的核心,而组件间的状态管理和数据传递是开发绕不开的问题。在Vue中,组件和组件之间是相互独立的,...
    LeoMelody阅读 5,667评论 1 2