组件通信

几乎所有的mvvm框架中都要涉及组件通信的功能(吐槽一下knockout,毕竟是鼻祖就先不说它了)。而且目前的前端形式来看,组件化是一个项目的基础。所以选好一个合适的框架后,随着组件的不断增加,业务的复杂度提升,组件之间的通信变得尤为重要。
实践方法
由于更换新的框架,我们的项目由Avalon更新成Vue.但是为了兼容以前的业务代码,不能直接使用vue的标准实践方式,我还是拿过来后封装了一个vue的class,具体业务里面不影响使用,封装的过程之后写出来再聊吧,下面来总结一下最近用到的通信实践方法。
1.父组件是通过props传递数据给子组件
vmodel 中包含了两个子组件
<div class="w-base"> <book-component v-bind:bookdata="book"></book-component> </div> <div class="base"> <node-component v-bind:catalog="catalog" ></node-component> </div>
在上面这段代码中我们可以看到,定义了两个子组件,并且使用指定v-bind指令传递了数据,子组件会接收到传递的数据。
Vue.component('book-component', {
template: tpl,//可以传进来子组件的模板文件
props: ['book'],
data: function () {
return { myBook: this.bookdata }
}
})
建议接收到单向的props数据后,定义一个局部变量来初始化使用。
2.父组件与子组件之间通信的其他方式
vue中给实例提供了三个我们可用的API $children 和 $refs 以及 $parent 。
$children :当前实例的直接子组件。需要注意 $children 并不保证顺序,也不是响应式的。
$refs :包含了当前实例所有拥有 ref 注册的子组件的对象.
$parent : 当前实例的父实例。
所以说,如果在通信方面我们我组件想要调用子组件,能用的方法只有 $refs 了,因为 $children 是一个数组,并且不保证顺序,也没有相关的id去寻找我们需要的那个特定子组件。但是如果使用 $refs 去寻找特定子组件,那就必须要给那个子组件注册 ref 。
父组件的模版
<!-- vm.$refs.child will be the child comp instance --> <child-component ref="child"></child-comp>
父组件
//找到子组件并且调用它的方法 var myChild = this.$refs.child; mymyChild.func();
子组件
//找到父组件并且调用它的方法 var myParent = this.$parent; mymyChild.func();
3.平行组件之间的两种通信方式
a.官方提供的事件bus
var bus = new Vue()
// 触发组件 A 中的事件
bus.$emit('id-selected', 1)
// 在组件 B 创建的钩子中监听事件
bus.$on('id-selected', function (id) {
// ...
})
b.通过父组件去找兄弟组件
//找到父组件的$refs对象,然后找到组件的兄弟组件
var $refs = this.$parent?this.$parent.$refs:{};
var childComponent = $refs.child; //child为改组件的ref属性值
其实以上两种方法最好的实践方式是封装到项目的基类中,这样不用每次都去定义一个空Vue()实例,而是每个实例的基类中都有这个事件bus。同样可以封装找到其他兄弟组件的方法,但是该兄弟组件必须注册ref
下面这个方法是我在项目中封装的用于找到父组件,然后再去找到兄弟组件的方法。
//平行组件之间的通信
getComponentByRef: function(refId) {
var $refs = this.$parent?this.$parent.$refs:{};
for (var $id in $refs) {
if ($id == refId) {
return $refs[$id];
}
}
return null;
}
使用
//在组件中直接使用
this.getComponentByRef("booknode").updateNode(this.node);
4.组件间复杂数据通信Vuex
一说到vuex,很多刚开始接触vue的人会主动避免去使用它,其实它并没有想象中的那么复杂。最好的开始是引入vuex后,走一遍给出的小示例。但是如果你的项目并不复杂的话,可以不考虑状态管理,那么什么时候需要使用状态管理呢?
我们来看这样一个布局
如果component1中的某个数据变更,那么com2,com3也要跟着更新,此时com3中又细分为了三个小组件。
问题:
那这样的情况时,我们可以考虑使用状态管理。下一篇文章将详细讲解关于vuex的实践和理解。
写在最后的总结
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vue
# 组件通信
# Vue组件通信实践
# Vuejs第十篇之vuejs父子组件通信
# 深入探讨Vue.js组件和组件通信
# vue2.0父子组件及非父子组件之间的通信方法
# 详解vue2.0组件通信各种情况总结与实例分析
# Vue2.x中的父子组件相互通信的实现方法
# Vue 父子组件、组件间通信
# vue组件间通信解析
# 详解Vue组件之间的数据通信实例
# 详解vue组件通信的三种方式
# 是一个
# 最好的
# 两种
# 类中
# 都有
# 我在
# 包含了
# 都要
# 那就
# 多个
# 也要
# 什么时候
# 说到
# 这段
# 一遍
# 我们可以
# 去找
# 下一
# 数据通信
# 这样一个
相关文章:
创业网站制作流程,创业网站可靠吗?
如何用景安虚拟主机手机版绑定域名建站?
,巨量百应是干嘛的?
高端建站三要素:定制模板、企业官网与响应式设计优化
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何制作网站标识牌,动态网站如何制作(教程)?
常州企业网站制作公司,全国继续教育网怎么登录?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何选择高效便捷的WAP商城建站系统?
电商网站制作公司有哪些,1688网是什么意思?
如何快速配置高效服务器建站软件?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何快速搭建FTP站点实现文件共享?
SQL查询语句优化的实用方法总结
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在景安云服务器上绑定域名并配置虚拟主机?
建站之星3.0如何解决常见操作问题?
,购物网站怎么盈利呢?
建站之星伪静态规则如何设置?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何在Windows服务器上快速搭建网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何在Windows环境下新建FTP站点并设置权限?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
南京网站制作费用,南京远驱官方网站?
如何选择最佳自助建站系统?快速指南解析优劣
制作网站的公司有哪些,做一个公司网站要多少钱?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
建站主机默认首页配置指南:核心功能与访问路径优化
建站之星下载版如何获取与安装?
魔方云NAT建站如何实现端口转发?
建站之星后台密码遗忘如何找回?
建站之星免费版是否永久可用?
如何通过老薛主机一键快速建站?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
无锡营销型网站制作公司,无锡网选车牌流程?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
如何通过VPS建站无需域名直接访问?
如何通过.red域名打造高辨识度品牌网站?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
Swift开发中switch语句值绑定模式
建站主机解析:虚拟主机配置与服务器选择指南
网站app免费制作软件,能免费看各大网站视频的手机app?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。