javascript - 上下文不更新异步函数中的 React
问题描述
我有一个带有 [username,setUsername] 钩子和 UserContext Provider 的 App.js 文件。我在 Login.js 中使用它,但由于某种原因,contextUser.setUserContext 不起作用,即使我认为我可以访问 contextUser.username 的值。我的其他上下文使用这个实现完美地工作,但不是这个。我究竟做错了什么 ?
这是源代码(我删除了不必要的代码)注意:Login.js 中的第二个用户名挂钩用于其他用途
应用程序.js
import {useEffect, useState} from 'react'
/** @jsx jsx */
import { jsx } from '@emotion/core'
// Local
import { UserContext } from './Contexts/UserContext';
import { LoggedInContext } from './Contexts/LoggedInContext';
export default () => {
//VARIABLES & HOOKS
const styles = useStyles();
const [username, setUsername] = useState("My Account")
const [loggedIn, setLoggedIn] = useState(false);
const contextLoggedIn = {
loggedIn: loggedIn,
setLoggedInContext: setLoggedIn
}
const contextUser = {
username: username,
setUserContext: setUsername
}
//RENDER
return (
<UserContext.Provider value={contextUser}>
<LoggedInContext.Provider value={contextLoggedIn}>
<Router>
<div className={styles.root}>
<Header/>
<Switch>
<Route path="/login">
{loggedIn ? <Redirect to="/welcome"/> : <Login onUser={setUsername}/>}
</Route>
<Route path="/register">
{loggedIn ? <Redirect to="/welcome"/> : <Register/>}
</Route>
<Route path="/welcome">
{loggedIn ? <Main drawerMobileVisible={drawerMobileVisible} /> : <Redirect to="/login"/>}
</Route>
<Route path="/">
<Redirect to="/login" />
</Route>
</Switch>
<Footer />
</div>
</Router>
</LoggedInContext.Provider>
</UserContext.Provider>
);
}
登录.js
import React, { useContext, useState } from 'react';
/** @jsx jsx */
import { jsx } from '@emotion/core'
// Layout
import { UserContext } from './Contexts/UserContext';
export default ({
}) => {
const contextUser = useContext(UserContext)
const [username, setUsername] = useState(null)
const handleLogIn = () => {
axios.post('http://localhost:3001/users/login',{
username: username,
password: password
}, {withCredentials: true}).then(function (response){
setWrongUser(false);
setWrongPass(false);
console.log("Redirecting to welcome...")
contextUser.setUserContext(username) //Not working for some reason
console.log(contextUser.username)
onUser(username)
window.location.href = '/welcome';
})
}
UserContext.js
import React from 'react';
export const UserContext = React.createContext({
username: "My Account",
setUserContext: (username) => {}
});
编辑:这是 Header.js,它没有从上下文中看到更新的用户名
import './App.css';
/** @jsx jsx */
import { jsx } from '@emotion/core'
import React from 'react'
import {useContext} from 'react'
import { LoggedInContext } from './Contexts/LoggedInContext';
import { UserContext } from './Contexts/UserContext';
import {ReactComponent as ECEIcon} from './icons/LogoECE.svg';
export default ({
}) => {
const contextUser = useContext(UserContext)
const contextLoggedIn = useContext(LoggedInContext)
return (
<header className={styles.root}>
<AppBar position="static" color="primary">
<Toolbar>
{ contextLoggedIn.loggedIn ?
<Button
variant="contained"
color="secondary"
className={styles.accountButton}
onClick={handleClick}
endIcon={<AccountCircleRoundedIcon></AccountCircleRoundedIcon>}
>
{ contextUser.username }
</Button> : ""
}
</Toolbar>
</AppBar>
</header>
);
}
解决方案
推荐阅读
- tensorflow2.0 - 多约束张量流变量
- python-3.x - 如何在二维列表python中找到列表的相同元素
- google-apis-explorer - 设备策略错误(clouddpc):使用 Android 管理 API 的专用设备找不到 policy.json 文件
- react-native - 必须在构造函数中使用解构道具分配错误
- javascript - 在 javascript 中加载 Image Ranomizer API 以在 HTML 上显示
- vue.js - 从父组件动态更新 v-autocomplete
- javascript - 在将参数传递给函数时重新分配参数是否有任何问题
- swiftui - 如何使用 GeometryReader 在 LazyVGrid 中拖动视图?
- google-cloud-platform - 是否可以恢复未保存的 google colab notebook
- php - 从 PHP 中的选定选项返回多维数组键