Слушатель не вызывает useEffect с массивом зависимостей - PullRequest
0 голосов
/ 30 января 2020

Целью здесь является изменение данных таблицы при изменении данных в Firebase

Проблема заключается в том, что по какой-то причине в рамках firebase listener setState(...) не вызывает useEffect(()=> {}, [...]) с соответствующими зависимостями.

Есть идеи почему и есть ли способ заставить изменения?

 const [actions, setActions] = useState([]);
 ....
 firebase.
    .firestore()
    .collection("collection_name")
    .onSnapshot(s => {
      if (!s.empty) {
        s.docChanges().forEach(change => {
          if (change.type === "modified") { 
            const newActions = [...actions, change.doc.data()]
            setActions(newActions) //The change 
            console.log("arrived here")
          }...

...

useEffect(() => {
  console.log("change in actions"); // Does not triggered on when modified
}, [actions]);

Это работает без массив зависимостей:

useEffect(() => {
  console.log("This does work")
});

1 Ответ

0 голосов
/ 30 января 2020

Я думаю, вы должны смотреть другие ваши ссылки.

Проблема с ловушкой реагирования состоит в том, что если ссылка на объект до и после установщика одинакова, прослушивание этого объекта useEffect не сработает.

Это означает, что если в newActions = ... Вы используете ссылку, ведущую к действиям, чтобы обновить значение действия, а затем setActions () ссылка на объект остается прежней, вместо этого вы должны попытаться сделать копию действий и затем изменить эту независимую копию. Затем вы можете установить setActions (ifiedCopy), и это, как правило, вызовет useEffect.

примечание: это только предположение, потому что я не могу знать, что вы поставили за newActions = ...

...