ファイルのリストをレンダリングする React コンポーネントがあります。リストが非常に長くなる場合があり、この場合、UI の観点からはページネーションが理想的ではないため、ファイルのリストは再レンダリング中 (たとえば、ファイルをドラッグ アンド ドロップして並べ替えるとき) に非常に遅くなります。
速度低下の原因の 1 つは、ファイルごとに 1 回実行されるループに、いくつかのbind()
呼び出しがあることです。
render() {
return (
<...>
{this.props.files.map((file, index) => {
return (
<tr
key={`${index}#${file.name}`}
onDragStart={this.onDragStart.bind(this, file, index)}
onDragEnter={this.onDragEnter.bind(this, file)}
onDragOver={this.onDragOver.bind(this, file)}
onDragLeave={this.onDragLeave.bind(this, file)}
onDrop={this.onDrop.bind(this, file, index)}
/>
);
})}
</...>
);
}
これらのバインドは、ドラッグ アンド ドロップ ハンドラーがどのファイルがドラッグされ、どこにドロップされているかを認識するために必要です。これらすべてのバインドが数百のファイルごとに 1 回実行されるため (結果の要素が最適化され、実際にはレンダリングされない場合でも)、処理が少し遅くなっても不思議ではありません。
各反復で各関数に一意のバインドを作成することなく、必要な反復ごとのデータをこれらの関数に渡すために、これを行うためのより良い方法があるかどうか疑問に思っています。
私自身の回答として投稿する解決策が 1 つありますが、この解決策が良いか悪いか、および欠点があるかどうかについてフィードバックをいただければ幸いです。