Производительность ListView в приложении React Native + Redux

у меня естьListView, что, очевидно, отображает список некоторых предметов. Раньше я использовал React Native без Redux, поэтому, когда мои базовые данные изменились, я звонилsetState(), изменив данные, затемdataSource = dataSource.cloneWithRows(itemsData);и это было довольно производительно: каждая строка была перерисована, если изменились только ее данные (т.е. если мойrowHasChanged() возвращенныйtrue для этого ряда).

Но общий дизайн приложения был довольно временным и не очень хорошо обслуживаемым, поэтому я решил попробовать Redux.

Теперь моя сцена «чиста», то есть зависит только от пропущенных реквизитов, которые генерируются с помощьюmapStateToProps(), Но проблема в том, что всякий раз, когда какой-либо элемент изменяется, весьListView элемент воссоздан, следовательно, все элементы перерисованы (мойrowHasChanged() даже не называется). Это довольно неприятно, поскольку единственный способ избавиться от этого поведения - снова сделать сцену не чистой: добавить состояние и каким-то образом обновить его при необходимости.

Или каковы другие альтернативы?

Ответы на вопрос(1)

выполнив собственную регистрациюshouldComponentUpdate, Кроме того, чтобы ускорить сравнение, сделав только поверхностное сравнение, попробуйте сделать ваши данные неизменяемыми с помощью такой библиотеки, какImmutable.js.

Вот пример использования ListView.DataSource и неизменного набора данных, взятых изЭта статья:

// Use immutable.is() to achieve efficient change detection.
const ds = new ListView.DataSource({
    rowHasChanged: (r1, r2) => !immutable.is(r1, r2)
})
// Shallow convert to a JS array, leaving immutable row data.
this.state = {
    dataSource: ds.cloneWithRows(countries.toArray())
}

Вredux, при подключении вашего компонента, обязательно используйтеmapStateToProps() фильтровать ваши данные. Используя эту технику и передавая только соответствующий реквизит, вам, вероятно, даже не придется использоватьshouldComponentUpdate.

 Yaron Levi07 сент. 2016 г., 23:16
@Dmitry Frank Вам помог этот ответ?

Ваш ответ на вопрос