javascript - ReactJS - 有一个不拥有它的 child 的 "main"组件?

标签 javascript reactjs

我有一堆组件不能有相同的父组件,但我希望它们共享它们的状态。

为了便于讨论,假设顶层组件称为 Main,子组件称为 Child1Child2 等。

有什么方法可以让 Child1Child2 成为 Main 组件的子组件,仅在 React 意义上 - 所以我可以将 Main 的属性和状态从 Main 组件传递给它们吗?

从 DOM 的 Angular 来看,Child1Child2 位于我页面的完全不同的区域,实际上大约有 40 个。

最佳答案

您可以使用事件发射器,而不是直接调用 setState,所有实例都可以将负载应用到它们的状态。

我们可以使用 mixin 来抽象这种行为。

var makeChangeEventMixin = function(emitter){
   return {
       componentDidMount: function(){
           emitter.addListener('change', this.__makeChangeEventMixin_handler_);
       },
       componentWillUnmount: function(){
           emitter.removeListener('change', this.__makeChangeEventMixin_handler_);
       },
       __makeChangeEventMixin_handler_: function(payload){
           this.setState(payload);
       },
       emitStateChange: function(payload){
           emitter.emit('change', payload);
       }
   };
};

然后在我们的代码中我们将使用 EventEmitter(如果你不使用 browserify/webpack,你可以使用 EventEmitter2)

var EventEmitter = require('events').EventEmitter;
var fooEvents = new EventEmitter();

var Counter = React.createClass(){
    mixins: [makeChangeEventMixin(fooEvents)],
    getInitialState: function(){ return {count: 0} },
    render: function(){return <div onClick={this.handleClick}>{this.state.count}</div>},
    handleClick: function(){
        this.emitStateChange({count: this.state.count + 1});
    }
};

如果您有 100 个计数器,当您点击其中任何一个时,它们都会更新。


这样做的一个限制是初始状态是错误的。您可以通过跟踪 makeChangeEventMixin 中的状态、自行合并它并使用 replaceState 代替 setState 来解决此问题。这也会更高效。如果这样做,mixin 可以实现适当的 getInitialState。

关于javascript - ReactJS - 有一个不拥有它的 child 的 "main"组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25331732/

相关文章:

Javascript - 无法推送到内部对象

node.js - 为什么 req.body 为空 {} (GET REQUEST)

javascript - 如果字符串包含数值,则从字符串中删除整个单词

javascript - 如何在 OpenLayers 3 中插入​​半圆样式标记

javascript - 替换/限制 CKEDITOR 中的非标准字符

javascript - 从 highcharts 中的 svg 中删除内联样式

reactjs - 如何删除 react 应用程序并打开现有的应用程序

reactjs - 未捕获的不变违规 : ReactDOM. render():无效的组件元素

node.js - 添加图标到项目 Material 表错误

javascript - DatePicker react 是否将 "value"属性作为输入?