У меня есть таблица с 500 строками таблицы. Каждая строка представляет собой отдельный компонент.
Исходные данные для таблицы - это простой массив объектов. Строки нужно перетаскивать, и каждый раз, когда я перетаскиваю другую строку, я изменяю исходные данные, сдвигая элемент внутри массива.
Данные неизменяемы, поэтому каждый раз я имею дело с новым массивом.
Проблема в том, что каждый раз, когда данные меняются, все 500 элементов повторно отображаются. Это немного неожиданное поведение, потому что ключи для большинства элементов остаются прежними, а React должен оптимизировать обновление.
shouldComponentUpdate
решает проблему, но я использую mobx, и он создает свою собственную реализацию sCU
, поэтому я не могу реализовать свой собственный sCU
, потому что он нарушает поток mobx.
У меня такое ощущение, что он должен работать правильно даже без sCU
.
<Table>
{data.map(item => {
<TableRow key={item[keyField]} item={item} {...props}/>
})}
</Table>
Есть какие-нибудь мысли об этом, ребята?
--- ОБНОВЛЕНИЕ ---
Оба компонента - наблюдатели. Я изменил свою структуру следующим образом:
// Table component @observer
@observable
data = []
componentWillReceiveProps(nextProps) {
this.data = [...nextProps.data]
}
@action.bound
onDrag() {
// drag handler here which mutates this.data
this.data.splice(...)
}
render() {
return this.data.map(item => (
<TableRow key={item[keyField]} item={item} {...props} onDrag={this.onDrag}/>
))
}
Но он дает точно такой же результат, 500 рендеров при перетаскивании