Reactjs 组件之间的通信
Communication between Reactjs Components
在与Redux,flux和其他pub/sub方法进行了太多斗争之后,我最终采用了以下技术。我不知道这是否会造成一些大的损害或缺陷,所以把它贴在这里,从有经验的程序员那里了解它的优缺点。
var thisManager = function(){
var _Manager = [];
return{
getThis : function(key){
return _Manager[key];
},
setThis : function(obj){
_Manager[obj.key] = obj.value;
}
}
};
var _thisManager = new thisManager();
// React Component
class Header extends Component{
constructor(){
super();
_thisManager.setThis({ key: "Header", value:this}
}
someFunction(data){
// call this.setState here with new data.
}
render(){
return <div />
}
}
// Then from any other component living far somewhere you can pass the data to the render function and it works out of the box.
i.e.
class Footer extends Component{
_click(e){
let Header = _thisManager.getThis('Header');
Header.somefunction(" Wow some new data from footer event ");
}
render(){
return(
<div>
<button onClick={this._click.bind(this)}> send data to header and call its render </button>
</div>
);
}
}
我在我的应用程序中将 json 作为数据发送,它完美地渲染了所需的组件,我可以调用渲染,而无需任何发布/订阅或深层传递 props 来调用带有更改 this.setState 的父方法以导致重新渲染。
到目前为止,该应用程序运行良好,我也喜欢它的简单性。请阐明这种技术的优缺点
问候
编辑:
调用 render 很糟糕,所以我将其更改为另一种方法以获得此设置的更多优缺点。
此设置的两个主要问题:
1. 永远不要直接
调用 react 生命周期方法 2. 组件的后门是一个坏主意,这会破坏 react 的可维护性
广告 1:如果你直接调用render()
(或任何其他 react 方法),react 可能不会调用组件树中的 componentDidMount()
、componentDidUpdate()' 和其他生命周期方法。
危险是:
- 许多带有反应组件的设计严重依赖于所触发的生命周期方法:
getInitialState()
、componentWillReceiveProps()
、shouldComponentUpdate()
、componentDidMount()
等。如果您直接呼叫render()
,许多组件可能会损坏或显示奇怪的行为。 - 你冒着破坏 react 差异引擎的风险:通过生命周期管理,react 在其(内部)内存中保留了 DOM 的虚拟副本。为了正常工作,此副本的完整性对于 React 的工作至关重要。
更好的是(但仍然违反了我的第二点):
- 在组件中包含不同的方法。
- 如果要重新渲染,则
setState()
。 - 并从外部调用该方法。
广告 2.直接引用已挂载的组件(如 thisManager 所做的)有一些额外的风险。React 的设计和限制是有原因的:用 props 和状态维护单向流和组件层次结构,使事情易于维护。
如果你打破了这种模式——通过在允许操纵状态的组件中构建一个后门——你就打破了反应的这个设计原则。这是一个快速的快捷方式,但当你的应用增长时,肯定会造成巨大的痛苦和沮丧。
据我所知,此规则唯一可接受的例外情况是:
- 组件内响应 ajax 调用结果的方法,用于更新状态(例如,从服务器获取数据后) 组件
- 内用于处理来自其直接后代子组件的触发器的方法(例如,在单击子按钮后对表单运行验证)
因此,如果您想将其用于该目的,那么您应该没问题。警告:标准 react 方法保护对组件的随机访问,因为调用组件或方法需要对组件的引用。在这两个示例中,都可以使用此类参考。
在您的设置中,任何外部代码段都可以查找表中"标头"的引用,并调用更新状态的方法。有了这种间接引用,并且无法知道哪个源实际调用了您的组件,您的代码可能会变得更加难以调试/维护。
- firefox插件和dev/panel之间的通信
- 如何在两个不同的iframe HTML之间进行通信
- Angularjs事件与发布/订阅指令之间的通信
- Firefox插件SDK:在侧边栏和主脚本之间通信对象
- Ember.js:接受的子组件和父组件之间通信的最佳实践
- 如何在Windows Phone 8.1应用程序中在C#和Javascript之间传递数据或通信
- 如何在Famo.us中的两个视图(不同的js文件)之间进行通信
- 在Jquery或Javascript中获取两个范围或日期之间的通信周数
- 如何在同源选项卡之间建立通信
- 如何在 PHP 和 JS 中的并发会话之间进行通信
- 如何在两个动画画布元素之间进行通信
- 在 HTML5 和 C# Web 套接字通信之间
- angularjs 中控制器和指令之间的通信
- 歌剧扩展脚本和它们之间的通信
- 如何使用js在两个aspx页面之间进行通信
- 多个应用程序之间的通信
- Chrome扩展:内容脚本和background.html之间的通信
- 如何在同一页面上的Angular应用程序和非Angular应用软件之间进行通信
- 反应.js:同一父母的两个孩子之间的通信
- 我的Javascript和PHP通信之间有什么问题,用于上传图像