Ошибка типа: неопределенный не является объектом (вычисление ‘serviceObj.reduce’)

#javascript #react-native #react-hooks

#javascript #реагировать -родной #реагирующие крючки

Вопрос:

У меня проблема при использовании useState с reducer.

Я знаю, что useState у этого есть ограничения, такие как его немедленное обновление, и в моем случае это проблема.

Я извлекаю данные из Firestore и использую useState их для дальнейшего использования, но при первом нажатии на кнопку, например, я получаю следующую ошибку:

ошибка

После второго щелчка все данные отображаются идеально.

Есть ли какой-либо способ предотвратить появление этой ошибки?

Запрос Firestore:

 const handleService = (bUID) => {
      const serviceListTmp = [];
      firebase.firestore().collection("users").doc(currentUser.uid).collection("my-appointments").where("businessId", "==", bUID).get().then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
          serviceListTmp.push(doc.data());
        })
        console.log("Service List TMP =>", serviceListTmp);
        setServiceObj(serviceListTmp);
        //console.log("Service Obj ", serviceObj);
      })
    }
  

Ошибка заключается здесь:

 const data = serviceObj.reduce(reducer, []);
  

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

1. Как вы определяете свое состояние для serviceObj ? Просто случайное предположение, но, вероятно, изначально вы забыли установить [] это в качестве значения, и именно поэтому ваш reduce() сбой, потому что он может работать только с массивами. Если это так, решение может быть const [serviceObj, setServiceObj] = useState([]) .

2. const [serviceObj, setServiceObj] = useState();

3. Я дам себе пощечину, если это проблема

Ответ №1:

Основная проблема заключается в том, что вы работаете .reduce() не с массивом в своем коде. Вероятно, вы забыли изначально установить в своем состоянии значение [] .

Основываясь на разъяснении раздела комментариев, вам необходимо определить свое состояние как:

 const [serviceObj, setServiceObj] = useState([])
  

Кроме этого, ваш код выглядит просто отлично.

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

1. Похоже, это работает, я проведу серьезную проверку с большим количеством данных и прокомментирую здесь, если будут какие-либо изменения

2. @OsherRevach Потрясающе, рад помочь!