gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:14:35 25 4
gpt4 key购买 nike

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

为了便于讨论,假设顶层组件称为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com