简体   繁体   English

使用 React Router V6 和 useRoutes 进行模块化路由?

[英]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>
);
  • Import and spread the itemRoutes into the routes array in App .itemRoutes导入并传播到App中的路由数组中。
  • Wrap the App render with the ItemContextProvider component and pass item and setItem as the context value.使用ItemContextProvider组件包装App呈现器,并将itemsetItem作为上下文值传递。

... ...

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>
    </>
  );
};

编辑 modular-routing-with-react-router-v6-and-useroutes

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM