#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() здесь, но я не хочу его принудительно обновлять