Можно ли оптимизировать избыточные визуализации при изменении атомарного состояния?

#reactjs #redux #redux-toolkit

Вопрос:

Я работаю над сложным react / redux / @reduxjs/toolkit приложением, в котором много вложенных (друг на друга) функциональных компонентов реакции (я использую крючки, и я новичок в redux)

Я заметил чрезмерное количество рендеринга этих вложенных компонентов для наименьшего/атомарного обновления данных. В качестве примера у меня есть сетка , внутри которой много столбцов и строк. Сеточная модель (данные) представляет собой своего рода массив каждой из ее строк :

 [
 {rowId:'001', values:{col1Id:val1, col2Id:val2, col3Id:val3}},
 {rowId:'002', values:{col1Id:val4, col2Id:val5, col3Id:val6}}
]
 

Когда я обновляю одно из значений ячейки сетки, весь компонент сетки отображается много раз, как следствие! Сетка, которую я использую, является сторонним компонентом, который нуждается в большей стабильности там, где он используется. Сейчас у меня возникают некоторые функциональные проблемы из-за этих многочисленных визуализаций.

Чтобы попытаться лучше понять поведение redux, я создал этот codesandbox (который основан на примере задачи @reduxjs/toolkit).

Когда редактируется метка задачи , я также заметил, что TodoList она также отображается целиком (см. Журналы на консоли, как на этом скриншоте).

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

Я хочу знать , почему вместо этого отображается не только соответствующий компонент (если будет работать только сетка, а не кто-либо из ее предков memo ). Если изменяется только значение ячейки , почему, по крайней мере, отображается только компонент сетки и ничего больше?! Есть ли способ оптимизировать эти визуализации ?

Ответ №1:

Да, путем хранения массива идентификаторов (необходимых для рендеринга TodoList ) и фактических значений (необходимых для ListItem s) отдельно.

В главе учебника «Производительность и нормализация данных» подробно рассматривается эта тема.