реакция mobx на отфильтрованный список

#reactjs #react-native #mobx #mobx-react #mobx-state-tree

#reactjs #react-native #mobx #mobx-реагировать #mobx-state-tree

Вопрос:

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

Это мой код:

 const MyCustomModel = types
  .model({
    id: types.identifier,
    start: types.Date,
    end: types.Date,
  });

const MyStore = types
  .model({
    id: types.identifier,
    items: types.map(MyCustomModel),
  })
  .views(self => ({
    get itemsArray() {
      return Array.from(self.items.values());
    },
  }))
  .actions(self => {
    return {
      setListener(start: Date, end: Date) {
        myReactionDisposer = reaction(
          () =>
            self.itemsArray
              .filter(
                item =>
                  item.end.getTime() >= self.start.getTime() amp;amp;
                  item.start.getTime() <= self.end.getTime(),
              )
              .map(item=> item),
          () => {
            console.log('my reaction fires!');
            // other codes
          },
        );
      },
  });
  

Например, если я прослушиваю диапазон 2020-09-20 00:00:00 до 2020-09-21 00:00:00
и я добавляю новый элемент с начальным и конечным значением в другой день {start: '2020-09-15 10:00:00' , end: '2020-09-15 16:20:00'} , реакция срабатывает!

Комментарии:

1. Итак, в чем вопрос? Я не совсем понимаю. Вы не хотите запускать реакцию при добавлении нового элемента?

Ответ №1:

Реакция будет срабатывать каждый раз просто потому, что вы обращаетесь к каждому элементу в itemsArray (функция фильтра).

Но у вас есть выбор того, что вы возвращаете из него. Таким образом, вы можете вернуть пустой массив своему побочному эффекту, чтобы он знал, что он ничего не должен делать.

Ответ №2:

Это потому, что он всегда возвращает новый массив из функции data (благодаря urugator)
Мне нужно изменить equal функцию для моей реакции, и у меня это работает с мелким сравнением

 reaction(data,effect, { equals: comparer.shallow })