В моем проекте React у меня есть состояние Redux, которое имеет такую форму:
{
items: [{ ... }, { ... }, { ... }, ...]
form: {
searchField: '',
filter1: '',
filter2: '',
}
}
На одной странице есть компонент формы и компонент списка элементов. Я использую Immutable.js, поэтому каждый раз при обновлении поля формы создается новый массив items
. Поскольку ссылка на массив теперь отличается, это приводит к повторному отображению списка элементов, даже если данные в массиве совпадают.
В моем компоненте списка я использую componentDidUpdate
, чтобы поддерживать изменения в состоянии журнала, чтобы подтвердить, что обновленный массив вызывает повторную визуализацию:
componentDidUpdate(prevProps) {
Object.keys(prevProps).forEach((key) => {
if (prevProps[key] !== this.props[key]) {
console.log('changed prop:', key, 'from', this.props[key], 'to', prevProps[key]);
}
});
}
Массивы from
и to
, которые регистрируются, содержат все те же самые данные.
Как я могу предотвратить эти ненужные повторные рендеры?
Единственное, о чем я могу думать, это то, что в shouldComponentUpdate
компонента списка, переберите массив и сравните идентификаторы элементов с nextProps
. Однако это кажется неэффективным.
Вот мой редуктор
import Immutable from 'immutable';
import { types } from '../actions';
const initialState = {
items: []
form: {
searchField: '',
filter1: '',
filter2: '',
}
}
export default function reducer(_state = initialState, action) {
const state = Immutable.fromJS(_state);
switch (action.type) {
case types.HANDLE_FORM_CHANGE:
return state.setIn(['form', action.field], action.value).toJS();
default:
return _state;
}
}