У меня есть компонент React, который отображает список файлов.Иногда список довольно длинный, и поскольку разбиение на страницы не является идеальным с точки зрения пользовательского интерфейса, в этом случае список файлов становится довольно медленным во время повторного рендеринга (например, при перетаскивании файлов для изменения их порядка).
Одной из причин, влияющих на медлительность, является то, что в цикле, который запускается один раз для каждого файла, есть несколько вызовов 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)}
/>
);
})}
</...>
);
}
Эти привязки необходимы, поэтому обработчики перетаскивания и отбрасываниязнать, какой файл перетаскивается и куда он сбрасывается.Поскольку все эти привязки выполняются один раз для каждого из сотен файлов (даже если результирующие элементы оптимизированы и никогда не будут визуализированы), я не удивлюсь, что все немного вяло.
ЯИнтересно, есть ли лучший способ сделать это, чтобы как-то передать необходимые данные для каждой итерации этим функциям, не создавая уникальную привязку для каждой функции в каждой итерации.
У меня есть одно возможное решение, которое ябудет публиковаться как мой собственный ответ, однако я был бы признателен за отзыв о том, является ли это решение лучше или хуже, и есть ли у него недостатки.