javascript - 上下文正在更新状态,但在第二次尝试
问题描述
const {user, setUser} = useContext(UserContext);
const {auth, setAuth} = useContext(AuthContext);
const handleSubmit = async (e) => {
e.preventDefault();
//axios request to the backend
const url = 'http://localhost:5000/home';
await axios.post(url, userData)
.then((res) => {
let ok = res.data.Authenticated;
if (ok) {
setAuth(true);
setUser(userData);
console.log("its ok");
}
else {
setAuth(false);
setUser(null);
console.log("its not ok");
}
console.log(auth, user);
})
.catch(err => console.log(err))
}
在上面的函数中,我试图更新用户的状态,但当时我需要点击两次按钮才能在上下文状态中存储用户数据和身份验证。这是什么原因?保证数据来自 axios 请求。
用户上下文.js:
import {createContext} from "react";
export const UserContext = createContext(null);
验证 Context.js:
import {createContext} from 'react';
export const AuthContext = createContext(false);
解决方案
你错过了Provider
. react 中的上下文提供了两件事,一个是 the Provider
,另一个是Consumer
。useContext
是消费者的钩子实现。
如下更改您的上下文
UserContext.js
import {createContext, useState} from "react";
export const UserContext = createContext(null);
const UserContextProvider = ({ children}) => {
const [ user, setUser ] = useState(null);
return (
<UserContext.Provider value={{user, setUser}}>
{children}
</UserContext.Provider>
)
}
export default UserContextProvider;
AuthContext.js
import {createContext, useState} from "react";
export const AuthContext = createContext(null);
const AuthContextProvider = ({ children}) => {
const [ auth, setAuth ] = useState(false);
return (
<AuthContext.Provider value={{auth, setAuth}}>
{children}
</AuthContext.Provider>
)
}
export default AuthContextProvider;
一旦你有了这些 Providers 。您应该使用这些 Providers 包装呈现表单的组件。
<UserContextProvider>
<AuthContextProvider>
<YourFormComponent /> // your component goes here
</AuthContextProvider>
</UserContextProvider>
推荐阅读
- mongodb - 如何通过同一文档中的另一个字段 $inc 一个字段?
- amazon-s3 - Amplify add storage - 允许未经身份验证的用户需要进行身份验证配置,但未正确配置
- python - 尝试从 Selenium Python 中的 div 类获取文本时出现 InvalidSelectorException 错误
- postgresql - 如何从 json 表中创建具有多列的新表
- c# - 如何将 C# 控制台应用程序窗口移动到屏幕中心
- python - Python Selenium StaleElement 异常
- html - CSS - 为表格中的每 n 列设置样式
- json - 在序列化时将字符串属性值转换为 base64 对于 ASP.NET Core 3.0+
- linux - 有没有办法设置 linux 在程序崩溃时显示 GUI 对话框?
- python - python中的多线程-我想将字典作为参数传递