与Reach路由器(没有反应路由器!)我有两条嵌套路线:
/g/123 /g/123/about
其中123是:groupId参数:
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参数:
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/123的PostsView时,它可以正常工作,并在GroupPage中接收到123的groupId,但是当我到/g/123/about时,groupId丢失了,params为null (在GroupPage中使用useParams时仍然是空的)。
如果我将useParams从GroupPage移到嵌套的AboutView中,那么我可以从/g/123/about接收params和groupId,但这是令人沮丧的,因为我不想重复多个嵌套组件的逻辑,而希望将其放在外部GroupPage组件中(这需要groupId查询与组相关的数据的API,然后使用上下文使其可用于这些嵌套组件)。
我是不是做错了什么,有没有办法达到我所需要的?谢谢。
发布于 2020-07-16 13:39:42
我发现我可以在通配符中使用useMatch来实现这一点:
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。
除非有人知道更好的方法,否则我们可以认为这个问题已经解决:)
发布于 2020-07-16 13:20:00
您将不会为useParams()获得用于AboutView组件的任何参数,因为路由在那里没有任何params。
您可以在上下文中设置groupId并在AboutView中使用它
发布于 2021-02-02 15:46:35
也许这个解决方案能帮到你:
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;https://stackoverflow.com/questions/62935495
复制相似问题