浅谈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 相关文章推荐
写入cookie的JavaScript代码库 cookieLibrary.js
Oct 24 Javascript
javascript原始值和对象引用实例分析
Apr 25 Javascript
javascript中的五种基本数据类型
Aug 26 Javascript
jQuery动态改变多行文本框高度的方法
Sep 07 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
jquery实现限制textarea输入字数的方法
Sep 06 jQuery
微信小程序自定义toast实现方法详解【附demo源码下载】
Nov 28 Javascript
小程序视频列表中视频的播放与停止的示例代码
Jul 20 Javascript
js 递归json树实现根据子id查父id的方法分析
Nov 08 Javascript
vue学习笔记之作用域插槽实例分析
Feb 01 Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 Javascript
一百多行代码实现react拖拽hooks
node中使用shell脚本的方法步骤
详解如何解决使用JSON.stringify时遇到的循环引用问题
vue 中 get / delete 传递数组参数方法
Mar 23 #Vue.js
JavaScript实现页面动态验证码的实现示例
使用Vue.js和MJML创建响应式电子邮件
JS原生实现轮播图的几种方法
You might like
JAVA/JSP学习系列之七
2006/10/09 PHP
php 图片上添加透明度渐变的效果
2009/06/29 PHP
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php实现短信发送代码
2015/07/05 PHP
php实现简单加入购物车功能
2017/03/07 PHP
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
小程序实现tab标签页
2020/11/16 Javascript
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python单例模式实例详解
2017/03/01 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
Java程序员面试题
2013/07/15 面试题
单位提档介绍信
2014/01/17 职场文书
《故乡》教学反思
2014/04/10 职场文书
情况说明书格式范文
2014/05/06 职场文书
优秀班组长事迹
2014/05/31 职场文书
销售人员求职信
2014/07/22 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
干部作风建设心得体会
2014/10/22 职场文书
二年级学生期末评语
2014/12/26 职场文书
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
Python OpenGL基本配置方式
2022/05/20 Python