[英]Modular Routing with React Router V6 and useRoutes?
I come from the angular world and I'm trying to setup a modular routes using react router v6 new useRoute hook.我来自 angular 世界,我正在尝试使用 react router v6 new useRoute hook 设置模块化路由。
App.js应用程序.js
function App() {
const [item, setItem] = useState(null);
const createUser = async (user) => {
await axios.post(AUTH_API + '/account', user);
};
let routes = useRoutes([
{
path: '*',
element: <NotFound404 />,
},
{
path: '/register',
element: <Registration onCreateUser={createUser} />,
},
]);
return routes;
}
export default App;
In these routes I want to import the routes of my item domain:在这些路线中,我想导入我的项目域的路线:
ItemRoutes.js ItemRoutes.js
export const itemRoutes = [
{
path: 'edit-item',
element: <ItemEdit setItem={setItem} item={item} />,
},
];
How can I import itemRoutes.js into the routes array of app.js As you can see the ItemEdit components expects the setItem and item hook.如何将 itemRoutes.js 导入 app.js 的路由数组 如您所见,ItemEdit 组件需要 setItem 和 item 挂钩。 But those are provided in App.js... Is this even possible?
但是这些是在 App.js 中提供的……这可能吗?
You could create a React context for the item
state, that the ItemEdit
component consumes.您可以为
ItemEdit
组件使用的item
state 创建 React 上下文。 This avoids the issue of passing props.这避免了传递道具的问题。
Example:例子:
import { createContext, useContext, useState } from "react";
const ItemContext = createContext({
item: null,
setItem: () => {}
});
const useItemContext = () => useContext(ItemContext);
const ItemContextProvider = ({ children, value }) => (
<ItemContext.Provider value={value}>{children}</ItemContext.Provider>
);
itemRoutes
into the routes array in App
.itemRoutes
导入并传播到App
中的路由数组中。App
render with the ItemContextProvider
component and pass item
and setItem
as the context value.ItemContextProvider
组件包装App
呈现器,并将item
和setItem
作为上下文值传递。 ... ...
const itemRoutes = [
{
path: "edit-item",
element: <ItemEdit />
}
];
... ...
import { itemRoutes } from '../path/to/itemRoutes';
function App() {
const [item, setItem] = useState(null);
const createUser = async (user) => {
await axios.post(AUTH_API + '/account', user);
};
const routes = useRoutes([
{
path: "*",
element: <NotFound404 />
},
{
path: "/register",
element: <Registration onCreateUser={createUser} />
},
...itemRoutes
]);
return (
<ItemContextProvider value={{ item, setItem }}>
...
{routes}
...
</ItemContextProvider>
);
}
EditItem should use the useItemContext
hook to destructure and access the item
state and the setItem
state udpater. EditItem 应该使用
useItemContext
挂钩来解构和访问item
state 和setItem
state udpater。
Example:例子:
const ItemEdit = () => {
const { item, setItem } = useItemContext();
return (
<>
<h1>ItemContext</h1>
<div>Item: {item}</div>
<div>
<label>
Edit item:{" "}
<input type="text" onChange={(e) => setItem(e.target.value)} />
</label>
</div>
</>
);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.