react-router-dom6类组件中使用编程式路由

394 阅读1分钟

前言

在react-router-dom6中不再提供withRouter这个高阶组件。官方推荐使用hooks,useNavigate。但是在类组件中无法使用hooks。因此我们需要自己封装一个withRouter的高阶组件。

withRouter实现

import React from 'react'
import type { NavigateFunction } from 'react-router-dom'
import { useLocation, useNavigate, useParams } from 'react-router-dom'

export interface RoutedProps<Params = any, State = any> {
  location: State
  navigate: NavigateFunction
  params: Params
}

export function withRouter<P extends RoutedProps>(Child: React.ComponentClass<P>) {
  return (props: Omit<P, keyof RoutedProps>) => {
    const location = useLocation()
    const navigate = useNavigate()
    const params = useParams()
    return <Child { ...props as P } navigate={ navigate } location={ location } params={ params }/>
  }
}