据我所知,<Route path="/" component={App} />将提供App个路由相关props ,比如locationparams.如果我的App组件有许多嵌套的子组件,我如何让子组件能够访问这些props ,而不必:

  • 从应用程序传递props
  • 使用窗口对象
  • 为嵌套子零部件创建管线

我以为this.context.router会有一些与路由相关的信息,但this.context.router似乎只有一些操作路由的功能.

推荐答案

V6

您可以在组件中使用useNavigateuseLocationuseMatch来获得matchPathnavigatelocation.

const Child = () => {
  const location = useLocation();
  const navigate = useNavigate();
  const match = useMatch("write-the-url-you-want-to-match-here");

  return (
    <div>{location.pathname}</div>
  )
}

export default Child

V5.1 & Hooks (Requires React >= 16.8)

您可以在组件中使用useHistoryuseLocationuseRouteMatch来获得matchhistorylocation.

const Child = () => {
  const location = useLocation();
  const history = useHistory();
  const match = useRouteMatch("write-the-url-you-want-to-match-here");

  return (
    <div>{location.pathname}</div>
  )
}

export default Child

V4 & V5

您可以使用withRouter HOC在组件props 中注入matchhistorylocation.

class Child extends React.Component {
  static propTypes = {
    match: PropTypes.object.isRequired,
    location: PropTypes.object.isRequired,
    history: PropTypes.object.isRequired
  }

  render() {
    const { match, location, history } = this.props

    return (
      <div>{location.pathname}</div>
    )
  }
}

export default withRouter(Child)

V3

你可以使用withRouter HOC在你的组件props 中注入routerparamslocationroutes.

class Child extends React.Component {

  render() {
    const { router, params, location, routes } = this.props

    return (
      <div>{location.pathname}</div>
    )
  }
}

export default withRouter(Child)

Original answer

如果你不想使用props ,可以使用React Router documentation中描述的上下文

首先,你必须设置你的childContextTypesgetChildContext

class App extends React.Component{
  
  getChildContext() {
    return {
      location: this.props.location
    }
  }

  render() {
    return <Child/>;
  }
}

App.childContextTypes = {
    location: React.PropTypes.object
}

然后,您将能够使用如下上下文访问子组件中的location对象

class Child extends React.Component{
   
   render() {
     return (
       <div>{this.context.location.pathname}</div>
     )
   }
   
}

Child.contextTypes = {
    location: React.PropTypes.object
 }

Reactjs相关问答推荐

获取this.props.match.params.id未定义

实时收听react前端应用程序中的webhook响应

如何通过TEK查询将对象传递到Express后台

Npm运行构建`在Next.js 14中不起作用

错误./src/TopScroll.js 31:21-31导出';(作为';随路由导入)在';Reaction-Router-Dom';中找不到

如何使用皮金贴图在Reactjs中制作 map 上的点之间的线的动画?

StyleX中的多语言支持

如何从react 18-nextjs 14应用程序路由中的客户端组件呈现服务器组件?

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

如何将 npm 包添加到我的 Vite + React 应用程序中?

无法从子组件传递数据到父组件

react-router v6 中的 BrowserRouter 和 createBrowserRouter 有什么区别?我可以在不使用数据 API 的情况下使用 createBrowserRouter 吗?

状态链接未传递到路由页面

在准备回调中使用状态属性(Redux 工具包)

使用 Jest/React 测试库时,如何测试由 setInterval 函数创建的 DOM 更改?

map 未显示在react 传单中

导航到屏幕时,react 本机上下文状态变为未定义

谁能根据经验提供有关 useEffect 挂钩的更多信息

当页面重新加载react 路由导航到第一页 v6

找不到元素 - 这是参考问题吗?