Reactjs useParams可以在App.js内部使用吗?
你好,希望我没有打扰你们Reactjs useParams可以在App.js内部使用吗?,reactjs,parameters,react-hooks,react-router-dom,Reactjs,Parameters,React Hooks,React Router Dom,你好,希望我没有打扰你们 细节 我有一条这样的路 <Route path='/:project/:todo' component={Todo} /> localhost:3000/Project-1/todo-1 像这样交换路线 <Route path='/:project/:todo' component={Todo} /> 使用useparms返回,以便于提取项目和todo值我相信Route将道具注入到它渲染的组件中,因此您应该能够直接从todo中的匹配道具中提
细节 我有一条这样的路
<Route path='/:project/:todo' component={Todo} />
localhost:3000/Project-1/todo-1
像这样交换路线
<Route path='/:project/:todo' component={Todo} />
使用useparms返回,以便于提取项目和todo值我相信
Route
将道具注入到它渲染的组件中,因此您应该能够直接从todo
中的匹配
道具中提取它:this.props.match.params
您将有权在不同的位置匹配对象:
- 将组件路由为this.props.match
- 路由渲染为({match})=>()
- 将子项路由为({match})=>()
- 使用路由器作为this.props.match
- 匹配路径作为返回值
路由组件,或DOM树下的子组件。如果App.js
正在渲染路由器,它将不会拥有它
如果您需要对根App.js
中的route params执行某些操作,您可以在路由器中使用render prop将其包装在带有未指定路径的route中,以便它匹配所有路由。只需确保在任何开关
组件之外渲染,尽管开关只返回第一个匹配项,而不是所有匹配项
<Route
render={({ match }) => {
console.log('match', match);
// do what you need with the `match` prop, i.e. `match.params`
return null; // return null to indicate nothing should actually be rendered
}}
/>
{
console.log('match',match);
//使用'match'道具执行所需操作,即'match.params'`
return null;//return null表示实际不应呈现任何内容
}}
/>
我相信路由
会将道具注入到它渲染的组件中,因此您应该能够直接从Todo
中的匹配
道具中拉出它:this.props.match.params
您将有权在不同的位置匹配对象:
- 将组件路由为this.props.match
- 路由渲染为({match})=>()
- 将子项路由为({match})=>()
- 使用路由器作为this.props.match
- 匹配路径作为返回值
这仅适用于在路由上的路由器内渲染的组件,即正在渲染的路由组件,或DOM树下的子组件。如果App.js
正在渲染路由器,它将不会拥有它
如果您需要对根App.js
中的route params执行某些操作,您可以在路由器中使用render prop将其包装在带有未指定路径的route中,以便它匹配所有路由。只需确保在任何开关
组件之外渲染,尽管开关只返回第一个匹配项,而不是所有匹配项
<Route
render={({ match }) => {
console.log('match', match);
// do what you need with the `match` prop, i.e. `match.params`
return null; // return null to indicate nothing should actually be rendered
}}
/>
{
console.log('match',match);
//使用'match'道具执行所需操作,即'match.params'`
return null;//return null表示实际不应呈现任何内容
}}
/>
你能给我们看一下你的Todo
组件吗?@技术上祝你好运,我想这与Todo组件无关,但我还是会给你看screencast.com/t/QBDBM2UEAB7你说它与Todo无关,我很困惑useParams
旨在从由
呈现的组件中调用,就像您在Todo
组件中所做的一样。您是说如果您console.log(params.project,params.todo)
,控制台中不会返回任何内容吗?如果是这样的话,那么我想说下一步就是让我们看到一个代码沙盒。我在你的Todo
组件中没有发现任何错误。useParams
只能在你的Todo
组件或它的子树中工作,你正在App.js
中尝试它,因此未定义的
@技术上请原谅我刚才说的让你困惑的话,因为在Todo组件上,useParams工作得很好。你能给我们看一下你的Todo
组件吗?@技术上你好,我想这与Todo组件无关,但我还是会给它看screencast.com/t/qbDbM2UeAb7I对你说它与Todo无关感到困惑useParams
旨在从由
呈现的组件中调用,就像您在Todo
组件中所做的一样。您是说如果您console.log(params.project,params.todo)
,控制台中不会返回任何内容吗?如果是这样的话,那么我想说下一步就是让我们看到一个代码沙盒。我在你的Todo
组件中没有发现任何错误。useParams
只能在你的Todo
组件或它的子树中工作,你正在App.js
中尝试它,因此未定义的
@技术上请原谅我刚才说的让你困惑的话,因为在Todo组件上,useParams工作得很好。谢谢你的回答,我想你的意思是在Todo中使用它,对吗?对不起,这与此无关。我的目标是App.js。我试过功能(道具){…但仍然未定义在路由中呈现的disApp.js
?如果没有,则没有路由信息。不,它是root@AljohnYamaro很抱歉误解了您的原始问题。我已更新了我的答案,以显示如何在根组件中访问路由详细信息。@DrewReese编辑的答案是正确的。单击“确定”不过,在使用内联函数时,请确保使用的是Route
中的render
prop,而不是组件
prop。组件prop将强制在每个渲染上完全重新安装组件,而不是更新它。我仅在使用com时提到这一点ponent
而@DrewReese正确地使用了render
。我不想让您忽略这一微小但重要的更改。谢谢您的回答,我想您的意思是获得它