React路由配置

250 阅读2分钟

添加首页

使用IndexRoute设置默认页面(此时App的render中的this.props.children为元素)


路径写法

在多层嵌套路由中使用绝对路径(可能在动态路由中无法使用)

  • 使用/message/:id替代message/:id
  • 再使用重定向写法将"/inbox/messages/:id"地址都匹配跳转到"/messages/:id"  
  • 也可以转换成JSX结构


路径语法

  • :paramName   其中paramName作为参数
  • ()   在其内部的内容被认为是可选的
  • *   匹配任意字符(非贪婪的)知道命中下一个字符或整个URL的末尾


优先级

根据定义的顺序由上向下匹配路由(要确认前一个路由不会匹配到后一个路由中的路径)


跳转前确认

 routerWillLeave生命周期钩子可以使React组件拦截正在发生的跳转或在离开route前提示用户。

  •  routerWillLeave有两个返回值:

    • return false   取消此次跳转

    • return "提示信息"   在离开route前提示用户进行确认

  1. 在route组件中引入Lifecycle,并用mixin安装

  1. 若在深层嵌套的组件中使用routerWillLeave钩子,需要在route组件中引入RouteContext,并用mixin安装


在组件外部使用导航

组件内部使用this.context.router实现导航,在组件外部使用Router组件上的history实现导航


组件生命周期

路由配置:

  • 当用户打开"/"页面时,组件生命周期的状态:

  • 当用户从 '/' 跳转到 '/invoice/123'时,组件生命周期的状态:

   -   App 从 router 中接收到新的 props(例如 children、params、location 等数据), 所以 App 触发了 componentWillReceiveProps 和 componentDidUpdate 两个生命周期方法
   -   Home 不再被渲染,所以它将被移除
   -   Invoice 首次被挂载
  • 当用户从 "/invoice/123" 跳转到 "/invoice/789"

   -   所有的组件之前都已经被挂载, 所以只是从 router 更新了 props.
  • 当从 "/invoice/789" 跳转到 "/accounts/123"

  • Invoice 组件的数据获取功能