Как передать документ, полученный из firestore, в локальное состояние в react

#javascript #reactjs #firebase #google-cloud-firestore

# #javascript #reactjs #firebase #google-облако-firestore

Вопрос:

У меня есть несколько документов в firebase firestore. Я использую эту функцию javascript для извлечения этих

 const fetchName = async () => {
      console.log("fetchName fired");
      const snapshot = await db
        .collection("Users")
        .doc(user?.uid)
        .collection("details")
        .doc("data")
        .get();
        // Data is a local state variable
        // SetData is used to manipulate Data
      setData(snapshot.data());
      console.log("Snapped Data: ",snapshot.data());
    console.log("Fetched Data: ",Data);
  }; 

Это переменная состояния

 const [Data, setData] = useState(""); 

Я передаю fetchName() функцию в useEffect hook.

 useEffect(()=>
  {
    console.log("UseEffect Fired");
    if(user!==null)
    {
      console.log("User not NUll, User->",user);
      fetchName();
    }
  },[user]) 

Проблема

useEffect работает правильно и срабатывает fetchName() каждый раз, когда пользователь входит в систему или выходит из системы. Здесь основная проблема заключается в том, что при запуске use effect я вижу snapshot.data() выборку правильных данных, но он не присваивает их setData() . Из hit и trial, которые я видел setData() , запускается только тогда, когда я вношу какие-либо изменения в свой код или перезапускаю сервер.

Желаемый результат

Но я не хочу, чтобы я хотел каждый раз, когда snapshot.data() извлекает данные, которые он должен назначить, Data используя setData()

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

1. Откуда вы это знаете — but it is not assigning it to setData() ?

2. Я делаю консоль. войдите в snapshot.data() и в Data оба. Затем я вижу snapshot.data() имеет нужные мне данные, но setData не запускается, и у меня ничего нет в Data

Ответ №1:

Если вы беспокоитесь о 2-й строке console.log inside the fetchName , вы думаете неправильно.

Таким образом, обновления состояния являются асинхронными.

Например,

 const handleEvent = e => {
    setState(e.target.value);
    console.log(state);  
}
 

При этом не будет регистрироваться наиболее обновленное значение — это происходит потому, что обновления состояния являются асинхронными, поэтому синхронное поведение после обновления состояния не должно зависеть от переменной состояния, чтобы получить для нее наиболее обновленное значение.

Для более глубокого объяснения проверьте здесь и здесь

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

1. Извините, статьи просто прошли мимо моей головы. Я только что понял, что позволяю react решать, когда обновлять компонент, и обновления состояния являются асинхронными. Может ли plase сломать все это. Что именно я делаю не так и что нужно сделать, чтобы это исправить

2. Я могу использовать forceUpdate() здесь, но я не хочу его принудительно обновлять