javascript - React 上下文 API 和路由器
问题描述
我正在尝试将上下文 API 与 React-router 一起使用,但它没有按我预期的那样工作。
这是我的 Container.js 文件
import React from "react"
import {Route, Switch} from "react-router-dom";
import Home from "../Components/Home/home";
import Create from "../Components/Create/create";
import Login from "../Components/Login/login";
import {GoogleIdContextProvider} from "../Context/googleIdContext";
const Container = () => {
return (
<GoogleIdContextProvider>
<Switch>
<Route exact path = "/home" component = {Home} />
<Route exact path = "/create" component = {Create} />
<Route path = "/" component = {Login} />
</Switch>
</GoogleIdContextProvider>
)
}
export default Container;
这是 login.js 文件
import React, {useState, useContext} from "react"
import GoogleLogin from "react-google-login";
import {GoogleIdContext} from "../../Context/googleIdContext"
const Login = (props) => {
const [googleId, setGoogleId] = useContext(GoogleIdContext);
const test = res => {
console.log(res.profileObj.googleId);
}
const success = res => {
console.log(res.profileObj);
setGoogleId(res.profileObj.familyName) //my family name is "jeong"
}
return (
<div>
<GoogleLogin
clientId = "secret!!"
buttonText = "GoogleLogin"
onSuccess = {success}
onFailure = {test}
cookiePolicy={'single_host_origin'}
/>
{googleId}
</div>
)
}
export default Login;
这是我的 home.js 文件
import React, {useContext} from "react";
import {GoogleIdContext} from "../../Context/googleIdContext";
const Home = () => {
const [googleId] = useContext(GoogleIdContext);
console.log(googleId);
return (
<div>
{googleId}
</div>
)
}
export default Home;
最后,这是我的 googleIdContext.js 文件:
import React, {useState, createContext} from "react"
export const GoogleIdContext = createContext();
export const GoogleIdContextProvider = props => {
const [googleId, setGoogleId] = useState("placeholder");
return (
<GoogleIdContext.Provider value = {[googleId, setGoogleId]}>
{props.children}
</GoogleIdContext.Provider>
)
}
我的期望如下:当我使用“npm run start”运行应用程序时,第 1 步:我首先看到带有路由器“localhost:3000”的 login.js jsx 文件。它有 google 登录按钮和占位符,这是 googleIdContext.js 中变量“googleId”的值。
第2步:登录后,执行login.js中的成功函数,改变googleId变量的值,代码如下:“setGoogleId(res.profileObj.familyName)”
第3步:“占位符”一词已更改为“jeong”,即“姓氏”
第 4 步:如果我移动到不同的路由“localhost:3000/home”,home.js 会显示单词“jeong”而不是“placeholder”,因为变量“googleId”的值已从“placeholder”更改为第 2 步中的“jeong”。
从第 1 步到第 3 步进展顺利。但是,在第 4 步(更改路由器时),该值没有更改,并且仍然显示“占位符”而不是“jeong”,即使在原始路由器中更改了值。
谁能解释一下为什么“localhost:3000/home”路由器仍然显示“占位符”以及我应该如何编写代码来实现第 4 步?
这是屏幕截图,以便更好地理解。
解决方案
使用路由器时,必须使用包含交换机和路由的路由器结构。
<GoogleIdContextProvider>
<Router>
<Switch>
<Route exact path = "/home" component = {Home} />
<Route exact path = "/create" component = {Create} />
<Route path = "/" component = {Login} />
</Switch>
</Router>
</GoogleIdContextProvider>
不要忘记导入路由器!--> 从 'react-router-dom' 导入 {BrowserRouter as Router}
推荐阅读
- google-apps-script - 在单个 Google AdWords 脚本中获取 150 多个帐户的 AdWords 数据,为期 2 周
- javascript - 何时使用 vuex 存储数据而不是本地组件数据?
- android - 将多个值绑定到一个控件 Xamarin.Android MVVMCross MVX
- c# - 在带有 Plesk 的 Ubuntu 中使用 ASP.NET Core 时出错
- c - 服务器没有向客户端返回最后一个响应消息
- json - 如何按 ID 对 JSON 数组进行排序?
- jsf - 提交jsf页面后valueChangeListener没有调用
- java - Java:转义 XML 文本内容而不是整个文本
- python-3.x - 有没有办法将烧瓶服务器与其他简单的文件传输服务器通信?
- python - Matrix.itam((i,j)) 无法正常工作