Строки перерисовываются, когда их данные были изменены. Поэтому я бы назвал редуктор toggleActiveStatus
.
. В полном примере мы можем найти JSON.parse(JSON.stringify(state.elements))
, это худший вариант для хранилища ngrx :), потому что это означает, что все в состоянии было изменено и в результате - все перерисовывается.
Вместо JSON
всегда обновляйте узел, который вы хотите изменить, и ничего больше. Это правило поможет вам доставлять хорошо работающие приложения.
Код ниже реализует это поведение.
const periodicElementsReducer = createReducer(
initialState,
on(toggleActiveStatus, (state, {id}) => {
return {
...state,
elements: state.elements.map(element => element.id !== id ? element : {
...element,
activate: !element.activate,
}),
};
})
);
Проблема с анимацией возникает из-за обновления таблицы. Мы нажимаем на переключатель, он запускает анимацию, таблица получает новые данные и повторно отображает переключатель с новым состоянием, которое убивает анимацию. Поэтому нам нужно отложить обновление магазина, лучше всего сделать это, например, в рассылке.
Исправление может быть таким
updateActiveStatus(element: PeriodicElement) {
setTimeout(() => this.store.dispatch(toggleActiveStatus({id: element.id})), 150);
}