#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 })