我发现我必须重新组织我的路由,从Reaction-Router-Dom v5切换到V6.

我有一条外部路由:

<Route
  path="/abc/product/:skuType/:skuPage?"
  element={
    <PrivateRoute>
      <ProductRoutesStructure />
    </PrivateRoute>
  }
/>

但我的路由都不匹配.所以我不确定如何匹配.例如,在一条路由中,它看起来是这样的:'abc/product/1234/converse'

我正在做这件事:

export const ProductRoutesStructure = () => (
  <Routes key="productRoutes">
    <Route
      path={`/abc/product/:skuType/:skuPage(${Types.CONVERSE})`} 
      element={<SneakerPage />}
    />
    <Route
      path={`/abc/product/:skuType/:skuPage(${Types.PANTS})`} 
      element={<PantsPage />}
    />
    <Route path="*" element={<GenericPage />} />
  </Routes>
)

问题是,skuTypeskuPage必须是动态的,就像在这element个组件中一样,因为我达到了某些API.我只是真的需要在skuPage号公路上匹配一下.

我想我遗漏了一些子页的细微差别.我试着只匹配"Types.CONVERSE",但这是不可行的,它总是缺省为最后一位"*"-all-all路由.

这正是我所期待的,这在v5中非常有效,因为这是我使用的实际代码(路径不同/名称).但完全一样.效果很好,但V6,不行.

因此,如果用户转到"www.myDomain/abc/product/male/converse"

我预计这将与这条路由相匹配:

<Route
  path={`/abc/product/:skuType/:skuPage(${Types.CONVERSE})`} 
 element={<SneakerPage />}
/>

如果用户达到"www.myDomain/abc/product/female/pants"

它将匹配:

<Route
  path={`/abc/product/:skuType/:skuPage(${Types.PANTS})`}
  element={<PantsPage />}
/>

但让我们让它发挥作用吧.我在ProductRoutesStructure英里内更改路由没有问题,但我try 了许多组合,但没有一种组合匹配.

请注意,我确实需要skuTypeskuPage对子组件/页面可用,这就是为什么我在基本路由中需要它.

推荐答案

据我所知,您基本上有这"/abc/product/:skuType/:skuPage"路由路径,您希望在其上匹配和呈现动态内容.

建议1

呈现单个"/abc/product/:skuType/:skuPage"路由,并使用常规的旧Java switch语句基于skuPage路由路径参数有条件地呈现正确的路由内容.

外部路由

<Routes>
  <Route
    path="/abc/product/:skuType/:skuPage"
    element={
      <PrivateRoute>
        <ProductRoutsStructure />
      </PrivateRoute>
    }
  />
</Routes>

产品布线 struct

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

const ProductRoutsStructure = () => {
  const { skuPage } = useParams();

  switch (skuPage) {
    case Types.CONVERSE:
      return <SneakerPage />;

    case Types.PANTS:
      return <PantsPage />;

    default:
      return <GenericPage />;
  }
};

被路由的内容组件使用useParams挂钩来访问它们的路由参数.

const SneakerPage = () => {
  const { skuPage, skuType } = useParams();

  return (
    <>
      <h1>SneakerPage</h1>
      <div>{skuType} - {skuPage}</div>
    </>
  );
};

const PantsPage = () => {
  const { skuPage, skuType } = useParams();

  return (
    <>
      <h1>PantsPage</h1>
      <div>{skuType} - {skuPage}</div>
    </>
  );
};

演示1

Edit react-react-dom-v6-how-do-i-match-subpages-i-was-on-v5

enter image description here

建议2

直接呈现每个特定的skuPage,将skuPage值作为props 向下传递给路由的内容组件.

外部路由

<Routes>
  <Route
    path="/abc/product/:skuType/*" // <-- wildcard matcher for descendent routes
    element={
      <PrivateRoute>
        <ProductRoutsStructure />
      </PrivateRoute>
    }
  />
</Routes>

ProductRoutsStructure

const ProductRoutsStructure = () => (
  <Routes key="productRoutes">
    <Route
      path={Types.CONVERSE}
      element={<SneakerPage skuPage={Types.CONVERSE} />}
    />
    <Route path={Types.PANTS} element={<PantsPage skuPage={Types.PANTS} />} />
    <Route path="*" element={<GenericPage />} />
  </Routes>
);
const SneakerPage = ({ skuPage }) => {
  const { skuType } = useParams();

  return (
    <>
      <h1>SneakerPage</h1>
      <div>
        {skuType} - {skuPage}
      </div>
    </>
  );
};

const PantsPage = ({ skuPage }) => {
  const { skuType } = useParams();

  return (
    <>
      <h1>PantsPage</h1>
      <div>
        {skuType} - {skuPage}
      </div>
    </>
  );
};

演示2

Edit react-react-dom-v6-how-do-i-match-subpages-i-was-on-v5(version 2)

enter image description here

Javascript相关问答推荐

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

在grafana情节,避免冲突的情节和传说

在拖放时阻止文件打开

如何将react—flanet map添加到remixjs应用程序

Chart.js-显示值应该在其中的引用区域

编辑文本无响应.onClick(扩展脚本)

我怎么在JS里连续加2个骰子的和呢?

material UI按钮组样式props 不反射

WhatsApp Cloud API上载问题:由于MIME类型不正确而导致接收&Quot;INVALID_REQUEST";错误

为什么我的getAsFile()方法返回空?

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

如何将zoom 变换应用到我的d3力有向图?

Reaction Redux&Quot;在派单错误中检测到状态Mutations

在SHINY R中的嵌套模块中,不能使用Java代码

Cherrio JS返回父div的所有图像SRC

如何设置时间选取器的起始值,仅当它获得焦点时?

是否有静态版本的`instanceof`?

我如何才能让p5.js在不使用实例模式的情况下工作?

为什么我的InDesign Java脚本不能完全工作?

调试jQuery代码以获取所有行的总和(票证类型)