Javascript React:useState函数在通过上下文传递后不更新状态
我创建了一个上下文,它传递这个useState()声明Javascript React:useState函数在通过上下文传递后不更新状态,javascript,reactjs,react-hooks,react-context,Javascript,Reactjs,React Hooks,React Context,我创建了一个上下文,它传递这个useState()声明const[user,setUser]=useState(null)。在添加react上下文之前,useState()函数运行良好,我没有遇到任何问题。但是现在我已经在context react中声明了函数,它不再更新状态并返回null。我不确定我做错了什么 AppContext.js import React, { createContext, useState } from 'react'; export const AppConte
const[user,setUser]=useState(null)代码>。在添加react上下文之前,useState()函数运行良好,我没有遇到任何问题。但是现在我已经在context react中声明了函数,它不再更新状态并返回null。我不确定我做错了什么
AppContext.js
import React, { createContext, useState } from 'react';
export const AppContext = createContext();
export const AppProvider = ({ children }) => {
//user state declared with useState()
const [user, setUser] = useState(null);
return (
<AppContext.Provider value={{user, setUser}}>
{children}
</AppContext.Provider>
);
};
从“React”导入React,{createContext,useState};
export const AppContext=createContext();
export const AppProvider=({children})=>{
//使用useState()声明的用户状态
const[user,setUser]=useState(null);
返回(
{儿童}
);
};
App.js
import React from 'react';
import {
BrowserRouter as Router,
Route,
Switch
} from 'react-router-dom';
import './App.css';
import Login from './components/Login';
import { AppProvider } from './Contexts/AppContext';
export default () => (
<Router>
<div className="App">
<Switch>
<AppProvider>
<Route exact path='/' component={Login}/>
</AppProvider>
</Switch>
</div>
</Router>
)
从“React”导入React;
进口{
BrowserRouter作为路由器,
路线,,
转换
}从“反应路由器dom”;
导入“/App.css”;
从“./components/Login”导入登录名;
从“./Contexts/AppContext”导入{AppProvider};
导出默认值()=>(
)
Login.js
import React, { useState, useContext} from "react";
import { AppContext } from "../Contexts/AppContext";
import { useHistory } from "react-router";
import axios from "axios";
import { Link } from "react-router-dom";
const api = 'http://localhost:5000';
const Login = ({ children }) => {
const history = useHistory();
const [ email, setEmail ] = useState("");
const [ pass, setPassword ] = useState("");
//Here is the issue setUser now returns null
const { user, setUser } = useContext(AppContext);
const emailChange = (event) => {
event.preventDefault();
setEmail(event.target.value);
console.log(email);
};
const passwordChange = (event) => {
event.preventDefault();
setPassword(event.target.value);
console.log(pass);
};
const submit = () => {
axios.post(`${api}/login`, { emailAddress: email, password: pass })
.then(res => {
const data = res.data;
setUser(data);
console.log(user)
history.push({
pathname: "/account-page"
});
})
.catch(err => console.log(err));
}
const handleSubmit = (event) => {
event.preventDefault();
submit()
}
return (
<div>
<h1>Login</h1>
<form onSubmit={handleSubmit}>
<input
id="emailAddress"
name="emailAddress"
type="text"
placeholder="emailAddress"
onChange={emailChange}
/>
<input
id="password"
name="password"
type="password"
placeholder="Password"
onChange={passwordChange}
/>
<button type="submit">Submit</button>
<button >Cancel</button>
</form>
<p>Don't have a user account?
<Link className="sign-up-link" to="/">Click here</Link>
to sign up!
</p>
</div>
);
}
export default Login
从“React”导入React,{useState,useContext};
从“./Contexts/AppContext”导入{AppContext};
从“react router”导入{useHistory};
从“axios”导入axios;
从“react router dom”导入{Link};
常数api=http://localhost:5000';
常量登录=({children})=>{
const history=useHistory();
const[email,setEmail]=useState(“”);
const[pass,setPassword]=useState(“”);
//下面是setUser现在返回null的问题
const{user,setUser}=useContext(AppContext);
const emailChange=(事件)=>{
event.preventDefault();
setEmail(event.target.value);
控制台日志(电子邮件);
};
常量密码更改=(事件)=>{
event.preventDefault();
设置密码(event.target.value);
控制台日志(pass);
};
常量提交=()=>{
post(`${api}/login`,{emailAddress:email,pass:pass})
。然后(res=>{
常数数据=分辨率数据;
设置用户(数据);
console.log(用户)
历史推送({
路径名:“/帐户页”
});
})
.catch(err=>console.log(err));
}
const handleSubmit=(事件)=>{
event.preventDefault();
提交()
}
返回(
登录
提交
取消
没有用户帐户吗?
点击这里
去报名吧!
);
}
导出默认登录名
从逻辑上看,它似乎不正确,因为在react上下文中,我们只能将值传递给组件,而不能传递给“SetState”(在您的情况下是setuser)函数本身。