在我的 React App 的根组件中,我有这个:
class App extends Component {
...
ComponentDidMount() {
window.addEventListener('resize', this.handleResize, false);
}
handleResize{
this.parentSize = {height: window.innerWidht - this.node.offsetLeft ..., width: ...};
this.forceUpdate();
}
render() {
<div ref="e=>this.node=e}>
<ChildComponent parentSize={this.ParentSize} />
</div>
}
}
我注意到当 App 组件通过 setState 或 forceUpdate() 重新渲染时,子组件实际上被重新安装(因此每次更新都会调用 componentWillUnmount、componentWillMount、componentDidMount)。我期望的行为是再次调用 Child 组件的渲染函数。我最近升级到 React-router 4.x,所以我不确定它是否与此有关。
有人可以告诉我这是否是设计使然吗?当我尝试在其中获取数据时,多次调用我的 componentDidMount 会导致一些问题,并且我不想在调整大小期间多次执行该昂贵的操作。
更新:
我找到了这个问题的可能原因。我有多个嵌套组件,由于很难发布整个项目,因此有时很难发布导致问题的实际代码。但我认为就是这样:
return (
<div className="app-view" style={style} ref={el=>this.node=el}>
<Switch>
<Route exact path='/' component={() => <Home store={store} />} />
<Route path='*' component={Error404} />
</Switch>
</div>
);
在这里,我试图将道具传递给路由中的组件(React-router 4.x),我通过提供一个创建主页的函数来做到这一点,该函数可能在每次渲染时重新创建主页。
所以问题就变成了,如何在路由内的每次渲染时不重新创建页面的情况下传递道具?