Vue 非父子组件通信
前面的话
在实际业务中,除了父子通信外,还有很多非父子组件通信的场景,非父子组件一般有两种,兄弟组件和跨多级组件。Vue.js 2.x中,使用一个空的Vue实例作为中央事件总线(bus)。
中央事件总线就好比一个中介,租房者与出租者担任两个跨级组件,租房者与出租者之间的联系全靠中介,而两个跨级组件之间的通信全靠中央事件总线(bus)。
中央事件总线
<div id="app1"><component-a></component-a><component-b></component-b>
</div>
<script>var bus = new Vue();var app1 = new Vue({el: '#app1',components: {'component-a': {template: `<p>{{message}}{{changeMsg}}</p>`,data() {return {message: ''}},computed:{changeMsg() {var that = this;// 监听来自bus实例的事件bus.$on('on-message',function(msg) {that.message = msg;})}} },'component-b': {template: `<button @click="handleEvent">传递事件</button>`,methods: {handleEvent: function() {// 点击按钮通过bus把事件on-message发出去bus.$emit('on-message','来自组件component-b的内容')}}}}});
</script>
上例中组件component-a与component-b是兄弟关系: 首先创建了一个名为bus的空实例,作为中央事件总线。然后创建了 Vue实例app1, 局部定义了两个兄弟组件,在component-b组件中,点击按钮会通过bus把事件on-message发出去;在 component-a中用监听属性监听来自bus实例的事件。
除了中央事件bus外,还有两种方法可以实现组件间通信:父链与子组件索引.
父链
在子组件中,使用this.$ parent可以直接访问该组件的父实例或组件,父组件也可以通过this.$children访问它的所有 的子组件,而且可以递归向上或向下无线访问,直到根实例或最内层的组件。
<div id="app2"><parent-component></parent-component></div><script>var childNode = {template: `<button @click="handleEvent">通过父链直接修改数据</button>`,methods: {handleEvent() {// 访问父链后,可以做任何操作,比如直接修改数据this.$parent.message = '来自组件child-component的内容'}}}var app2 = new Vue({el:'#app2',components: {'parent-component': {template: `<div class="parent"><p>{{message}}</p><child-component></child-component></div>`,data() {return {message: ''}},components: {'child-component': childNode}}}});
</script>
尽管Vue允许这样操作,但是在业务中,子组件应该尽可能避免依赖父组件的数据,更不该去修改它的数据,这样 使得父子组件紧耦合,父组件可以被任意组件修改,理想情况下,只有组件自己能修改它的状态。父子组件最好 还是通过props和$emit来通信。
子组件索引
当子组件较多时,通过this.children来一一遍历出我们需要的一个组件实例是比较困难的,尤其是组件动态渲染时,它们的序列是不固定的。Vue提供子组件索引的方法,用特殊的属性ref来为子组件指定一个索引名称。
<div id="app3"><parent-component></parent-component></div><script>var app3 = new Vue({el:'#app3',components: {'parent-component': {template: `<div class="parent"><button @click="handleRef">通过ref获取子组件实例</button><child-component ref="childCom"></child-component></div>`,components: {'child-component': {template: `<div>子组件</div>`,data(){return {message: '子组件的内容'}}}},methods: {handleRef() {// 父组件通过$ref来访问指定的实例var msg = this.$refs.childCom.message;console.log(msg);}}}}})
</script>
在父组件模板中,子组件标签上使用ref指定一个名称,并在父组件内通过this.$refs来访问指定名称的子组件。
注意:$refs只在组件渲染完成后才填充,并且时非响应式的。它仅仅作为一个直接访问子组件的应急方案,应当避免在模板或计算属性中使用 $ refs
Vue 非父子组件通信相关推荐
- Vue 非父子组件通信方案
Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...
- Vue 非父子组件通信 (ref)
Vue 非父子组件通信 (ref) 流程:1. 先在son子组件中定义一个数据和事件处理程序data( ) { return { flag: false }} , methods: { cry( ) ...
- VUE非父子组件通信Bus——公交车踩坑笔记
抛开父子组件的通讯,对于非父子组件通信,简单的数据交互,使用Bus是非常不错的. 遇到的坑有两个. 1.两个组件的信息交互代码写在哪个生命周期函数中,如果只是点击组件A标签触发函数,然后向界面B传递参 ...
- VUE非父子组件通信
非父子组件通信 vue非父子组件传值方式,本文章整理了两种方式:vuex和总线bus.vuex相比于总线bus来说非常的稳定,推荐直接使用vuex. 我看其他的文章基本上是[点击导航栏回退的时候,去获 ...
- Vue非父子组件通信的几种方式
文章目录 1.provide和inject 1.1基本使用 1.2如何处理响应式数据 2.全局事件总线mitt库 2.1安装mitt库,封装eventbus.js工具类 2.2在其中一个组件中触发事件 ...
- Vue之非父子组件通信
Vue之非父子组件通信 非父子组件传值方法: 1:在model中新建一个js文件 引入Vue 实例化Vue 最后暴露相关实例 // 引入vue import Vue from 'vue' // 创建 ...
- vue父子组件通信以及非父子组件通信的方法
组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...
- 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法
组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...
- Vue的父子组件通信(十种)
设计的面试题 Vue中父子组件通信有哪些方式? 概述 通信方式无外乎就那几种: Prop 常用$emit 组件封装用的较多.sync 语法糖 (较少)$attrs和$listeners(组件封装用的较 ...
最新文章
- iOS 微信SDK1.8.6后需要UniversalLink解决方案及采坑记录
- 中学再不学编程就晚了?MIT、JHU研究:程序员大脑思考代码的机制不对劲
- 一句话实现php日期转中文汉字
- C-C Primer Plus阅读笔记
- Atom React或前端插件推荐
- python高级编程知识点_(转)python 高级编程技巧学习笔记
- HDU 6703 array(主席树 + set)
- 自然数 素数 质数_在Java中获取素数的无限列表
- java写出http数据包_java用jpcap怎么识别出http和https的数据包?
- 冷凝器换热效果变差后果
- Windows Server 2008 R2更新永恒之蓝 补丁包方法
- VeriSign SSL证书产品及服务_VeriSign证书|SSL证书|EVSSL证书|服务器证书|数字证书
- 基于MATLAB的QAM调制与解调系统设计
- 如何运用SWOT分析法
- Mac电脑怎么使用ping命令
- IPV4与IPV6练习
- 图森面试官| 图森未来首席科学家王乃岩:播下去的种子,早晚会开花
- 罗技G304接收器无反应问题,现象及解决方法
- Pycharm 许可证过期解决
- 谷歌google自动打开开发调式工具问题DevTools
热门文章
- centos7安装mysql(mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar)
- Python练级打怪全攻略——从上手到走出新手村
- 智能门铃中可视对讲的回音消除
- 每天学点英语语法-重头开始8
- html中的xmlns是什么意思?
- 一个简单的加密解密程序
- vulnhub渗透系列之DC(一) :内含suid的三种提权方法
- Trans系列中的hits@10、Mean rank
- 【周志华机器学习】六、支持向量机
- “腾讯TLive-无缝接流”护航各大卫视跨年晚会完美收官