NGRX Angular - Избегайте перезагрузки компонента при редактировании состояния

У меня проблема с компонентом. Я управляю приложением со списком задач. У меня есть наблюдаемый массив, который я использую в оболочке с асинхронным конвейером, и дочерний компонент «компонент Todo», который в качестве входных данных называется «Todo», и атрибут «showDetails», который является логическим значением, используемым для переключения пользовательского интерфейса и инициализируемым как false. Это структура:

<div *ngFor = "let todo of todo$">
  <app-todo [todo] = "todo"></app-todo>
</div>

Внутри шаблона todo-component у меня есть кнопка, с помощью которой я переключаю логическое значение. Также есть функция «toggle», которая отправляет действие, обновляющее состояние ngrx задачи. Когда я отправляю действие, и редуктор обновляет состояние, компонент полностью перезагружается, а также, если для параметра showDetails установлено значение true, он возвращается в значение false, поскольку компонент перезагружается.

Это функция редуктора, которая обновляет состояние

  on(Toggle, (state, action) =>
        state.map(i => (i.id === action.id ? { ...i, todo: !i.todo } : i))
  )
           

Это пример на stackblitz: Демо

Я бы хотел, чтобы мое значение showDetails оставалось таким же и с изменением состояния ...

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
25
1

Ответы 1

причина в том, что вы не предоставляете функцию trackBy для ngFor. И, как результат, каждый раз, когда массив обновляется, ngFor создает новые представления и уничтожает старые. чтобы исправить это, предоставив trackByFn, чтобы ngFor знал, какой элемент обновляется.

// app.component.ts
trackById(idx, {id}) {
  return id;
} 
<div *ngFor = "let todo of todos$ | async; trackBy: trackById" ...

Другие вопросы по теме