【发布时间】:2017-05-29 07:21:03
【问题描述】:
相关问题here,但我不确定如何调整该问题的解决方案。
我正在尝试为带有标签的登录页面创建一个可重用的组件。每个选项卡都是可重用组件的子组件,并且有自己的 store 定义为 prop:
<LandingPage>
<LandingPage.Tab store={store1}/>
<LandingPage.Tab store={store2}/>
...
<LandingPage.Tab store={storeN}/>
</LandingPage>
我想在父组件挂载时从每个选项卡的存储中获取数据,以便在选项卡之间快速切换。在 componentDidMount 函数中,我遍历每个孩子并将孩子商店的 onChange 回调分配给一个匿名箭头函数:
var LandingPage = React.createClass({
getInitialState: function () {
return {
data: [] /* each index will be an array of data for a different tab */
};
},
componentDidMount: function () {
var self = this;
React.Children.forEach(this.props.children, function (child, index) {
child.props.store.onChange(() => {
self.setDataAtIndex(index, child.props.store.getData());
});
});
},
setDataAtIndex: function (index, newData) {
var data = this.state.data.slice();
data[index] = newData;
this.setState({
data: data
});
},
...
});
但是,当页面第一次加载时,我收到了来自 React 的警告消息:
警告:setState(...):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了 setState()。这是一个无操作。请检查 LandingPage 组件的代码。
我很困惑,因为我认为如果我在 componentDidMount 函数中,我可以假设组件已安装。当我刷新页面时,此警告消息就会消失。
有人可以解释这种行为并告诉我如何正确构造代码以消除警告消息吗?
【问题讨论】:
-
您链接到的相关问题的接受答案似乎直接适用于您的问题。 (自动绑定在这里并不真正相关——用户似乎也在使用
React.createClass,并且描述的问题是事件处理程序没有得到un绑定,因此@987654325 @在componentWillUnmount。) -
@Jordan:我已经从问题陈述中删除了自动绑定。我仍然不确定如何使用相关问题中的想法。你能详细说明答案吗?
标签: javascript reactjs redux flux arrow-functions