假设我的网站上有以下页面

  • 第1页:example.com/somepage.php?action=a
  • 第2页:example.com/somepage.php?action=b
  • 第3页:example.com/somepage.php?action=b&other=c

重要提示:我无法控制URL路径,这就是它们是如何设置的,这就是它们远不理想的原因.

我正在创建一个Reaction应用程序,并试图设置路由,所以我是从以下几个方面开始的:

function MyNav () {
    return (
        <Routes>
            <Route path='/somepage.php?action=a' element={<Page1 />} />
            <Route path='/somepage.php?action=b' element={<Page2 />} />
            <Route path='/somepage.php?action=b&other=c' element={<Page3 />} />
            <Route path='*' element={<Page1 />} />
        </Routes>
    )
}

但这并没有奏效.经过调查,在看了window.location个物体后,原来<Route/>中的path将与location.pathname相提并论.因此,对于上面的所有页面,window.location个对象将如下所示:

window.location
    ...
    pathname: "/somepage.php"
    search: "?action=a" // <-------- this is for Page 1, and will be different for Page 2 and Page 3
    ...

因此,第1页的路由应设置如下

<Routes>
    <Route path='/somepage.php' element={<Page1 />} />
    ...
</Routes>

但这会产生问题,因为所有页面的路径都是相同的,如下所示:

<Routes>
    <Route path='/somepage.php' element={<Page1 />} />
    <Route path='/somepage.php' element={<Page2 />} />
    <Route path='/somepage.php' element={<Page3 />} />
    <Route path='*' element={<Page1 />} />
</Routes>

现在,为了解决上面的问题,我找到了this solution个,所以我稍微修改了一下代码,如下所示

function MyNav () {
    
    const getPage = (location) => {
        
        const params = new URL(location.href).searchParams;
        const action = params.get('action');
        const other = params.get('other');
        
        if (action == 'a') {
            return <Page1 />
        }

        if (action == 'b') {
            if (other == 'c') {
                return <Page3 />
            }

            else {
                return <Page2 />
            }
        }
    }
    
    
    return (
        <Routes>
            <Route path='/somepage.php' element={ getPage (location) } />
            <Route path='*' element={<Page1 />} />
        </Routes>
    )
}

现在这招起作用了(耶!),然而它违背了<Route/>pathprops 的目的.那么,有没有办法从<Route/>内搜索directly个搜索参数呢?也许是这样的?(IMPORTANT: THE FOLLOWING IS PSEUDO CODE)

<Routes>
    <Route path='/somepage.php' params='action=a' element={<Page1 />} />
    <Route path='/somepage.php' params='action=b' element={<Page2 />} />
    <Route path='/somepage.php' params='action=b&other=c' element={<Page3 />} />
    <Route path='*' element={<Page1 />} />
</Routes>

推荐答案

RRD只关心与路由匹配有关的URL的路径部分.您的中间实现是最接近正确的.您可以做的最好的事情就是呈现与URL路径匹配的单个路由,并判断路由组件中的queryString.我建议将其重构到它自己的组件中,该组件读取queryString并有条件地返回正确的组件.

示例:

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

const Page = () => {
  const [searchParams] = useSearchParams();
  const action = searchParams.get("action");
  const other = searchParams.get("other");

  switch(action) {
    case "a":
    default:
      return <Page1 />;

    case "b":
      switch(other) {
        case "c":
          return <Page3 />;

        default:
          return <Page2 />;
      }
  }
};
<Routes>
  <Route path='/somepage.php' element={<Page />} />
  <Route path='*' element={<Page1 />} />
</Routes>

Reactjs相关问答推荐

我想将状态设置为true,直到每一张卡片都生成并在多姆中呈现

使用useEffect挂钩获取数据

在Reaction+Redux+RTKQuery中对API调用进行排序

根据另一个Select中的选定值更改Select中的值

从Microsoft Excel粘贴复制的单元格时,将Excel单元格格式(粗体、下划线、斜体)带入Reaction

XChaCha20-Poly1305的解密函数

每次单击按钮时,Reaction组件都会重新生成

Reaction路由DOM v6不包含上下文(Supabase)

使用experial_useFormState将参数传递给服务器操作

在React中使用if条件时如何更改Tailwind中元素的文本 colored颜色

Mui Datepicker 设置了错误的日期

为 Next.js 应用程序目录中的所有页面添加逻辑的全局文件是什么?

我可以同时使用 Gatsby 和 NEXT.JS 吗?

React Js和Firestore中如何将当前ID与集合中的ID查询以仅显示具有相似字段和值的文档-第二部分

React - 将一个充满空值的无限大小的数组存储在 ref 中是否可以,或者我应该重置数组吗?

Zod 验证模式根据另一个数组字段使字段成为必需字段

在react 中单击父级中的按钮时如何将数据从子级发送到父级?

如何在悬停时更改 MUI 卡内容

如何在自定义 JSX 元素上声明属性?

如何根据数据库中的值设置单选按钮选中? - react