首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有嵌套路由的Reach路由器无法解析params

使用带有嵌套路由的Reach路由器无法解析params
EN

Stack Overflow用户
提问于 2020-07-16 13:08:35
回答 3查看 1K关注 0票数 1

与Reach路由器(没有反应路由器!)我有两条嵌套路线:

/g/123 /g/123/about

其中123是:groupId参数:

代码语言:javascript
复制
import React from "react";
import { Router } from "@reach/router";
import GroupPage from "../components/dynamic-pages/group";
import PostsView from "../components/group/views/posts";
import AboutView from "../components/group/views/about";

const App = () => {
  return (
    <Router>
      <GroupPage path="/g/:groupId">
        <PostsView path="/" />
        <AboutView path="/about" />
      </GroupPage>
    </Router>
  );
};

export default App;

在外部GroupPage组件中,我需要使用:groupId参数:

代码语言:javascript
复制
const GroupPage: React.FC<RouteComponentProps> = ({ children }) => {
  debugger;
  const params = useParams();
  const groupId = params.groupId as string;

  // query an API using groupId and store it in a context to be 
  // accessible to other nested components (such as AboutView and PostsView)

当我转到呈现/g/123PostsView时,它可以正常工作,并在GroupPage中接收到123的groupId,但是当我到/g/123/about时,groupId丢失了,params为null (在GroupPage中使用useParams时仍然是空的)。

如果我将useParamsGroupPage移到嵌套的AboutView中,那么我可以从/g/123/about接收paramsgroupId,但这是令人沮丧的,因为我不想重复多个嵌套组件的逻辑,而希望将其放在外部GroupPage组件中(这需要groupId查询与组相关的数据的API,然后使用上下文使其可用于这些嵌套组件)。

我是不是做错了什么,有没有办法达到我所需要的?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-16 13:39:42

我发现我可以在通配符中使用useMatch来实现这一点:

代码语言:javascript
复制
const GroupPage: React.FC<RouteComponentProps> = ({ children }) => {
  debugger;
  const match = useMatch("/g/:groupId/*");
  const groupId = match?.groupId as string;

文档:https://reach.tech/router/api/useMatch

这总是返回PostsView和AboutView路由的AboutView。

除非有人知道更好的方法,否则我们可以认为这个问题已经解决:)

票数 5
EN

Stack Overflow用户

发布于 2020-07-16 13:20:00

您将不会为useParams()获得用于AboutView组件的任何参数,因为路由在那里没有任何params。

您可以在上下文中设置groupId并在AboutView中使用它

票数 0
EN

Stack Overflow用户

发布于 2021-02-02 15:46:35

也许这个解决方案能帮到你:

代码语言:javascript
复制
import React from "react";
import { Router } from "@reach/router";
import GroupPage from "../components/dynamic-pages/group";
import PostsView from "../components/group/views/posts";
import AboutView from "../components/group/views/about";

const App = () => {
  return (
    <Router>
      <GroupPage path="g/:groupId">
        <PostsView path="/" />
      </GroupPage>

      <GroupPage path="g/:groupId/about">
        <AboutView path="/" />
      </GroupPage>
    </Router>
  );
};

export default App;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62935495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档