React アプリのルート コンポーネントには、次のようなものがあります。
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 コンポーネントの render 関数だけが再度呼び出されることです。最近、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) 内のコンポーネントに props を渡そうとしています。これを行うには、ホームページを作成する関数を提供します。これは、レンダリングのたびにホームページを再作成する可能性があります。
問題は、ルート内のすべてのレンダリングでページを再作成せずに小道具を渡す方法ですか?