我有一个呈现文件列表的 React 组件。有时列表很长,并且在这种情况下,从 UI 角度来看,分页并不理想,因此文件列表在重新渲染期间变得非常慢(例如,在拖放文件以重新排序时)。
导致缓慢的一件事是,在为每个文件运行一次的循环中,有一些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)}
/>
);
})}
</...>
);
}
这些绑定是必要的,因此拖放处理程序知道正在拖动哪个文件以及将其放置在哪里。由于所有这些绑定为数百个文件中的每一个运行一次(即使结果元素被优化并且从未真正被渲染),我想事情有点缓慢也就不足为奇了。
我想知道是否有更好的方法来做到这一点,以某种方式将必要的每次迭代数据传递给这些函数,而不必在每次迭代中为每个函数创建唯一的绑定。
我有一个可能的解决方案,我将把它作为我自己的答案发布,但是我希望得到反馈,了解这个解决方案是更好还是更差,以及它是否有任何缺点。