通过事件通知 实现react.js组件间通信
2023-09-27 14:28:55 时间
react.js对于父子组件之间的通信还是比较简单的。但是对于两个组件之间的通信就很操蛋了。
另一个问题就是对于其它js框架的联动也会遇到这类的问题。
在官方给出的方案是:
对于没有 父-子 关系的组件间的通信,你可以设置你自己的全局事件系统。 在 componentDidMount() 里订阅事件,在 componentWillUnmount() 里退订,然后在事件回调里调用 setState()。
我当时的表情是:
呵呵
做一个全局事件系统
既然人家说没辙,那就做呗。
事件系统的核心也就是订阅-通知,其实对于javascript来说,挺好实现的。
话不多说,直接看代码:
Commons.EventDriver = (function(){ var regtable = {}; this.register = function(event,callback){ var reciverlist = regtable[event]||[]; reciverlist.push(callback); regtable[event] = reciverlist; }; this.unregister = function(event,callback){ var reciverlist = regtable[event]||[]; var mark = -1; for(var i=0;i<reciverlist;i++){ if(reciverlist[i]==callback){ mark = i; break; } } if(mark!=-1){ reciverlist.splice(mark,1); } }; this.send = function(event,props){ var reciverlist = regtable[event]; console.log("call this"); if(reciverlist){ for(var i=0;i<reciverlist.length;i++){ reciverlist[i](props); } } }; return this; }());
代码很简单,三个方法:注册,注销,发送。
通过一个全局的事件管理对象,以事件名称作为key,在此注册一个回调函数,当发送事件时,依次触发所有已注册的回调函数。为了方便参数传递,还附带了一个Prop对象保存参数。
注册如下:
Commons.EventDriver.register("updateUserInfo",this.reload);
通知如下:
Commons.EventDriver.send("updateUserInfo");
总结
其实呢,这一套东西不仅是实现react.js的组件间通信,更能达到事件驱动执行的效果。当然现在的功能还十分简陋,但是核心的思想是木有问题的。
最后呢,其实用来做组组件间通信的时候还真不多,更多的被我拿来在页面上通过js调用组件内方法了。
作者:Ay叔
链接:http://www.jianshu.com/p/600e82dd15d9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章
- js获取网页屏幕可视区域高度
- js多个<ul>相应不同的点击事件
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
- 浅谈JS中的!=、== 、!==、===的用法和区别
- JS 时间运算大全
- js 去掉前后空格
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
- js实例分析JavaScript中的事件委托和事件绑定
- JS——BOM概述、window常见事件、定时器、JS执行机制
- JS事件模型小结
- JS 日期 自动补齐 “2017-11-22 14:43”
- Js判断对象是否为空,Js判断字符串是否为空
- JS 禁用和重新启用a标签的点击事件
- js实现默认或者触发一个事件选中元素内容的方法
- JS里关于事件的常被考察的知识点:事件派发、事件流、事件广播、原生JS实现事件代理
- js如何给ul的所有的li绑定事件,打印他们的索引
- JS学习第9天——ES6中面向对象(类class、constructor构造函数、类的继承extends、super关键字、面向对象tab栏切换案例)
- JS学习第4天——Web API之DOM(事件高级)【注册/删除事件、DOM事件流、阻止事件冒泡、事件委托、常用的鼠标/键盘事件】
- js判断手指的上滑,下滑,左滑,右滑,事件监听
- JQuery/JS插件 jstree 添加点击事件
- Three.js Example 注解 —— canvas_geometry_cube.html
- Node.js 在命令行下执行Console.log()命令时,第二行会打印undefined的原因