我一直在考虑其他一些线索,但还没有找到帮助我的答案.我正在建立一个非常简单的Electron 商务网站.路由一直工作得很好,直到我到达类似"localhost:3000/shop/1""localhost:3000/shop/2"的路由,在那里它继续显示我应该只在"localhost:3000/shop"路由上看到的<Shop />元素,而不是<Item />元素.虽然我已经找到了一种变通方法,但我感到困惑的是,为什么只有该变通方法才是有效的,并且我很想看看是否有方法可以让它在我格式化它的第一种方式下工作.

以下是不起作用的方法:

App.tsx

import { Route, Routes } from 'react-router-dom';
import Home from './pages/Home'
import Shop from './pages/Shop';
import Item from './pages/Item';
import CheckOut from './pages/Checkout';
import NotFound from './pages/NotFound';
import NavBar from './assets/navbar';

function App() {
  return (
    <>
      <Routes>
        <Route element={<NavBar />}>
          <Route path='/' element={<Home />} />
          <Route path='shop/' element={<Shop />}>
            <Route path=':id' element={<Item />} />
          </Route>
          <Route path='*' element={<NotFound />} />
        </Route>
        <Route path='checkout' element={<CheckOut />} />
        <Route path='*' element={<NotFound />} />
      </Routes>
    </>
  )
}

export default App;

我试着将<Route path='shop/' element={<Shop />}>改为<Route path='shop' element={<Shop />}>,但功能上仍然没有任何变化.

以下是有效的方法:

App.tsx

import { Route, Routes } from 'react-router-dom';
import Home from './pages/Home'
import Shop from './pages/Shop';
import Item from './pages/Item';
import CheckOut from './pages/Checkout';
import NotFound from './pages/NotFound';
import NavBar from './assets/navbar';

function App() {
  return (
    <>
      <Routes>
        <Route element={<NavBar />}>
          <Route path='/' element={<Home />} />
          <Route path='shop' element={<Shop />} />
          <Route path='shop/:id' element={<Item />} />
          <Route path='*' element={<NotFound />} />
        </Route>
        <Route path='checkout' element={<CheckOut />} />
        <Route path='*' element={<NotFound />} />
      </Routes>
    </>
  )
}

export default App;

为什么一种方法有效,另一种不起作用,有什么原因吗?

推荐答案

如果当URL路径是"/shop/1""/shop/2"105时,Shop组件仍然被呈现,那么我怀疑Shop组件没有为它呈现的嵌套路由呈现Outlet组件.

将缺失的Outlet添加到Shop中,以便像"/shop/:id"这样的嵌套路由可以将其element内容呈现到其中.这类似于NavBar呈现"/""/shop"嵌套路由的操作.

例如:

import { Outlet } from 'react-router-dom';

const Shop = () => {
  ... shop business logic ...

  return (
    ... Shop UI ...
    <Outlet /> // <-- nested route content rendered here
    ...
  );
};
function App() {
  return (
    <Routes>
      <Route element={<NavBar />}>
        <Route path='/' element={<Home />} />
        <Route path='shop' element={<Shop />}>
          <Route path=':id' element={<Item />} /> // <-- rendered into Shop Outlet
        </Route>
      </Route>
      <Route path='checkout' element={<CheckOut />} />
      <Route path='*' element={<NotFound />} />
    </Routes>
  );
}

有关更多信息和详细信息,请参阅:

如果您希望ShopItem分别在其各自的离散路由上呈现,则103路由Item并将它们呈现为sibling 路由,如第二个代码示例中所做的那样.

例如:

function App() {
  return (
    <Routes>
      <Route element={<NavBar />}>
        <Route path='/' element={<Home />} />
        <Route path='shop'>
          <Route index element={<Shop />} />
          <Route path=':id' element={<Item />} />
        </Route>
      </Route>
      <Route path='checkout' element={<CheckOut />} />
      <Route path='*' element={<NotFound />} />
    </Routes>
  );
}

有关详细信息,请参阅:

Typescript相关问答推荐

如何推断计算逻辑的类型

类型脚本`Return;`vs`Return unfined;`

STypescript 件的标引签名与功能签名的区别

如何使默认导出与CommonJS兼容

等待用户在Angular 函数中输入

有没有可能为这样的函数写一个类型?

不带其他属性的精确函数返回类型

从非文字数组(object.keys和array.map)派生联合类型

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

KeyOf关键字在特定示例中是如何工作的

打字脚本错误:`不扩展[Type]`,而不是直接使用`[Type]`

如何在Deno中获取Base64图像的宽/高?

类型判断数组或对象的isEmpty

如何从抽象类的静态方法创建子类的实例?

获取类属性的类型';TypeScript中的getter/setter

换行TypeScript';s具有泛型类型的推断数据类型

Typescript 从泛型推断类型

是否可以使用元组中对象的键来映射类型

当并非所有歧视值都已知时,如何缩小受歧视联盟的范围?

Typescript,如何从对象的对象中获取分离的类型