使用 contextAPI 和 React 通过异步函数设置 useState 的初始值
Setting the initial value of useState with async function using contextAPI and React
我对反应还很陌生,我一直在努力了解如何解决这个问题。我将整个上下文包裹起来 API 然后我使用该值来检查用户是否已登录。但是由于 HOC,const loggedIn
的初始值已经在请求被获取之前呈现从服务器。
当程序启动时,我得到 undefined 并且我明白为什么我得到但不知道如何修复它。
我研究了很多,但没有找到明确的解决方案。
function AuthContextProvider(props) {
const [loggedIn, setLoggedIn] = useState(undefined);
async function getLoggedIn() {
const loggedInRes = await Axios.get("http://localhost:5000/api/users/loggedIn");
setLoggedIn(loggedInRes.data);
}
useEffect(() => {
getLoggedIn();
}, []);
return (
<AuthContext.Provider value={{ loggedIn, getLoggedIn }}>
{props.children}
</AuthContext.Provider>
)
}
我现在的问题是如何在我的程序呈现之前设置此 const loggedIn
的初始值。
我觉得你的想法很好,你只需要等待登录就绪再渲染即可:
function AuthContextProvider(props) {
const [loggedIn, setLoggedIn] = useState(undefined);
async function getLoggedIn() {
const loggedInRes = await Axios.get("http://localhost:5000/api/users/loggedIn");
setLoggedIn(loggedInRes.data);
}
useEffect(() => {
getLoggedIn();
}, []);
if (!loggedIn) {
return (
<AnotherComponentThatDontRequireAuthentication />
);
}
return (
<AuthContext.Provider value={{ loggedIn, getLoggedIn }}>
{props.children}
</AuthContext.Provider>
)
}
结果代码
function AuthContextProvider(props) {
const [loggedIn, setLoggedIn] = useState(undefined);
const [isLoading, setIsLoadig] = useState(true);
useEffect(() => {
Axios.get("http://localhost:5000/api/users/loggedIn").then((response) => {
setLoggedIn(response.data);
setIsLoadig(false);
});
}, [loggedIn]);
if (isLoading) {
return < div > App is isLoading</div >;
}
return (
<AuthContext.Provider value={{ loggedIn, getLoggedIn }}>
{props.children}
</AuthContext.Provider>
)
}
我对反应还很陌生,我一直在努力了解如何解决这个问题。我将整个上下文包裹起来 API 然后我使用该值来检查用户是否已登录。但是由于 HOC,const loggedIn
的初始值已经在请求被获取之前呈现从服务器。
当程序启动时,我得到 undefined 并且我明白为什么我得到但不知道如何修复它。
我研究了很多,但没有找到明确的解决方案。
function AuthContextProvider(props) {
const [loggedIn, setLoggedIn] = useState(undefined);
async function getLoggedIn() {
const loggedInRes = await Axios.get("http://localhost:5000/api/users/loggedIn");
setLoggedIn(loggedInRes.data);
}
useEffect(() => {
getLoggedIn();
}, []);
return (
<AuthContext.Provider value={{ loggedIn, getLoggedIn }}>
{props.children}
</AuthContext.Provider>
)
}
我现在的问题是如何在我的程序呈现之前设置此 const loggedIn
的初始值。
我觉得你的想法很好,你只需要等待登录就绪再渲染即可:
function AuthContextProvider(props) {
const [loggedIn, setLoggedIn] = useState(undefined);
async function getLoggedIn() {
const loggedInRes = await Axios.get("http://localhost:5000/api/users/loggedIn");
setLoggedIn(loggedInRes.data);
}
useEffect(() => {
getLoggedIn();
}, []);
if (!loggedIn) {
return (
<AnotherComponentThatDontRequireAuthentication />
);
}
return (
<AuthContext.Provider value={{ loggedIn, getLoggedIn }}>
{props.children}
</AuthContext.Provider>
)
}
结果代码
function AuthContextProvider(props) {
const [loggedIn, setLoggedIn] = useState(undefined);
const [isLoading, setIsLoadig] = useState(true);
useEffect(() => {
Axios.get("http://localhost:5000/api/users/loggedIn").then((response) => {
setLoggedIn(response.data);
setIsLoadig(false);
});
}, [loggedIn]);
if (isLoading) {
return < div > App is isLoading</div >;
}
return (
<AuthContext.Provider value={{ loggedIn, getLoggedIn }}>
{props.children}
</AuthContext.Provider>
)
}