vue任意关系组件通信与跨组件监听状态vue-communication


Posted in Javascript onOctober 18, 2020

众所周知,组件式开发方式给我们带来了方便,不过也引入了新的问题,组件之间的数据就像被一道无形的墙隔开,如果我们希望临时让两个组件直接通信,vuex 太巨,而 $emit 又不好维护 provider 不可控 这个时候就该今天的主角 vue-communication 登场了!

vue-communication介绍

  • 他是一个可观测可调试的vue组件通信方案
  • 任意关系组件可直接通信
  • 支持跨组件监听数据变化
  • 支持发送离线数据

安装

yarn add vue-communication
// 或者 npm install vue-communication -D

引入

import { $sender, $receiver } "vue-communication";
Vue.prototype.$sender = $sender;
Vue.prototype.$receiver = $receiver;

视频教程

<iframe src="//player.bilibili.com/player.html?bvid=BV1sD4y1d7mD&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" style="min-height: 400px"> </iframe>

用法

基本概念:

该组件暴露两个主要 API 一个是发送者 $sender 一个是接受者 $receiver ,所有的通信都通过这两个方法来实现,这里希望大家将 $sender 理解成发送意图的发送者,他发送的是意图,意图就是希望做一件什么事情。

意图类型: dataOnce modifyOnce data modify watch

目前只有以上5种意图分别涵盖了:发送数据的一次和多次,修改数据的一次和多次,跨组件监听数据变化

发送数据:

假如 A 组件只向 B 组件发送 一次 数据:

A 组件中直接使用 this.$sender("dataOnce-A-B",{d: "我是数据"})

B 组件中在任意时刻(哪怕B都还没挂载都行,放心食用)使用 this.$receiver("dataOnce-A-B") 这个函数返回一个 Promise 对象,直接 .then 接收即可

发送多次就用 this.$sender("data-A-B","我是数据") ,该方法调用多次,对应组件就会多次接收该数据

接收会有变化,由于会多次接收所以无法使用 Promise 来实现,请在参数追加回调 this.$receiver("data-A-B",function(data){ // data就是数据 })

注意:

这里面的 意图修饰符-组件1-组件2 的格式是强制的,不管你的组件名有多长,你都要完整的给出!下面的修改数据也一样,对应到 data-A-B 这个案例,其整个字符串可以称为一个“意图”,data 叫做意图修饰符。

接收回执:

我相信大家都明白一个道理,如果委托 A 给 B 送东西,在 A 送到之后不应该默不吭声的就完了,而是应该告诉你一声,嘿!你让我送的东西我已经送到了哦!这就是回执。

需要注意的是回执目前只有在一次性操作中才会有,例如 dataOnce modifyOnce

他们通过 $sender 返回的 Promise 对象给出,让发送者可以知道,我发送的数据什么时候被接收了

this.$sender("dataOnce-A-B","木瓜太香")
.then(flag => {
  console.log("接受者已经接受到数据了!")
})

修改数据:

A 组件中使用 this.$sender("modifyOnce-A-B","name","木瓜太香") 表示 A 组件要修改 B 组件中的 name 属性把他变为 木瓜太香

B组件中使用 this.$receiver("modifyOnce-A-B","name") 即可完成修改, 注意第二个参数必须传,这是一个许可,表示你认可 A 组件修改当前组件的 name 属性,如果你写错了或者没传那么许可不成立,这是一个让数据变动可预测也强迫开发者需要更清楚自己在做什么的一个实现。

如果你要改 obj 对象下的 name 那么可以写成 this.$sender("modifyOnce-A-B","obj.name","木瓜太香")

如果你要修改多次可以参照 data 意图的示例,使用 modify 意图修饰符即可,注意,目前修改是没有回调的,如果你想知道数据什么时候被修改,可以自己在组件内部监听。

跨组件监听数据:

假如 A 组件要监听 B 组件中的 name 数据变动:

A 组件使用 this.$sender("watch-A-B","person.name",function(nv,ov){ // nv 表示新值 ov 表示旧值 })

B 组件只需要给出一次许可即可: this.$receiver("watch-A-B","person.name")

到此这篇关于vue任意关系组件通信与跨组件监听状态vue-communication的文章就介绍到这了,更多相关vue 任意关系组件通信与跨组件监听状态内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
node.js中的http.createClient方法使用说明
Dec 15 Javascript
纯javascript实现简单下拉刷新功能
Mar 13 Javascript
深入探究AngularJS框架中Scope对象的超级教程
Jan 04 Javascript
JS组件Bootstrap实现图片轮播效果
May 16 Javascript
javascript实现一个网页加载进度loading
Jan 04 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 Javascript
Three.js实现简单3D房间布局
Dec 30 Javascript
jQuery实现表格的增、删、改操作示例
Jan 27 jQuery
JS学习笔记之闭包小案例分析
May 29 Javascript
js实现select下拉框选择
Jan 11 Javascript
微信小程序用户登录和登录态维护的实现
Dec 10 Javascript
关于Js中new操作符的作用详解
Feb 21 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 #Javascript
详解VUE中的插值( Interpolation)语法
Oct 18 #Javascript
vue自定义树状结构图的实现方法
Oct 18 #Javascript
axios封装与传参示例详解
Oct 18 #Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 #Javascript
js中复选框的取值及赋值示例详解
Oct 18 #Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
Oct 18 #Javascript
You might like
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
JQuery实现鼠标滑过显示导航下拉列表
2013/09/12 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
JS二分查找算法详解
2017/11/01 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
python实现同时给多个变量赋值的方法
2015/04/30 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python中的默认参数详解
2015/06/24 Python
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
SCHIESSER荷兰官方网站:德国内衣专家
2020/10/09 全球购物
中科软测试工程师面试题
2012/06/16 面试题
商场中秋节广播稿
2014/01/17 职场文书
高校教师自荐信范文
2014/03/13 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
Python实现制作销售数据可视化看板详解
2021/11/27 Python
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL