現在のアプリでは、body
およびheader
小道具を取るAppLayout
コンポーネントを各画面に実装しています。一般的な子ですが、ルートは異なります:子どもに再レンダリングや再マウントを避けることは可能ですか?
body
小道具はしばしば非常に異なっていますが、(かなり複雑な)header
は、さまざまな画面間で多くの繰り返し内容を持っています。時々、タイトルテキストだけが変化しています。
現在、あるルートから別のルートに移動すると、画面全体が再表示されます。これは、同様のコンテンツでは非常に無駄な操作です。 2つの画面間で共通のサブコンポーネントを再レンダリングして再マウントしないようにする方法はありますか?ルーティング設定
の
例は、これは多くは一見木々に繰り返される方法を示しています。
<Route
exact
path='/user'
component={()=> {
return (<AppLayout
header={<AppHeader heading="Users"/>}
main={<UserList/>} />);
} />
<Route
exact
path='/user/new'
component={()=>{
return (<AppLayout
header={<AppHeader heading="Create user"/>}
main={<UserAccountAdd />} />);
} />
<Route
exact
path='/user/:userId'
component={({ match }) =>
return (<AppLayout
header={<AppHeader heading="User profile"/>}
main={<UserAccountInfo userId={match.params.userId}/>}
/>)
} />
AppHeader
コンポーネントは、基本的には、基本的に私は、見出しのタイトルをレンダリングヘッダの<p>
タグが再マウントする必要があること見てきたいと思い
connected(div)
ReallyExpensiveFoo
ReallyExpensiveBar
<p>{this.props.title}</p>
のように見えます。
このアドバイスはあまりにも一般的です。基本的にレンダリングの最適化のみで、この場合は適用されません。また、機能コンポーネントに関してはちょっと間違っています。それらは常に再レンダリングされますが、これは通常かなり安いので、それほど重要ではありません。それは高価なDOMの仕事 - アンマウントとマウントです。それは私が避けたいものです。 – oligofren
しかし、回答を追加しているうちに再マウントする際に、いくつかの具体的な内容を追加しました。つまり、あなたを抱かせるのはちょっと不公平です:-) – oligofren
もっと具体的な回答をするには、アプリケーションの状態に関する深い知識が必要です。後ほど質問に追加されたあなたの例は、基本的にDOMノードの大部分をブラウザのDOMに保存したいことを示しています。これは 'style = {display: 'none'}'や、あなたの 'ReallyExpensive ...'コンポーネントのルートノードと同様のものを追加することで簡単に実現できます。この場合、DOM内に残りますが、表示されません。しかし、あなたの最初の質問は、一般的なアドバイスのための要求のように見えました。 – Flying