【问题标题】:Can useParams be able to use inside App.js?useParams 可以在 App.js 中使用吗?
【发布时间】:2020-04-22 05:01:15
【问题描述】:

美好的一天,希望我没有打扰你们。


详情

我有这样的路径

localhost:3000/Project-1/todo-1

和这样的路由切换

<Route path='/:project/:todo' component={Todo} />

预期输出

当浏览器在示例路径中时,我期望 App.js 也可以使用 useParams 获取参数对象,但显示为空。我误用了钩子吗?谢谢你的回答。


其他细节

我确实使用了 useLocation 来返回类似路径的东西,但这不是我的目标,它应该是类似

params: { 
  project: 'Project-1', 
  todo: 'todo-1 '
}

使用 useParams 返回,以便于提取项目和待办事项值

【问题讨论】:

  • 你能告诉我们你的Todo组件吗?
  • @technicallynick 美好的一天,我想这与 Todo 组件无关,但我仍然会展示它 screencast.com/t/qbDbM2UeAb7
  • 我对你的说法感到困惑,即它与 Todo 无关。 useParams 旨在从由&lt;Route /&gt; 呈现的组件中调用,就像在Todo 组件中一样。你是说如果你console.log(params.project, params.todo),你的控制台什么都没有返回?如果是这样,那么我会说一个供我们查看的代码框将是下一步。我在您的 Todo 组件中没有发现任何问题。
  • useParams 只能在您的 Todo 组件或其子树中工作,您正在从 App.js 尝试它,因此是 undefined
  • @technicallynick 请原谅我刚才提出的混淆 让您感到困惑,因为在 Todo 组件上 useParams 效果很好。

标签: reactjs parameters react-hooks react-router-dom


【解决方案1】:

我相信Route 会向它渲染的组件注入道具,因此您应该能够直接从Todo 内的match 道具中提取它:this.props.match.params

您将可以访问不同位置的匹配对象:

  • 将组件路由为 this.props.match
  • 路由渲染为 ({ match }) => ()
  • 将子节点路由为 ({ match }) => ()
  • withRouter as this.props.match
  • matchPath 作为返回值

https://reacttraining.com/react-router/web/api/match

这仅适用于在路由上的路由器渲染的组件,即Route 正在渲染的组件或子组件组件位于 DOM 树的下方。如果App.js 正在渲染路由器,它将没有它。

如果您需要对根 App.js 中的路由参数做一些事情,您可以使用未指定的路径将其包装在一个路由中,以便它匹配所有路由,在您的路由器中使用 render 属性。只需确保它在任何 Switch 组件之外呈现,尽管开关 only 返回第一个匹配项,而不是所有匹配项。

<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
  }}
/>

【讨论】:

  • 谢谢你的回答,我猜你的意思是让它进入 Todo 对吧?对不起,但这与它无关。我的目标是 App.js。我试过 function(props) { ... 但仍然未定义
  • App.js 是否在路由中呈现?如果不是,则没有路线信息。
  • 不,是根
  • @AljohnYamaro 很抱歉误解了您的原始问题。我已经更新了我的答案,以展示如何在你的根组件中访问路由详细信息。
  • @DrewReese 的编辑答案是正确的。不过,为了更精细一点,请确保在使用内联函数时使用 Route 中的 render 道具,而不是 component 道具。 component 属性将强制在每次渲染时完全重新安装组件,而不是更新它。我只提到这一点,因为您的示例使用component,而@DrewReese 正确使用render。我不想让你忽视这个小而重要的变化。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 2021-03-07
  • 1970-01-01
  • 2021-03-10
  • 2021-12-27
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多