我有一条路由:

<Route path="/users/:userId?/:edit?" element={(<Users />)} />

Users是一个布局组件,我根据参数确定要渲染什么. 我在这个组件中有2个 Select :

  1. 如果没有参数,则渲染UsersList个组件.
  2. 如果有参数userId,则渲染UserPage组件.

UserPage里面我有模拟逻辑:

  1. 如果除了userId之外没有参数,则渲染UserPage组件.
  2. 如果包含参数'edit',则渲染UserEditPage组件.

现在我希望叉出UserPage个参数渲染

if (editParam) return <UserEditPage />
if (bookmarkParam) return <UserBookmarks />
return justRenderUserPage()

所以在我看来,这条路由看起来像是

<Route path="/users/:userId?/(:edit? || :/bookmakr?)" element={(<Users />)} />

然而,这不是工作 case .

我有一些 idea ,比如创建2条类似的路由:

<Route path="/users/:userId?/:edit?" element={(<Users />)} />
<Route path="/users/:userId?/:bookmark?" element={(<Users />)} />

或缩短路由

<Route path="/users/:userId?" element={(<Users />)} />

并在UserPage个组件内创建2条额外路由(创建子布局).

但这两种方式在我看来都有点丑陋,所以我想知道--对于此类任务有什么"最佳实践"吗?我想看看经验丰富的开发者会如何做.

推荐答案

每个可以匹配的URL路径只能有1个路由匹配,并且"/users/:userId?/:edit?""/users/:userId?/:bookmark?"具有相同的特异性,因此排名分数相同,因此可以匹配并渲染其中102.

如果您想使用单个路由定义来渲染单个Users,那么您需要根据106个特定路段而不是您决定命名的名称来拆分逻辑(because only one segment name is possible!).更新您想要"Forking "的段,为它提供一个更好的名称,例如editOrBookmark,然后在Users组件中判断that段的值,例如,是"edit""bookmark"还是undefined.

<Route path="/users/:userId?/:editOrBookmark?" element={(<Users />)} />

Users渲染逻辑可能类似于以下内容:

const { userId, editOrBookmark } = useParams();

...

switch(true) {
  case editOrBookmark === "edit":
    return <UserEditPage />;

  case editOrBookmark === "bookmark":
    return <UserBookmarks />;

  case !!userId:
    return <UserPage />;

  default:
    return <UsersList />;
}

我怀疑有一种方法可以单独使用路由 struct 来定义上述内容.

考虑以下几点:

...
<Route path="/users">
  <Route index element={<UsersList />} />
  <Route path=":userId">
    <Route index element={<UserPage />} />
    <Route path="edit" element={<UserEditPage />} />
    <Route path="bookmark" element={<UserBookmarks />} />

    {/* Redirect unknown URL paths back to index "/users/:userId" */}
    <Route path="*" element={<Navigate to="." replace />} />
  </Route>
</Route>
...

Javascript相关问答推荐

以逗号分隔的列表来数组并填充收件箱列表

事件错误:类型错误:无法读取未定义的属性(读取stopPropagation)

橡皮擦完全让画布变成白色

容器如何更改默认插槽中子项的显示?

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

网页自检测外部元素无法加载

在这种情况下,如何 for each 元素添加id?

CheckBox作为Vue3中的一个组件

如何在Angular17 APP中全局设置AXIOS

环境值在.js文件/Next.js中不起作用

OpenAI转录API错误请求

自定义确认组件未在vue.js的v菜单内打开

删除加载页面时不存在的元素(JavaScript)

按什么顺序接收`storage`事件?

图表4-堆叠线和条形图之间的填充区域

通过跳过某些元素的对象进行映射

为什么NULL不能在构造函数的.Prototype中工作

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

select 2-删除js插入的项目将其保留为选项