ReactJS -有一个“main”;组件不拥有它的子组件
ReactJS - Have a "main" component that doesn't own it's children?
我有一堆组件,不能有相同的父组件,但我希望他们共享他们的状态。
为了方便讨论,我们假设顶级组件称为Main
,子组件都称为Child1
, Child2
等。
我有Child1
和Child2
是Main
组件的孩子,只有在反应意义上-所以我可以通过Main
的属性和状态对他们从Main
组件?
从DOM的角度来看,Child1
和Child2
位于我的页面的完全不同的区域,实际上大约有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(你可以使用EventEmitter2,如果你不使用browserify/webpack)
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。
我的一个名为ItemRenderer的组件在挂载和每次更新时在DOM中的三个位置调用renderComponent(并且只将一个空div渲染到其实际容器中):
https://github.com/Khan/perseus/blob/a1811f6b7a/src/item-renderer.jsx L66-L130
这有点难以理解,因为组件不会去ItemRenderer的父组件告诉它们去的地方,但如果你需要的话,它可以工作。
- React重新渲染但未显示正确的组件
- 不能从angular2中的子组件指定父组件中的数组
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- React组件等待所需道具进行渲染
- 如何创建带有插槽的vue js组件预加载程序
- KnockoutJS-组件-多个实例
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在react js中将值从一个组件发送到另一个组件
- React Native通过Navigator将用户输入数据传递到选项卡栏IOS中的组件
- React组件-设置页面标题
- 我的shareService在angular 2中发送值工作正常,但当我渲染我的另一个组件时,会获得默认值
- 如何在salesforce aura闪电组件中使用jQuery.val()
- 为react组件传递道具的最佳方式
- [Vue warn]:未能解析组件
- AngularJS 2:如何拥有一个'属性'指令与其主机组件通信
- ReactJS -有一个“main”;组件不拥有它的子组件
- 如何在Vue JS 2中拥有间接的自嵌套组件
- 为了管理自己的mapDispatchToProps,子组件应该在什么级别上拥有自己的容器(逻辑反应-还原's连接
- 哪个组件应该拥有React中的服务
- 只有ReactOwner才能拥有refs.您可能正在向组件添加一个ref,而该ref不是在组件的render方法中创建的