componentWillMount()和componentDidMount()只会执行一次!
(根据 React 组件生命周期https://facebook.github.io/react/docs/react-component.html#the-component-lifecycle)
如果您希望每次孙module更新时都更新您的module,您需要在您的module中创建一个函数,并将其作为props传递给子module和孙module(在主module的渲染方法中)
该函数(updateThisModule)和您的渲染方法将如下所示:
以下编辑版本:(这只是关于如何从多级子组件触发父组件上的回调函数的演示,我们实际上可以在该回调中执行任何操作)
import React from 'react';
class Module extends React.Component {
constructor(props) {
super(props);
// ...
}
updateThisModule = () => {
// We can do whatever we want here, either forceUpdate the component
// or setState, which will also trigger this component to update itself
// (using setState is more natural, though)
// *** OPTION 1
// this.forceUpdate();
// *** OPTION 2
// this.setState({
// someState: 'someValue',
// ..
// });
// *** ...
// ...
}
render(){
// ...
<ChildModule updateParent={this.updateThisModule} />
// ...
}
}
同样,在子module的 render 方法中做同样的事情(将该函数向下传递 1 级到孙module):
class ChildModule extends React.Component {
...
render(){
// ...
<GrandChildModule updateGrandParent={this.props.updateParent} />
// ...
}
}
之后,在 Grand-Child-Module 中,我们需要一个触发器来调用顶层 Module 进行更新,建议您在 componentDidUpdate() 函数中触发它。然后,Grand-Child-Module 可能如下所示:
class GrandChildModule extends React.Component {
constructor(props) {
super(props);
// ...
}
componentDidUpdate() {
// this will be executed every time this grand-child-module updates itself
// we will then trigger the update function upward to the parent's level first, then the grand-parent's level (which is your main Module)
this.props.updateGrandParent();
}
render(){
// ...
}
}
上面的代码是用ES6写的,如果你用不同的方式写你的,请随时在这里发布,然后我们可以一起修改你的代码让它工作!
PS:将函数作为props传递给子组件也是纯 React 组件的主要思想。但是,如果您的module层次结构太深(有很多子、孙、曾孙等),您可以考虑使用 Flux 或 Redux