vue2 组件通信

1. 父子组件通信

尽管我们可以使用
1️⃣this.$parent访问父组件实例
2️⃣this.$children访问所有的子组件实例
3️⃣this.$root组件所在的根实例

但这在vue中是不建议直接子组件操作父组件的数据的,或者父组件操作子组件的参数。

  • 父传子: 通过props
  • 子传父:这时候我们可以通过触发事件来通知父组件改变数据,从而达到改变子组件数据的目的。
官网通信说明图

父组件代码

 //parent.html子组件的引入 
<v-test :title="testTitle" @changeTitle="changes"></v-test>
////监听子组件触发的changeTitle事件,然后调用changes方法
//parent.vue
import test from XXX;
export default {
    components: {
       vTest: test
    },
    data (){
        return {
            testTitle: "我是子组件标题名称"
        }
    },
  methods: {
      changes (msg) {
          this.testTitle = msg;
      }
  }
}

子组件代码

child.html
<template>
<div>  {{title}}</div>
<button @click="changeInfo"></button>
</template>


 export default {
    props: {
        title: {
          default: ""
        }
    },
    
  methods: {
      changeInfo () {
        ////主动触发changeTitle方法,'hehe'为向父组件传递的数据
         this.$emit("changeTitle","我是新的title");
      }
  }
}

2. 兄弟组件通信

如果2个组件不是父子组件那么如何通信呢?这时可以通过eventHub来实现通信。
所谓eventHub就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。

let bus = new Vue(); //创建事件中心
// 触发组件 A 中的事件
bus.$emit('id-selected', 1)
// 在组件 B 创建的钩子中监听事件
bus.$on('id-selected', function (id) {
  // ...
})

如果业务涉及很多的组件通信,推荐使用Vuex

什么情况下我应该使用 Vuex?
虽然 Vuex 可以帮助我们管理共享状态,但也附带了更多的概念和框架。这需要对短期和长期效益进行权衡。
如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了。但是,如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 序 今年大前端的概念一而再再而三的被提及,那么大前端时代究竟是什么呢?大前端这个词最早是因为在阿里内部有很多前端开...
    一缕殇流化隐半边冰霜阅读 11,278评论 19 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,637评论 25 708
  • 大学里最难处理的事莫过于人际关系。倒不是说,在人生的其他阶段处理起人际关系就能游刃有余,而是我此刻身在大学的体会。...
    Qingmao阅读 286评论 0 2
  • 听了毛不易的歌,让我不禁深夜难以入睡! 像我这样莫名其妙的人 会不会有人心疼 像我这样脾气倔强的人 怎么有人能够接...
    与你仗剑天涯阅读 221评论 0 0