如何使用 context api 和 react-router-dom": "^5.2.0" and react": "^17.0.2"
How to use context api with react-router-dom": "^5.2.0" and react": "^17.0.2"
我正在尝试使用上下文 API 从我的 Header 组件访问用户值,但它给我未定义。
这是我的代码。
import React, { createContext, useEffect, useState } from "react";
export const DashboardContext = createContext();
const AppContextProvider = ({ children }) => {
const userInitialState = localStorage.getItem("user") || "";
const [user, setUser] = useState(userInitialState);
useEffect(() => {
localStorage.setItem("user", user);
}, [user]);
const values = {
user,
setUser
};
return (
<DashboardContext.Provider value={values}>
{children}
</DashboardContext.Provider>
);
};
export default AppContextProvider;
在应用程序组件中:
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import AppContextProvider from "./contexts/AppContext";
import Products from "./views/Products";
import Orders from "./views/Orders";
<AppContextProvider>
<Router>
<Header />
<Switch>
<Route path="/products">
<Products />
</Route>
<Route path="/orders">
<Orders/>
</Route>
</Switch>
</AppContextProvider>
页眉组件:
import React, { useContext } from "react";
import AppContextProvider from "../contexts/AppContextProvider";
import "../styles/Header.css";
const Header = () => {
const context = useContext(AppContextProvider);
console.log(context); // gives me undefined
return (
<div className="row border-bottom text-white">
{user}
</div>
};
export default Header;
在 Header 组件内部,我尝试访问用户值,但它给了我 undefined
我该如何解决这个问题,因为我是新手。
请帮忙。
..................................................... .....................
您在 Header 组件中未定义的原因是您使用了错误的变量来访问 Context。
您需要使用实际的上下文值,而不是您设置的提供者。您需要改用 const context = useContext(DashboardContext)
,它会起作用。
const { createContext, useEffect, useState, useContext } = React;
const DashboardContext = createContext();
const AppContextProvider = ({ children }) => {
const userInitialState = "You" || "";
const [user, setUser] = useState(userInitialState);
useEffect(() => {
console.log(`store: "${user}" to localstorage`);
}, [user]);
const values = {
user,
setUser,
};
return (
<DashboardContext.Provider value={values}>
{children}
</DashboardContext.Provider>
);
};
const Header = () => {
const { user, setUser } = useContext(DashboardContext);
const changeUserName = (event) => {
event.preventDefault();
const data = new FormData(event.target);
setUser(data.get("user"));
};
return (
<div>
<div>Welcome {user}!</div>
<div>
<form onSubmit={changeUserName}>
<input name="user" />
<button type="submit">Update Name</button>
</form>
</div>
</div>
);
};
const App = () => (
<AppContextProvider>
<Header />
</AppContextProvider>
);
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="root"/>
我正在尝试使用上下文 API 从我的 Header 组件访问用户值,但它给我未定义。 这是我的代码。
import React, { createContext, useEffect, useState } from "react";
export const DashboardContext = createContext();
const AppContextProvider = ({ children }) => {
const userInitialState = localStorage.getItem("user") || "";
const [user, setUser] = useState(userInitialState);
useEffect(() => {
localStorage.setItem("user", user);
}, [user]);
const values = {
user,
setUser
};
return (
<DashboardContext.Provider value={values}>
{children}
</DashboardContext.Provider>
);
};
export default AppContextProvider;
在应用程序组件中:
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import AppContextProvider from "./contexts/AppContext";
import Products from "./views/Products";
import Orders from "./views/Orders";
<AppContextProvider>
<Router>
<Header />
<Switch>
<Route path="/products">
<Products />
</Route>
<Route path="/orders">
<Orders/>
</Route>
</Switch>
</AppContextProvider>
页眉组件:
import React, { useContext } from "react";
import AppContextProvider from "../contexts/AppContextProvider";
import "../styles/Header.css";
const Header = () => {
const context = useContext(AppContextProvider);
console.log(context); // gives me undefined
return (
<div className="row border-bottom text-white">
{user}
</div>
};
export default Header;
在 Header 组件内部,我尝试访问用户值,但它给了我 undefined 我该如何解决这个问题,因为我是新手。 请帮忙。 ..................................................... .....................
您在 Header 组件中未定义的原因是您使用了错误的变量来访问 Context。
您需要使用实际的上下文值,而不是您设置的提供者。您需要改用 const context = useContext(DashboardContext)
,它会起作用。
const { createContext, useEffect, useState, useContext } = React;
const DashboardContext = createContext();
const AppContextProvider = ({ children }) => {
const userInitialState = "You" || "";
const [user, setUser] = useState(userInitialState);
useEffect(() => {
console.log(`store: "${user}" to localstorage`);
}, [user]);
const values = {
user,
setUser,
};
return (
<DashboardContext.Provider value={values}>
{children}
</DashboardContext.Provider>
);
};
const Header = () => {
const { user, setUser } = useContext(DashboardContext);
const changeUserName = (event) => {
event.preventDefault();
const data = new FormData(event.target);
setUser(data.get("user"));
};
return (
<div>
<div>Welcome {user}!</div>
<div>
<form onSubmit={changeUserName}>
<input name="user" />
<button type="submit">Update Name</button>
</form>
</div>
</div>
);
};
const App = () => (
<AppContextProvider>
<Header />
</AppContextProvider>
);
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="root"/>