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

  父组件往子组件传值,直接用this.props就可以实现

  在父组件中,给需要传递数据的子组件添加一个自定义属性,在子组件中通过this.props就可以获取到父组件传递过去的数据

  1. // 父组件
  2. render() {
  3. return (
  4. // 使用自定义属性传递需要传递的方法或者参数
  5. <ShopUi toson={this.state}></ShopUi>
  6. )
  7. }
  8.  
  9. //子组件 
  10. //通过this.props.toson就可以获取到父组件传递过来的数据
  11.  
  12. 、、如果还需要往孙组件传递那么在子组件通过自定义属性继续传递就行了
  13. tograndson={this.props.toson}
  14. 、、孙组件通过this.props.tograndson获取到数据

 

 子组件给父组件传值的话,需要在父组件设置接收函数和state,同时将函数名通过props传递给子组件

  也就是给子组件传入父组件的方法,在子组件进行调用

  1. //孙子组件
  2. export default class Grandson extends Component{
  3. render(){
  4. return (
  5. <div style={{border: "1px solid red",margin: "10px"}}>
            {this.props.name}:
  6. <select onChange={this.props.handleSelect}>
  7. <option value="男">男</option>
  8. <option value="女">女</option>
  9. </select>
  10. </div>
  11. )
  12. }
  13. };
  14.  
  15. //子组件
  16. export default class Child extends Component{
  17. render(){
  18. return (
  19. <div style={{border: "1px solid green",margin: "10px"}}>
  20. {this.props.name}:<input onChange={this.props.handleVal}/>
  21. <Grandson name="性别" handleSelect={this.props.handleSelect}/>
  22. </div>
  23. )
  24. }
  25. };
  26.  
  27. //父组件
  28. export default class Parent extends Component{
  29.  
  30. constructor(props){
  31. super(props)
  32. this.state={
  33. username: '',
  34. sex: ''
  35. }
  36. },
  37. handleVal(event){
  38. this.setState({username: event.target.value});
  39. },
  40. handleSelect(value) {
  41. this.setState({sex: event.target.value});
  42. },
  43. render(){
  44. return (
  45. <div style={{border: "1px solid #000",padding: "10px"}}>
  46. <div>用户姓名:{this.state.username}</div>
  47. <div>用户性别:{this.state.sex}</div>
  48. <Child name="姓名" handleVal={this.handleVal} handleSelect={this.handleSelect}/>
  49. </div>
  50. )
  51. }
  52. }

  前一段时间有人问过我这样一个问题,constructor里面的super()是干嘛用的?

总结一下:

  如果要在子类的constructor里使用this,必须调用父类constructor,否则就拿不到this

  那么问题就来了,如何调用父类的constructor呢? 通过super()

  如果要在constructor里使用父组件传递过来的参数,必须在调用父组件super时,传递参数给父组件的constructor

  如果不在constructor里面使用this,或者参数,就不需要super ; 因为React以及帮你做了this,props的绑定

路由传参

  安装 npm install react-router-dom --save-dev

  定义路由(一般会放在外面)

  1. <HashRouter>
  2. <Switch>
  3. <Route exact path="/" component={Home}/>
  4. <Route exact path="/detail" component={Detail}/>
  5. </Switch>
  6. </HashRouter>

当页面跳转时

  1. <li onClick={el => this.props.history.push({
  2.    pathname:'/detail',
  3.   state:{id:3}
    })}
  4. >
  5. </li>

接收    通过this.props.history.location可以获取到传递过来的数据

路由传参可能会有这个问题,就是只有在路由定义时挂载的组件中才会有props里面的location history match 

路由上挂载的那个组件一般都是Container.js,一般我们会往下分出UI.js组件,在这里面进行点击跳转,UI组件props里没有location history match 

需要用到高阶组件withRouter

状态提升

  将多个组件需要共享的状态提升到离他们最近的那个公共父组件上,然后父组件通过props分发给子组件

context

  当某个组件在自己的context中保存了某个状态,那个该组件下的所有子孙组件都可以访问到这个状态,不需要中间组件的传递,而这个组件的父组件是没办法访问的

  1. class Index extends Component {
  2. static childContextTypes = {
  3. themeColor: PropTypes.string
  4. }
  5.  
  6. constructor () {
  7. super()
  8. this.state = { themeColor: 'red' }
  9. }
  10.  
  11. getChildContext () {
  12. return { themeColor: this.state.themeColor }
  13. }
  14.  
  15. render () {
  16. return (
  17. <div>
  18. <Header />
  19. <Main />
  20. </div>
  21. )
  22. }
  23. }
    通过getChildContext()将属性传递给所有的子孙组件
    提供 context 的组件必须提供 childContextTypes 作为 context 的声明和验证。
  1. class Title extends Component {
  2. static contextTypes = {
  3. themeColor: PropTypes.string
  4. }
  5.  
  6. render () {
  7. return (
  8. <h1 style={{ color: this.context.themeColor }}>标题</h1>
  9. )
  10. }
  11. }
    子组件要获取 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. 利用junit对springMVC的Controller进行测试

    本文转自http://www.tuicool.com/articles/7rMziy 平时对junit测试service/DAO层已经很熟悉不过了,如果不了解,可以猛戳这里,但是我们要测试contro ...

  2. 关于double类型数字相加位数发生变化的问题

     因为计算机内部存贮本身的缺陷,导致double类型的数字相加.得到的结果有非常多位,比方 774.23 750.0 2638.66 4162.889999999999 看到这个是不是非常晕 当然 ...

  3. 输入url发生了什么--前端所有知识

    面试经常会问到的一个问题,这个问题舒展开来,其实包含了前端(一些后端)几乎所有的知识.梳理一下,备忘.包含了一些面经中常问的问题. 有时间待续

  4. luogu2678 跳石子 二分

    题目大意: 一个赛道上除起点.终点外有\(N\)个点.现要求你从中删除\(M\)个点,使得剩余点序列中相邻的点的最小值最大.求这个最大的最小值. 思路 我们最容易想到的算法便是:对序列从头到尾循环\( ...

  5. c24--预编译,宏定义(带参数,不带参数)

    // // main.c // 宏定义 #include <stdio.h> void test(); /* 预处理指令:在我们的文件翻译成0和1之前做的操作我们称之为预处理指令,一般以# ...

  6. php 0,null,empty,空,false,字符串关系(转)

    在php中由于是弱类型语言,不同类型值之间可以隐式转换,使得false,null,”,0,’0′这几个值的比较有些混乱,现总结一下: //相等判断 '' == NULL == 0 == false ( ...

  7. python笔记:文件操作

    1.逐行打印整个文件 # -*- coding: utf-8 -*- f = open("test",'r',encoding="utf-8") count = ...

  8. [Algorithm]扔杯问题

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. 2015 多校赛 第二场 1004 hdu(5303)

    Problem Description There are n apple trees planted along a cyclic road, which is L metres long. You ...

  10. Delete, drop table, truncate之间的区别

    Delete, drop table, truncate有什么区别? delete 删除表中数据,可以删除一条或多条记录,可以回滚,记录操作日记,是DML truncate table,一次性清空表中 ...