浅谈react路由传参的几种方式


Posted in Javascript onMarch 23, 2021

第一种传参方式,动态路由传参

通过设置link的path属性,进行路由的传参,当点击link标签的时候,会在上方的url地址中显示传递的整个url

<Link to='/home?name=dx'>首页</Link>

如果想真正获取到传递过来的参数,需要在对应的子组件中
this.props.location.search 获取字符串,再手动解析

因为传参能够被用户看见,传递获取比较麻烦,所以不推荐

第二种传参方式,隐式路由传参

<Link to={{
     pathname: 'about',
     state: {
      name: 'dx'
     }
    }}>关于</Link>

所谓隐式路由传参,就是传参的信息不回暴露在url中,当点击该link标签,想要获取到传递的参数,就在对应的路由组件中,通过this.props.location.state获取即可

推荐使用,比较安全,获取传递参数都比较方便

第三种传参方式 组件间传参

何时使用?
当一个路由组件需要接收来自父组件传参的时候

改造route标签通过component属性激活组件的方式
正常情况下的route标签在路由中的使用方式

//简洁明了,但没办法接收来自父组件的传参
<Route path='/test' component={Test}></Route>

改造之后

<Link to='/test'>测试</Link>
<Route path='/test' render={(routeProps) => {
 //routeProps就是路由组件传递的参数
     return (
     //在原先路由组件参数的情况,扩展绑定父组件对子组件传递的参数
      <Test {...routeProps} name='dx' age={18} />
     )
 }}></Route> 

当点击link标签时,通过在对应的test子组件中,this.props获取来自父组件传递的参数和路由组件自带的参数
强烈推荐,传递参数略微有些麻烦,接收参数十分方便,并且仍然可以接收路由组件自带的参数,安全,不会被用户看见

第四种传参方式 withRouter 高阶组件给子组件绑定路由参数

withRouter 何时使用?
想要在某个子组件中获取路由的参数,必须得使用路由中的route标签的子组件才能被绑定上路由的参数。

为了解决不通过route标签绑定的子组件获取路由参数的问题,需要使用withRouter

一般用在返回首页,返回上一级等按钮上

import React from 'react';
import BackHome from './backhome';
export default class Test extends React.Component {
 render () {
  console.log(this.props)
  return (
   <div>
    这是测试的内容
//返回首页的按钮不是通过route标签渲染的,所以该子组件的this.props中没有路由参数
    <BackHome>返回首页</BackHome> 
   </div>
  )
 }
}
import React from 'react';
//导入withRoute
import {withRouter} from 'react-router-dom';
class BackHome extends React.Component {
 goHome = () => {
  //必须在使用withRouter的情况下,该组件在this.props中才有路由参数和方法
  //否则,会报错
  this.props.history.push({
   pathname: '/home',
   state: {
    name: 'dx' //同样,可以通过state向home路由对应的组件传递参数
   }
  })
 }
 render () {
  return (
   <button onClick={this.goHome}>this.props.children</button>
  )
 }
}
//导出的时候,用withRouter标签将backHome组件以参数形式传出
export default withRouter(BackHome)

当你需要使用的时候,就很重要,所以还是比较推荐。

Javascript 相关文章推荐
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
Jan 15 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
javascript封装 Cookie 应用接口
Aug 07 Javascript
AngularJS ng-controller 指令简单实例
Aug 01 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
webpack教程之webpack.config.js配置文件
Jul 05 Javascript
Vue中的Vux配置指南
Dec 08 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
vue2.0中set添加属性后视图不能更新的解决办法
Feb 22 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
Sep 21 Javascript
一百多行代码实现react拖拽hooks
node中使用shell脚本的方法步骤
详解如何解决使用JSON.stringify时遇到的循环引用问题
vue 中 get / delete 传递数组参数方法
Mar 23 #Vue.js
JavaScript实现页面动态验证码的实现示例
使用Vue.js和MJML创建响应式电子邮件
JS原生实现轮播图的几种方法
You might like
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
php blowfish加密解密算法
2016/07/02 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
jquery禁用右键示例
2014/04/28 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
原生js实现轮播图
2017/02/27 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python学习 流程控制语句详解
2016/06/01 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
python获取linux系统信息的三种方法
2020/10/14 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
python中pickle模块浅析
2020/12/29 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
广州某公司软件工程师面试题
2014/12/22 面试题
浅谈Python 中的复数问题
2021/05/19 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python