React-router-v6 访问一个 url 参数

IT技术 reactjs react-router react-router-dom
2021-04-20 01:50:53

如何在我的 React 组件中访问 url 参数?

应用程序.js

<Route path="/question/:id" element={<QuestionView />} />

QuestionView.js

class QuestionView extends React.Component {     
    render() {
          const { questions, users } = this.props;
          const {id} = ??? 
1个回答

问题

在 react-router-dom v6 中,Route组件不再有 route props ( history, location, and match),当前的解决方案是使用 React 钩子的“版本”来在被渲染的组件中使用。但是,React 钩子不能在类组件中使用。

要使用类组件访问匹配参数,您必须转换为函数组件,或者滚动您自己的自定义withRouter高阶组件以注入“路由props”,就像v5.x 中withRouterHOCreact-router-dom所做的那样。

解决方案

我不会介绍将类组件转换为函数组件。这是一个自定义withRouterHOC示例

const withRouter = WrappedComponent => props => {
  const params = useParams();
  // etc... other react-router-dom v6 hooks

  return (
    <WrappedComponent
      {...props}
      params={params}
      // etc...
    />
  );
};

并用新的 HOC 装饰组件。

export default withRouter(Post);

这将为params类组件注入一个props。

this.props.params.id
谢谢,你解决了,我的问题也解决了
2021-06-05 01:50:53
感谢您的回复@DrewReese
2021-06-05 01:50:53
用于typescript const withRouter = (WrappedComponent: any) => (props: any) => { ... };
2021-06-09 01:50:53
@SabaoonBedar 这就是这个答案解决的问题。RRDv6 不导出withRouterHOC,因此如果您需要一个仍然接收路由道具的“遗留”组件,则必须推出自己HOC。
2021-06-16 01:50:53
当您从 react-router-dom 导入 withRouter 时,它会出现此错误:尝试导入错误:“react-router-dom”不包含默认导出(作为“withRouter”导入)。
2021-06-21 01:50:53