最常见的就是父子组件之间传递参数

  父组件往子组件传值,直接用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传递参数的多种方式的更多相关文章

  1. Python传递参数的多种方式

    Python中根据函数的输入参数以及是否有返回值可分为四种函数: 1.无参数无返回值 2.有参数无返回值 3.无参数有返回值 4.有参数无返回值 Python 中参数传递有下列五种方式; 1.位置传递 ...

  2. ios页面间传递参数四种方式

    ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...

  3. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  4. springboot获取URL请求参数的多种方式

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...

  5. vue子组件向父组件传递参数的基本方式

    子组件: this.$emit('transferUrl', this.picUrl) 父组件: 引入子组件<pics @transferUrl="gettransferUrl&quo ...

  6. Delphi过程函数传递参数的八种方式

    今天一同事问我为什么有些过程函数里面有Var而有些没有,不解,遂到网上百度,得解.快哉,快哉. 在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传 ...

  7. Delphi过程函数传递参数的几种方式

    Delphi过程函数传递参数的几种方式  在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out. 另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 proced ...

  8. delphi的一些语法知识 以及参数传递问题,按引用方式传递参数,按值方式传递参数

    //delphi中exit,abort,break,continue 的区别 exit: 退出函数体abort: 遇到异常,安静处理,就是不显示不提示break: 退出当前循环体,包括for ,whi ...

  9. Structs复习 Action传递参数

    Structs传递参数通常有三种方式 下面我来一个个介绍 1.属性 Jar包 web.xml <?xml version="1.0" encoding="UTF-8 ...

随机推荐

  1. [bzoj3209]花神的数论题_数位dp

    花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...

  2. POJ 2607

    一次FLOYD,再枚举. 注意题目要求的输出是什么哦. #include <iostream> #include <cstdio> #include <cstring&g ...

  3. 为什么pthread_cond_wait须要传递mutex參数

    这是来自知乎的一个问题,由@吴志强提出,有意思的是,他看了大家的回答后,突然顿悟了,同一时候也发现有人答错了,于是乎.他自己回答了自己的问题. 我看完后.发现他分析的非常精彩,于是就记录在这.以下是他 ...

  4. Linux 服务具体解释

    acpid ACPI(全 称 Advanced Configuration and Power Interface)服务是电源管理接口. 建议全部的笔记本用户开启它. 一些server可能不须要 ac ...

  5. 2016.04.07,英语,《Vocabulary Builder》Unit 11

    cant, from the Latin verbs canere and cantare, meaning 'sing'. by way of French, add an h to the roo ...

  6. Android进程回收机制LMK(Low Memory Killer)【转】

    本文转载自:http://www.cnblogs.com/wytiger/p/5744752.html 熟悉Android系统的童鞋都知道,系统出于体验和性能上的考虑,app在退到后台时系统并不会真正 ...

  7. perl的安装

    http://www.activestate.com/activeperl/downloads 安装的时候,默认把perl放置到环境变量的PATH中 之后,需要重启电脑,确保环境变量生效 执行perl ...

  8. Triangle LOVE(拓扑排序)

    Triangle LOVE Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total ...

  9. [CSharp] C#开源大全

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  10. IPv6通讯原理(1) - 不能忽略的网卡启动过程

    本文主题:通过抓包分析,深入观察网卡启动过程的每个步骤,从而逐步掌握通讯原理.