考虑以下代码:
https://codesandbox.io/p/sandbox/hardcore-lake-mptzw3
App.jsx:
import ContextProvider from "./provider/contextProvider";
import Routes from "./routes";
function App() {
console.log("In App");
return (
<ContextProvider>
<Routes />
</ContextProvider>
);
}
export default App;
Routes.jsx:
import { RouterProvider, createBrowserRouter } from "react-router-dom";
import { provideContext } from "./provider/contextProvider";
import Component1 from "./pages/Component1";
import Component2 from "./pages/Component2";
const Routes = () => {
const { token } = provideContext();
const router = createBrowserRouter([
{
path: "/Component2",
element: <Component2 />,
},
{
path: "/Component1",
element: <Component1 />,
},
]);
return <RouterProvider router={router} />;
};
export default Routes;
pages/vent1.jsx:
const Component1 = () => {
console.log("In Component1");
return <div>Component1</div>;
};
export default Component1;
pages/vent2.jsx:
import { useNavigate } from "react-router-dom";
import { provideContext } from "../provider/contextProvider";
const Component2 = () => {
const navigate = useNavigate();
const { setToken } = provideContext();
console.log("In Component2");
const onClick = () => {
setToken("Token");
setTimeout(() => {
navigate("/Component1");
});
};
return (
<>
<button onClick={onClick}>Click me</button>
</>
);
};
export default Component2;
contextprovider. jsx:
import { createContext, useContext, useState } from "react";
const Context = createContext();
const ContextProvider = ({ children }) => {
const [token, setToken] = useState("Initial");
return (
<Context.Provider value={{ token, setToken }}>{children}</Context.Provider>
);
};
export const provideContext = () => {
return useContext(Context);
};
export default ContextProvider;
当点击Component2
中的按钮时,URL发生了变化,但UI仍然显示Component2.
第Component 1
章一次都没有
有趣的是,如果我在Component2.jsx
中删除setTimeout()
,或者在Routes.jsx
中删除const { token } = provideContext();
,问题就消失了.不知道发生了什么.