使用 URL 参数动态渲染 React 页面

Render React page dynamically using URL parameter

我在 <url>/machines 有一个页面,其中列出了网络上一组机器的 IP 地址。我希望能够单击列表中的一个并 link 到页面 <url>/machines/<machineid> 以呈现一个显示有关该特定机器信息的新页面。我希望将 URL 中指定为 <machineid> 的值作为可用值传递到呈现的页面中,例如在 prop/param 等

我在配置 React 路由器以实现此目的时遇到问题,想知道是否有人能看出我做错了什么?我一直在关注 React Router V6 文档,但似乎无法正常工作。当我在 <url>/machines/hello 呈现页面时,我收到一个控制台错误,显示 No routes matched location "/machines/hello"。谁能看出我做错了什么?

我最初以为我只是渲染一个新页面(使用不同的组件)来渲染机器信息页面,但是查看 React Router V6 文档,似乎 <MachineInfo> 组件是现在呈现为 <Machines>?

的子项

我在 <MachineInfo> 组件中有一个 alert(),它似乎根本不是 运行。我没有收到警报。

App.js

function App() {
  const value = useContext(Context);
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<Dashboard />} />
        <Route path="machines" element={<Machines />}>
          <Route path="machines/:id" element={<MachineInfo />} />   // I've tried this using just path=":id" as well with no luck
        </Route>
        <Route path="topology" element={<Topology />} />
        <Route path="settings" element={<Settings />} />
      </Routes>
    </div>
  );
}

MachineInfo.js

export default function MachineInfo(props) {

    const [state, dispatch] = useContext(Context);
    let { id } = useParams<"id">([]);
    alert("info: " + id)
    
    return (
        <p>hello</p>
    );
}

首先,您需要一个 Layout 组件,其中包含您的 Outlet

export function Layout() {
  return (
    <>
     <Outlet />       
    </>
  );

现在将您的其他路由包含在这个 Layout 组件中,您会发现您现在可以通过说 /machines/1 来访问您的嵌套路由 Dashboard 组件是索引,因此 / 应该匹配这条路线。

function App() {
  // Not sure why you have value since it doesn't seem to be getting used
  const value = useContext(Context);
  return (
    <div className="App">
      <Routes>
        <Route path="/*" element={<Layout />}>
           <Route index element={<Dashboard />} />
           <Route path="machines" element={<Machines />}>
             <Route path=":id" element={<MachineInfo />} />   
           </Route>
           <Route path="topology" element={<Topology />} />
           <Route path="settings" element={<Settings />} />
         </Route>
      </Routes>
    </div>   
   );
 }