我有一个react 前台.代码如下所示.我的问题是,我需要在导航菜单中获取<Routes>以外的路由信息,而我不能使用useParams().另一方面,我试图将<Routes>移到<NavMenu>之外,但得到一个错误:

Error: [default] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>

在Reaction 18之前,我可以使用this.props.location.pathname.split...,但这也是一种变通方法.此外,withRouterreact-router-dom@6中也不再可用.

代码,非常简单:

Index.tsx

ReactDOM.createRoot(document.getElementById('react-hook'))
    .render(
        <Provider store={store}>
            <BrowserRouter>
                <App />
            </BrowserRouter>
        </Provider>
    );

App.tsx

export default () => (
    <Layout>
        <Routes>
            <Route path='/:auxParam/site/foo/:startIndex?' Component={Extra} />
        </Routes>
    </Layout>
);

Layout.tsx

export default (props: { children?: React.ReactNode }) => (
    <React.Fragment>
        <NavMenu />
        <Container tag="main">
            {props.children}
        </Container>
    </React.Fragment>
);

导航菜单.tsx导航菜单.tsx

class NavMenu extends React.PureComponent<NavMenuProps, { isOpen: boolean }> {
  public render() {
    const auxParam: string = ...?...; // how to get it?
    return (
      <header>
        <Navbar>
          <Container>
            <NavbarBrand tag={Link} to="/">My site (React)</NavbarBrand>
            <ul>
              <NavItem>
                <NavLink tag={Link} to={`/${aux}/site/foo`}>Extra</NavLink>
              </NavItem>
            </ul>
          </Container>
        </Navbar>
      </header>
    );
  }
}
export default NavMenu;

推荐答案

Layout更新为布局路由组件,例如,它呈现Outlet组件而不是childrenprops .

示例:

Layout.tsx

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

export default () => (
  <React.Fragment>
    <NavMenu />
    <Container tag="main">
      <Outlet />
    </Container>
  </React.Fragment>
);

App.tsx

elementprops 上渲染Extra.Componentprops 仅在数据路由中有用.

export default () => (
  <Routes>
    <Route element={<Layout />}>
      <Route path='/:auxParam/site/foo/:startIndex?' element={<Extra />} />
    </Route>
  </Routes>
);

NavMenu.tsx

将此组件转换为Reaction函数组件,以便它可以使用useParams挂钩.

import { Link, useParams } from 'react-router-dom';
...

const NavMenu () => {
  const { auxParam } = useParams();

  return (
    <header>
      <Navbar>
        <Container>
          <NavbarBrand tag={Link} to="/">My site (React)</NavbarBrand>
          <ul>
            <NavItem>
              <NavLink tag={Link} to={`/${aux}/site/foo`}>
                Extra
              </NavLink>
            </NavItem>
          </ul>
        </Container>
      </Navbar>
    </header>
  );
}

export default NavMenu;

Typescript相关问答推荐

ReturnType此索引方法与点表示法之间的差异

防止获取发出不需要的请求

将props传递给子组件并有条件地呈现它''

是否使用非显式名称隔离在对象属性上声明的接口的内部类型?

如何重构长联合类型?

为什么在回调函数的参数中不使用类型保护?

如何使我的函数专门针对联合标记?

我可以以这样一种方式键入对象,只允许它的键作为它的值吗?

如何在NX工作区项目.json中设置类似angular.json的两个项目构建配置?

刷新页面时,TypeScrip Redux丢失状态

与toast.error一起react 中的Async TUNK错误消息

TypeScrip-根据一个参数值验证另一个参数值

NPM使用Vite Reaction应用程序运行预览有效,但我无法将其部署到Netlify

具有匹配功能的TS通用事件处理程序

设置不允许相同类型的多个参数的线性规则

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

递归类型别名的Typescript 使用

TS不能自己推断函数返回类型

窄SomeType与SomeType[]

如何在TypeScript类成员函数中使用筛选后的keyof this?