测试用例
https://codesandbox.io/s/rr00y9w2wm
重现步骤
- 点击主题
- 点击使用 React 渲染
或者
预期行为
match.params.topicId
应该与父主题组件相同 应该与match.params.topicId
在主题组件中访问时相同
实际行为
match.params.topicId
在Topic组件中访问时未定义match.params.topicId
在主题组件中访问时正在呈现
我从这个封闭的问题中了解到,这不一定是一个错误。
此要求在想要在工厂 Web 应用程序中创建运行的用户中非常普遍,其中Topics
父级组件需要访问match.params.paramId其中paramId
是匹配嵌套(子)组件的 URL 参数Topic
:
const Topic = ({ match }) => (
<div>
<h2>Topic ID param from Topic Components</h2>
<h3>{match.params.topicId}</h3>
</div>
);
const Topics = ({ match }) => (
<div>
<h2>Topics</h2>
<h3>{match.params.topicId || "undefined"}</h3>
<Route path={`${match.url}/:topicId`} component={Topic} />
...
</div>
);
在一般意义上,Topics
可以是抽屉或导航菜单组件,Topic
也可以是任何子组件,就像在我正在开发的应用程序中一样。子组件有它自己的:topicId
参数,它有它自己的(假设)<Route path="sections/:sectionId" component={Section} />
路由/组件。
更痛苦的是,导航菜单不需要与组件树具有一对一的关系。有时,菜单根级别的项目(例如Topics
,Sections
等)可能对应于嵌套结构(Sections
仅呈现在主题下,/topics/:topicId/sections/:sectionId
尽管它有自己的规范化列表,用户可以在导航中的标题部分下使用)酒吧)。因此,当点击Sections时,它应该被突出显示,而不是Sections 和 Topics。
由于位于应用程序根级别的导航栏组件无法使用sectionId
orsections
路径,因此有必要为这种常见用例编写这样的hack。
我在 React Router 方面根本不是专家,所以如果有人可以为这个用例冒险一个适当的优雅解决方案,我会认为这是一项富有成效的努力。优雅,我的意思是
- 使用
match
而不是history.location.pathname
- 不涉及像手动解析
window.location.xxx
- 不使用
this.props.location.pathname
- 不使用第三方库,如
path-to-regexp
- 不使用查询参数
其他黑客/部分解决方案/相关问题:
蒂亚!