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。我试过功能(道具){…但仍然未定义在路由中呈现的dis
App.js
?如果没有,则没有路由信息。不,它是root@AljohnYamaro很抱歉误解了您的原始问题。我已更新了我的答案,以显示如何在根组件中访问路由详细信息。@DrewReese编辑的答案是正确的。单击“确定”不过,在使用内联函数时,请确保使用的是
Route
中的
render
prop,而不是
组件
prop。组件
prop将强制在每个渲染上完全重新安装组件,而不是更新它。我仅在使用
com时提到这一点ponent
而@DrewReese正确地使用了
render
。我不想让您忽略这一微小但重要的更改。谢谢您的回答,我想您的意思是获得它