React 路由 -- React router(基础二)

141 阅读2分钟
(1) 从路由地址拿到参数

三种方法:

<1> 动态路由

路由注册要改为以下写法:

< Router path="/detail:id" component={Detail}>

加上冒号 :,说明该位置的数据为地址携带的参数

  • 可以在子组件的 props 属性的 match对象中的 params 对象中拿到

1891.png

<2> query 传参

路由注册跟之前一样,不要写成动态路由!!!

还是用 history.push() 方法,只不过写法不一样

history.push({pathname:'/detail' , query:{myId:id})

  • 可以在子组件的 props 属性的 location对象中的 query 对象中拿到

1901.png

<3> state 传参

路由注册跟之前一样,不要写成动态路由!!!

还是用 history.push() 方法,只不过写法不一样

history.push({pathname:'/detail' , state:{myId:id})

  • 可以在子组件的 props 属性的 location对象中的 state 对象中拿到

注意:

  • 后面两种写法不提倡使用,因为第一次渲染时,并没有进行路由跳转,即没有执行下面代码:

history.push({pathname:'/detail' , state:{myId:id})

  • 就会导致在子组件中拿不到数据!!会报错!!
(2) 路由拦截 & 路由守卫

路由守卫 ,我们经常发现,当我们访问一些网站或者一些软件时,往往会提醒我们进行注册登陆,甚至有一些,我们不登陆的话,一些页面是浏览不了的,这就是路由守卫!!

通过 < Router /> 的另一种渲染组件的写法:

使用函数返回匹配成功的组件!!!这样就可以在函数中进行逻辑判断,看用户是否已经登陆,从而决定能否给他展示该组件:如果没登陆的话,可以直接重定向到登录页面

1893.png

1892.png

(3) < withRouter />

之前我们说,如果是被 < Router /> 注册过路由的组件,那么它们就会被看作是路由组件的孩子,那么它们就会获得路由组件给它们传过去的一系列属性,eg: history 、location....

但如果我们的组件并不是路由组件的亲孩子,如果是孙子,祖孙呢,但我们也想在这些组件中去使用history 、location...这些对象,当然我们可以选择,一层一层把从路由组件获得的属性往下传...但是有更简单的,即把要使用这些属性的组件外面包上< withRouter /> 即可!!!

1894.png

细看