Vue组件之间通信的三种方式
最近在看梁颠编著的《Vue.js实战》一书,感觉颇有收获,特此记录一些比价实用的技巧。
组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象三大特性之一的封装,将复杂的会被多次调用的代码封装成组件,在需要调用的地方注册使用即可。这样设计的前端代码方便移植,可以跨项目复用。
组件之间的关系分为父子组件兄弟组件和跨多级组件等等,在组件之间交互数据,进行通信主要通过三种方式来进行:
- 中央事件总线(非父子组件通信)
- 父链
- 子组件索引
下面让我们来好好说道说道这三种通信方式:
一.中央事件总线
这个东西名字叫的很唬人,但实际却是很好理解的一种通信方式,话不多说,我们来上代码。
<body>
<div id="app">
{{message}}
<tempcomponent-a></tempcomponent-a>
</div>
<script>
var middleware = new Vue(); Vue.component('tempcomponent-a', {
template: '<button @click="handleEvent">传递事件</button>',
methods: {
handleEvent: function () {
middleware.$emit('on-message', '来自组件tempcomponent-a的内容');
}
}
});
var app = new Vue({
el: '#app',
data: {
message: ''
},
mounted: function () {
var _this = this;
middleware.$on('on-message', function (msg) {
_this.message = msg;
})
},
});
</script>
</body>
在上面的代码中,空的Vue实例"middleware"就是我们的所谓的中央事件总线,我们可以看到,它负责在自组件"tempcomponent-a"中发出事件,在我们的主体Vue实例app中,通过监听"middleware"来获取子组件发出的内容。我的理解是中央事件总线就类似我们做交换数据的时候的临时变量一样,它在中间负责处理结果,然后返回消息给请求者,它的职责就是中介。这个空的vue实例也可以加入data,methods等选项,这些都是可以作为公用的。
二.父链$parent
父链这个词就很好理解啦,顾名思义即是组件的父对象,在组件内部可以直接通过$parent对父对象进行操作
<body>
<div id="app">
{{message}}
<tempcomponent-a></tempcomponent-a>
</div>
<script>
Vue.component('tempcomponent-a', {
template: '<button @click="handleEvent">通过父链直接修改数据</button>',
methods: {
handleEvent: function () {
this.$parent.message = '来自组件tempcomponent-a的消息';
}
}
});
var app = new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
</body>
通过上面的代码,我们可以看到在自组件内,使用父链$parent直接对父对象对属性操作是非常简单的。
三.子组件索引ref&$refs
子组件这个也很好理解,是在父对象上对所拥有对子组件进行操作,一般来说父容器内对子组件会有多个,所以每个组件需要设置特殊属性ref来为自身指定一个唯一名称。
<body>
<div id="app">
<button @click="handleRef">通过ref获取子组件实例</button>
<tempcomponent-a ref="comA"></tempcomponent-a>
</div>
<script>
Vue.component('tempcomponent-a', {
template: '<div>子组件</div>',
data: function () {
return {
message: '子组件内容'
}
}
});
var app = new Vue({
el: '#app',
methods: {
handleRef: function () {
var msg = this.$refs.comA.message;
console.log(msg);
}
}
})
</script>
</body>
从代码可以看出,当我们直接在组件上创建ref属性,在父对象中想对子组件进行操作,直接通过$refs.加上该组件唯一对ref属性即可访问。注意$refs是子组件渲染完成之后才填充对,而且不是响应式,应避免在计算属性和模版中使用$refs
Vue组件之间通信的三种方式的更多相关文章
- vue组件之间通信的8种方式
对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的常用方式的总结. props和$emit(常用) $attrs和$listeners 中央事件总线(非父子组件间通信) v- ...
- vue组件之间通信总结(超详细)
组件通信在我们平时开发过程中,特别是在vue和在react中,有着举足轻重的地位.本篇将总结在vue中,组件之间通信的几种方式: props.$emit $parent.$children $attr ...
- 前端面试 vue 部分 (5)——VUE组件之间通信的方式有哪些
VUE组件之间通信的方式有哪些(SSS) 常见使用场景可以分为三类: 父子通信: null 父向子传递数据是通过 props ,子向父是通过 $emit / $on $emit / $bus Vuex ...
- IPC进程之间通信的几种方式
概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...
- Vue 组件之间通信 All in One
Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...
- (尚031)Vue_案例_自定义事件(组件间通信第2种方式:vue自定义事件)
自定义事件: 我们知道,父组件使用prop传递数据的子组件,但子组件怎么跟父组件通信呢? 这个时候Vue的自定义事件系统就派得上用场了. 自定义事件知道两件事: (1).绑定 (2).触发 注意:$o ...
- Angular 组件通信的三种方式
我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...
- [转] React 中组件间通信的几种方式
在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面依次说下这几种通 ...
- Vue组件之间通信
vue组件传值有以下几种情况: 父组件向子组件传值.子组件向父组件传值.兄弟组件之间传值等 一.父组件向子组件传值: 传值方式: props <father> // 动态传递值 <s ...
随机推荐
- Ubuntu 16.04安装TortoiseSVN(基于CrossOver)
基于CrossOver的TortoiseSVN有如下缺点: 1.不能像Windows下实现右键菜单提交,但是可以通过TortoiseSVN实现迁出代码. 可以解决的问题: 1.可以通过Tortoise ...
- LTTNG 使用
http://lttng.org/docs/#doc-channel http://www.cnblogs.com/suncoolcat/p/3366045.html http://blog.csdn ...
- MongoDB小结14 - find【查询条件$lt $lte $gt $gte】
$lt $lte $gt $gte 以上四个分别表示为:< . <= . > . >= . 通常的做法是将他们组合起来,以便查找一个范围. 比如,查询年龄在18到25岁(含)的 ...
- Kettle循环删除数据
1.问题描述: 某个系统原库的数据同步到备份库.但是由于原库的的数据会物理删除,此时需要删除备份库的数据. 2.不理想的解决1: 1)首先从备份库获取该表的所有ID: 2)循环备份库的ID,去原库检测 ...
- 我的arcgis培训照片9
来自:http://www.cioiot.com/successview-547-1.html
- hadoop的linux配置
一.新建hadoop组跟用户(password:hadoop) [root@localhost home]# groupadd hadoop [root@localhost home]# userad ...
- vue全局注册与局部注册的写法
vue全局注册是每个实例化的vue都可以使用,而局部则是实例化注册的那个可以用.举个例子,看看写法: <div id="app"> <p>页面载入时,inp ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
- iOS中.pch文件怎样使用
pch 能够用来存储共享信息,比方设备屏幕的宽度,高度.版本等等 公用信息 Xcode 老版本号会自己主动为我们创建pch文件,新版本号開始不自己主动创建了.假设须要使用能够自己手动创建 waterm ...