javascript - 使用通过 useContext 传递的旧状态值反应 Hook 组件
问题描述
请看这个沙箱:
https://codesandbox.io/s/use-context-simple-qygdz?file=/src/App.js
*** 你必须去 /check1 开始,当你到达 /check2 时不应该有 ddd,但它现在仍然存在(状态未更新)
当我将一个页面链接到另一个页面时,usecontext 不会传递状态。不知道为什么 - 但我很高兴在帮助下我们能够准确定位问题所在。
解决方案
如果你只使用一个 useState 钩子来更新你的整个上下文,也许它会有所帮助我包括下面的主要部分(这里是一个工作示例的链接)。当我尝试这个时,我看到每个组件中的上下文都发生了变化。
import React from "react";
import "./styles.css";
import ChangeContext from "./components/ChangeContext";
import ViewChange from "./components/ViewChange";
const info = {
artists: null,
messages: null,
songs: null,
userid: "ddd",
accesstoken: null,
refreshtoken: null
};
export const InfoContext = React.createContext();
export default function App() {
const [context, setContext] = React.useState(info);
return (
<InfoContext.Provider value={[context, setContext]}>
<div className="App">
<ChangeContext />
<ViewChange />
</div>
</InfoContext.Provider>
);
}
然后在一个组件中
import React from "react";
import { InfoContext } from "../App";
export default function App() {
const [context, setContext] = React.useContext(InfoContext);
return (
<div className="App">
<h1>{context.userid} uid</h1>
<button
onClick={e => {
setContext({ ...context, userid: 123 });
}}
>
click me
</button>
</div>
);
}
在另一个组件中检查更改
import React from "react";
import { InfoContext } from "../App";
export default function ChangeContext() {
const [context, setContext] = React.useContext(InfoContext);
return (
<div className="App">
<h1>{context.userid} uid</h1>
<button
onClick={e => {
setContext({ ...context, userid: 123 });
}}
>
click me
</button>
</div>
);
}
也许试试这个
const [context, setContext] = useState(info);
return (
<BrowserRouter>
<Route exact path="/signup/:id/:access_token" render={() => <InfoContext.Provider value={[context, setContext]}><Signup /> </InfoContext.Provider>} />
<Route exact path="/" render={() => <Login />} />
<Route exact path="/home/:id/:access_token/:refresh_token" render={() => <Homepage ></Homepage>} />
<Route exact path="/artist/:artistid" render={() => <ArtistPage ></ArtistPage>} />
<Route exact path="/map" render={() => <MapLeaflet />} />
</BrowserRouter>
);
推荐阅读
- python - 用于加密的初学者凯撒密码解密过程
- android - Android-Amplify:使用 Amplify 向/从 AWS S3 上传/下载文件
- php - jQuery AJAX 不更新其响应
- node.js - 无法使用远程服务器进行本地身份验证
- python - 如何使用 python Mock 来验证成员变量是否已设置和未设置?
- amazon-web-services - AWS 组织 - 加入账户是否意味着它会自动链接到付款人账户?
- flutter - 如何使用 Algolia 在 Firestore 中搜索特定文档的特定字段?(扑)
- loops - 如何使用 pygrib 遍历 grib2 文件的目录?
- google-sheets - 如何在一个条件下导入多个列值?
- typescript - 无法安装 React Native Maps