• React三种路由参数传递方式


    React三种路由参数传递方式

    主要是Link跳转路由和注册路由的时候,要相互配合,才能助力参数的传递

     

    首先看一下,路由传递过去的参数

     

     

    通过params参数

    基本使用:

    <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>&nbsp;&nbsp;
    ​
    ​
    <Route path="/home/message/detail/:id/:title" component={Detail}/>

    如果Route的path属性为 /home/message/detail/ 的话,是接受不到params参数的,为什么呢?

    • 由于模糊匹配,因为我们的Detail组件的路由就是/home/message/detail,所以后面的传输其实并不会接收到的

    • 所以我们就要在Route注册路由的时候就把要接收的params参数写上才行

    // 接收:
    const {id, title} = this.props.match.params

     

    通过search参数

    <Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link><Route path="/home/message/detail" component={Detail}/>
    • 声明接收search参数(无需声明接收),直接正常注册路由就可以了

     

    接收

    const {search} = this.props.location

    search得到的是一个 ?key1=value1&key2 =value2 ,但是我们要得到的是 {key1:value1,key2:value2}格式,所以就要对这两种不同的模式进行切换,这种转换并不需要我们做,有一个 库:querystring(一般简称为qs)

    不同的存储格式:

    urlencoded:(key value用等号,多个key-value用&来分割,比如key=value&key=value)格式

    对象格式:{key:value,key:value}

    方法:

    • qs.stringify(obg): 转换成urlencoded模式

    • qs.parse(str) :转换成obj对象模式

     

    但是:?key1=value1&key2 =value2,前面还有一个?,所以要把?分割才能用parse函数

     import qs from 'querystring'
     
     const {search} = this.props.location
     const {id, title} = qs.parse(search.slice(1)) 

     

    通过state传递

    可以发现不管是search还是params都是把传递的数据直接暴露在地址中了,state的话主要是携带参数,但是不想让这些参数让用户知道

     

    <Link to={{pathname: '/home/message/detail/', state:{id:msgObj.id, title:msgObj.title}}}>{msgObj.title}</Link><Route path="/home/message/detail" component={Detail}/>
    • 声明接收state参数(无需声明接收),直接正常注册路由就可以了

     

    接收

    // 接收search参数
    const {id, title} = this.props.location.state || {}

     

    拓展1:路由跳转模式(push、replace)

    默认是push

    直接就是栈式路由,而replace直接把当前路由在栈中代替掉,而push式直接在栈顶加入

    转换成replace模式:

    <Link replace={true} to={{pathname: '/home/message/detail/', state:{id:msgObj.id, title:msgObj.title}}}>{msgObj.title}</Link>

    简化模式:

    <Link replace to={{pathname: '/home/message/detail/', state:{id:msgObj.id, title:msgObj.title}}}>{msgObj.title}</Link>

     

    拓展2:编程式路由导航

    直接通过 Link、NavLink来直接在标签的属性中设置 to属性,来设置跳转的页面,这种就是标签式的路由导航,但是如果想要在函数中实现路由跳转

    直接操作history对象里面的相关方法即可了

    直接通过 操作history的go函数、replace函数等等,也就是点击按钮,触发函数后,直接在函数中操作路由,而不是通过Link或者NavLink来操作的

     

    拓展3:withRouter的使用

    前言:

    只有路由组件中才可以使用 this.props.history对象,其他的一般组件使用的话是会报错的,那怎么让一般组件也可以用上路由组件才能使用的API呢?

     

    解决方案:

    在react-router-dom中有一个withRouter

    修改export default的形式

    export default withRouter(Header)

    把header组件暴露出去作为路由组件

     

    效果:

    • withRouter可以加工一些组件,让一般组件具备路由组件所特有的API

    • withRouter的返回值是一个新组件,和原组件的不同就是添加上了特有的API

     

  • 相关阅读:
    墙内正确安装docker和docker-compose的方法
    VS2015编译ncnn
    caffe模型转ncnn模型
    Ncnn-Installation-on-Windows
    CV2 Fourcc解析
    手动安装OpenCV下的IPP加速库
    Ubuntu下安装Caffe
    Linux安装CUDA教程参考
    最正确的姿势安装cudnn,网上大多数教程都太坑了
    安装多版本cuda时,nvcc和cuda版本不一致问题
  • 原文地址:https://www.cnblogs.com/SCAU-gogocj/p/15330655.html
Copyright © 2020-2023  润新知