から水和物を使用することができます。私は大きなテーブル(5000行)をサーバー上でレンダリングしています。私はクライアントにデータを2回(HTMLとJSON形式で)送信したくありません。私はこの解決策/ハックを考え出しました。
テーブルの行をレンダリングする前に、コンポーネントはまずDOMをチェックして、同じIDのコンポーネント(プリレンダリングされたサーバー側が存在する場合)を確認し、存在する場合はHTMLを抽出し、直接dangerouslySetInnerHTML
を経由してください。
renderTable() {
debug('render table');
const id = 'table-body';
const html = this.getExistingHtml(id);
if (html) {
return <tbody id={ id } dangerouslySetInnerHTML={{ __html: html }} />;
}
return <tbody id={ id }>{ this.renderItems() }</tbody>;
}
getExistingHtml(id) {
if (typeof document === 'undefined') return;
const node = document.getElementById(id);
return node && node.innerHTML;
}
renderItems() {
debug('render items');
return this.props.items.map(({ name, url }) => {
return (
<tr>
<td>
<a href={ url }>
<div>{ name }</div>
</a>
</td>
</tr>
);
});
}
shouldComponentUpdate() {
return false;
}
私はまた、いずれかが最初のマウント後にレンダリングを防止するためにshouldComponentUpdate
でこれを結合しました。
あなたは、常にWINDOWが存在するかどうかを確認し、コンストラクタのbooleanとしてだけでなく、ライフサイクルメソッドの結果に基づいてコードを実行することができます。さらに、データがフェッチされたかどうかを確認することができます.... –
返事をありがとう、しかし、私はあなたの文を取得していないよ "WINDOWが存在するかどうかを常に確認し、コンストラクタのブーリアンの結果に基づいてコードを実行する"これをどうやってやり遂げることができますか? おかげ –
確かに、あなたはサーバーにしているので、もしブラウザウィンドウが使用できなくなりますが、あなたは、クライアント側にしている場合は、ブラウザのウィンドウが利用できるようになります。それが定義されているかどうかを知っている - あなたはあなたのサーバーまたはクライアント側であなたが知っている。これを知っていると、コンポーネントにレンダリングするかどうかを伝えることができます。 if(typeof window == "undefined"){ falseを返します。 } –