React 代码
import React, { useEffect, useState } from "react";
import { getDocs, collection } from "firebase/firestore";
import { auth, db } from "../firebase-config";
import { useNavigate } from "react-router-dom";
function Load() {
const navigate = useNavigate();
const [accountList, setAccountList] = useState([]);
const [hasEmail, setHasEmail] = useState(false);
const accountRef = collection(db, "accounts");
我是否正确使用了useEffect?
useEffect(() => {
const getAccounts = async () => {
const data = await getDocs(accountRef);
setAccountList(
data.docs.map((doc) => ({
...doc.data(),
id: doc.id,
}))
);
};
getAccounts();
emailCheck();
direct();
}, []);
检查电子邮件是否存在
const emailCheck = () => {
if (accountList.filter((e) => e.email === auth.currentUser.email)) {
setHasEmail(true);
} else {
setHasEmail(false);
}
};
基于当前用户的重定向
const direct = () => {
if (hasEmail) {
navigate("/index");
} else {
navigate("/enterdetails");
}
};
return <div></div>;
}
代码会编译,但不会正确重定向到任何页面。 我应该进行哪些更改? 发布的第一个问题,如果格式错误,请原谅。
这里有两个问题:
useEffect(() => {
const getAccounts = async () => {
const data = await getDocs(accountRef);
setAccountList(
data.docs.map((doc) => ({
...doc.data(),
id: doc.id,
}))
);
};
getAccounts();
emailCheck();
direct();
}, []);
挨次:
- 由于
getAccounts
是异步的,因此在调用它时需要使用await
。 - 但即便如此,设置状态也是一个异步操作,因此帐户列表不会在
getAccounts
完成后立即更新 - 即使您在调用它时使用await
也是如此。
如果你不使用accountList
来渲染UI,你可能应该完全摆脱它作为一个useState
钩子,只使用常规的JavaScript变量来传递值。
但是,即使您在 UI 中使用它,也需要使用不同的逻辑来检查其结果。例如,您可以在getAccounts
函数中运行额外的检查,并让它们使用与常规变量相同的结果:
useEffect(() => {
const getAccounts = async () => {
const data = await getDocs(accountRef);
const result = data.docs.map((doc) => ({
...doc.data(),
id: doc.id,
}));
setAccountList(result);
emailCheck(result);
direct();
};
getAccounts();
}, []);
const emailCheck = (accounts) => {
setHasEmail(accounts.some((e) => e.email === auth.currentUser.email));
};
或者,您可以使用依赖于accountList
状态变量的第二个效果来执行检查和重定向:
useEffect(() => {
const getAccounts = async () => {
const data = await getDocs(accountRef);
setAccountList(
data.docs.map((doc) => ({
...doc.data(),
id: doc.id,
}))
);
};
getAccounts();
});
useEffect(() => {
emailCheck();
direct();
}, [accountList]);
现在,每次在状态中更新accountList
时,都会触发第二个效果。