React传递参数的多种方式
最常见的就是父子组件之间传递参数
父组件往子组件传值,直接用this.props就可以实现
在父组件中,给需要传递数据的子组件添加一个自定义属性,在子组件中通过this.props就可以获取到父组件传递过去的数据
// 父组件
render() {
return (
// 使用自定义属性传递需要传递的方法或者参数
<ShopUi toson={this.state}></ShopUi>
)
} //子组件
//通过this.props.toson就可以获取到父组件传递过来的数据 、、如果还需要往孙组件传递那么在子组件通过自定义属性继续传递就行了
tograndson={this.props.toson}
、、孙组件通过this.props.tograndson获取到数据
子组件给父组件传值的话,需要在父组件设置接收函数和state,同时将函数名通过props传递给子组件
也就是给子组件传入父组件的方法,在子组件进行调用
//孙子组件
export default class Grandson extends Component{
render(){
return (
<div style={{border: "1px solid red",margin: "10px"}}>
{this.props.name}:
<select onChange={this.props.handleSelect}>
<option value="男">男</option>
<option value="女">女</option>
</select>
</div>
)
}
}; //子组件
export default class Child extends Component{
render(){
return (
<div style={{border: "1px solid green",margin: "10px"}}>
{this.props.name}:<input onChange={this.props.handleVal}/>
<Grandson name="性别" handleSelect={this.props.handleSelect}/>
</div>
)
}
}; //父组件
export default class Parent extends Component{ constructor(props){
super(props)
this.state={
username: '',
sex: ''
}
},
handleVal(event){
this.setState({username: event.target.value});
},
handleSelect(value) {
this.setState({sex: event.target.value});
},
render(){
return (
<div style={{border: "1px solid #000",padding: "10px"}}>
<div>用户姓名:{this.state.username}</div>
<div>用户性别:{this.state.sex}</div>
<Child name="姓名" handleVal={this.handleVal} handleSelect={this.handleSelect}/>
</div>
)
}
}
前一段时间有人问过我这样一个问题,constructor里面的super()是干嘛用的?
总结一下:
如果要在子类的constructor里使用this,必须调用父类constructor,否则就拿不到this
那么问题就来了,如何调用父类的constructor呢? 通过super()
如果要在constructor里使用父组件传递过来的参数,必须在调用父组件super时,传递参数给父组件的constructor
如果不在constructor里面使用this,或者参数,就不需要super ; 因为React以及帮你做了this,props的绑定
路由传参
安装 npm install react-router-dom --save-dev
定义路由(一般会放在外面)
<HashRouter>
<Switch>
<Route exact path="/" component={Home}/>
<Route exact path="/detail" component={Detail}/>
</Switch>
</HashRouter>
当页面跳转时
<li onClick={el => this.props.history.push({
pathname:'/detail',
state:{id:3}
})}
>
</li>
接收 通过this.props.history.location可以获取到传递过来的数据
路由传参可能会有这个问题,就是只有在路由定义时挂载的组件中才会有props里面的location history match
路由上挂载的那个组件一般都是Container.js,一般我们会往下分出UI.js组件,在这里面进行点击跳转,UI组件props里没有location history match
需要用到高阶组件withRouter
状态提升
将多个组件需要共享的状态提升到离他们最近的那个公共父组件上,然后父组件通过props分发给子组件
context
当某个组件在自己的context中保存了某个状态,那个该组件下的所有子孙组件都可以访问到这个状态,不需要中间组件的传递,而这个组件的父组件是没办法访问的
class Index extends Component {
static childContextTypes = {
themeColor: PropTypes.string
}
constructor () {
super()
this.state = { themeColor: 'red' }
}
getChildContext () {
return { themeColor: this.state.themeColor }
}
render () {
return (
<div>
<Header />
<Main />
</div>
)
}
}
通过getChildContext()将属性传递给所有的子孙组件
提供 context 的组件必须提供 childContextTypes 作为 context 的声明和验证。
class Title extends Component {
static contextTypes = {
themeColor: PropTypes.string
}
render () {
return (
<h1 style={{ color: this.context.themeColor }}>标题</h1>
)
}
}
子组件要获取 context 里面的内容的话,就必须写 contextTypes 来声明和验证你需要获取的状态的类型,它也是必写的,如果你不写就无法获取 context 里面的状态。
Title 想获取 themeColor,它是一个字符串,我们就在 contextTypes 里面进行声明。
引入redux
redux为React提供可预测化的状态管理机制
redux将整个应用状态存储到store,store里保存着一个state状态树
组件可以派发(dispatch) 行为 (action) 给store , 而不是直接通知其它组件
其它组件可以通过订阅store中的状态state来刷新自己的视图
React传递参数的多种方式的更多相关文章
- Python传递参数的多种方式
Python中根据函数的输入参数以及是否有返回值可分为四种函数: 1.无参数无返回值 2.有参数无返回值 3.无参数有返回值 4.有参数无返回值 Python 中参数传递有下列五种方式; 1.位置传递 ...
- ios页面间传递参数四种方式
ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...
- python 函数传递参数的多种方法
python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...
- springboot获取URL请求参数的多种方式
1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...
- vue子组件向父组件传递参数的基本方式
子组件: this.$emit('transferUrl', this.picUrl) 父组件: 引入子组件<pics @transferUrl="gettransferUrl&quo ...
- Delphi过程函数传递参数的八种方式
今天一同事问我为什么有些过程函数里面有Var而有些没有,不解,遂到网上百度,得解.快哉,快哉. 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传 ...
- Delphi过程函数传递参数的几种方式
Delphi过程函数传递参数的几种方式 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out. 另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 proced ...
- delphi的一些语法知识 以及参数传递问题,按引用方式传递参数,按值方式传递参数
//delphi中exit,abort,break,continue 的区别 exit: 退出函数体abort: 遇到异常,安静处理,就是不显示不提示break: 退出当前循环体,包括for ,whi ...
- Structs复习 Action传递参数
Structs传递参数通常有三种方式 下面我来一个个介绍 1.属性 Jar包 web.xml <?xml version="1.0" encoding="UTF-8 ...
随机推荐
- hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个
#include<stdio.h> #include<string.h> #define N 21000 struct node { int v,next; }bian[510 ...
- 转载 - Catalan数(卡特兰数)
出处:http://blog.sina.com.cn/s/blog_6aefe4250101asv5.html 什么是Catalan数 说到Catalan数,就不得不提及Catalan序列,Catal ...
- 0301mysql数据库建表情况
转自博客:http://blog.csdn.net/dreamcode/article/details/8557197 一. 表设计 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段 ...
- geos库交叉编译生成ARM平台库
版本号信息: GEOS:geos-3.4.2.tar.bz2(http://trac.osgeo.org/geos/) CPU:ARM 编译器:arm-linux 4.2.2 1. 解压源代码包ge ...
- Netty In Action中文版 - 第十五章:选择正确的线程模型
http://blog.csdn.net/abc_key/article/details/38419469 本章介绍 线程模型(thread-model) 事件循环(EventLoop) 并发(Con ...
- 【小超_Android】android上开源的酷炫的交互动画和视觉效果:Interactive-animation
1.交互篇 2.视觉篇 交互篇 1.SlidingUpPanelLayout 项目介绍:他的库提供了一种简单的方式来加入一个可拖动滑动面板(由谷歌音乐推广,谷歌地图和Rdio)你的Android应用程 ...
- Android应用开发-护眼提醒-总结篇
设计初衷: 在学习<第一行代码>的服务那章时,涉及到了alarmmanager的内容.然后笔者当时正好在关注"程序猿怎样保护眼睛"的问题. 于是便自己做了一个demo, ...
- Myeclipse快捷键备忘
1.编辑类 Ctrl+定义好的类名 链接到你定义好的类的窗口 Ctrl + / 为选中的一段代码加上或去掉注释符 // (必须选中代码块) Ctrl ...
- jsp页面自动换行
其实只要在表格控制中添加一句 <div style="word-break:break-all">就搞定了.</div>其中可能对英文换行可能会分开一个单词 ...
- Google TPU 揭密——看TPU的架构框图,矩阵加乘、Pool等处理模块,CISC指令集,必然需要编译器
Google TPU 揭密 转自:https://mp.weixin.qq.com/s/Kf_L4u7JRxJ8kF3Pi8M5iw Google TPU(Tensor Processing Unit ...