React传递参数的多种方式

2023-11-02

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

父组件往子组件传值,直接用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来刷新自己的视图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React传递参数的多种方式 的相关文章

随机推荐

  • 【MySQL调优】如何进行MySQL调优?一篇文章就够了!

    导航 Java笔记 踩坑汇总 Java基础 进阶 JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 MySQL高级篇 设计模式 常见面试题 源码 目录 一 监控报警 二 排查慢SQ
  • C#9.0新特性

    运行环境 NET 5 0 vs2019 16 8版本以上 目标类型推导 在这之前我们创建一个对象 Point p new Point x y 9 0中 进行了优化 Point p new x y Point ps new 1 2 new 5
  • java多线程-对象及变量的并发访问

    synchronized同步方法 该关键字可用来保障原子性 可见性和有序性 方法内的变量为线程安全 多个线程的情况下 各个线程的变量为其私有 互不影响 实例变量非线程安全问题与解决方案 在被调用方法前加synchronized关键字上锁 同
  • 高质量程序设计指南C++ C 代码规范

    这里只是搬运作者对 匈牙利 命名规则做合理简化之后的命名规则 比较适合于 Windows应用程序的开发 建议1 类型名和函数名均以大写字母开头的单词组合而成 例如 class Node 类名 class LeafNode 类名 void D
  • 修改镜像源和修改PATH

    ls a 显示所有文件夹 这里就有我们需要的bashrc 修改path 和condarc 修改镜像 vim bashrc or condarc 打开文件 直接摁i进入修改模式 进行修改 修改完以后esc wq 确认保存退出就好了
  • qt opengl 2d纹理数组

    2d纹理数组就是用一个纹理数组类型的变量保存数个纹理 这样就避免了使用多个单个的纹理对象 这再批处理一系列相同大小的纹理时 非常有用 我这里用到的场景是在点精灵中使用纹理数组使得每个精灵纹理上不同的图案 我用的图片有16张 当顶点为16个时
  • 单片机c51 单一外中断的应用

    1 在51单片机的P1接口上有8只LED 在外部中断0输入引脚P3 2 INT0 引脚接有一只按钮开关K1 程序要求将外部中断0设置成负跳沿触发 程序启动时 P1口上的8只LED亮 按一次开关按钮K1 使引脚接地 产生一个负跳沿触发的外部中
  • python os.walk读取路径下文件名

    import os dir path C for root dirs files in os walk dir path for file in files print os path join root file if file len
  • android自定义view之地图(一)

    最近参加了一个比赛 要用到自己做一个自定义的小地图 所以在网上查找了一些关于自定义view的有关资料 也了解了自定义控件的初步知识 效果图 第一阶段我画了一个自制的网格图 点哪个网格就会哪个网格就会显示 工作环境图 代码介绍 1 我们都知道
  • Qt之QProcess(一)运行cmd命令

    Qt提供了QProcess类 QProcess可用于完毕启动外部程序 并与之交互通信 一 启动外部程序的两种方式 1 一体式 void QProcess start const QString program const QStringLi
  • python3 题解(47 定义有理数类)

    有理数类 问题 浮点数的运算很多时候都是近似的 因为计算机无法表示一个无限的小数 有理数总可以表示为整数的比值 并且有理数的四则运算结果还是一个有理数 除0除外 如果是有四则运算 则可以考虑用有理数表示 这样可以没有舍入误差 分析 记录一个
  • Markdown基础

    Markdown学习 标题 N个 空格 二级标题 三级标题 字体 Hello World 两边都加2个 就变成粗体 Hello World 两边都加1个 就变成斜体 Hello World 两边都加3个 就变粗斜体 Hello World
  • css世界读书笔记->line-height(1)

    如果 line height 的值是1 5 font size大小是14px 那么半行距的大小是 14px 4 5 14px 2 3 5px border及line height等传统css属性没有小数的概念 因此3 5px需要取整处理 1
  • 基于卷积神经网络-门控循环单元结合注意力机制(CNN-GRU-Attention)时间序列预测,单列数据输入模型。matlab代码,2020版本及以上。评价指标包括:R2、MAE、MSE、RMSE

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 tic restoredefaultpath 导入数据 f xlsread windspeed xls She
  • sql server学习笔记——批处理语句、存储过程

    目录 批处理语句 1 批处理语句简介 示例一 示例二 存储过程 一 什么是存储过程 1 存储过程的简介 2 存储过程包含的内容 3 存储过程的优点 4 存储过程的分类 系统存储过程 用户定义存储过程 5 常用的系统储存过程 1 一般常用的存
  • 专访帝国软件的创造者:仍然在路上的80后

    全球的网站数量已经超过了一亿 并且还在以惊人的速度继续增长 CMS作为一种位于Web前端 Web 服务器 和后端办公系统或流程 内容创作 编辑 之间的软件系统为互联网应用的丰富和发展起到了至关重要的作用 最近我们注意到有一款口碑很好的CMS
  • Yii2 选择布局的方式

    方案1 控制器内成员变量 public layout false 不使用布局 public layout main 设置使用的布局文件 方案2 控制器成员方法内 this gt layout false 不使用布局 this gt layo
  • EMC 电磁兼容知识简易解析

    EMC基础知识 电磁兼容性 EMC Electromagnetic Compatibility 设备在共同的电磁环境中能一起执行各自功能的共存状态 即该设备不会由于受到处于同一电磁环境中其他设备的电磁发射导致不允许的降级 也不会使同一电磁环
  • iphone或安卓配置Charles抓包

    4个步骤完成iPhone配置Charles抓包步骤 Charles官网下载地址 Download a Free Trial of Charles Charles Web Debugging Proxy 1 连接到wifi 并设置代理地址 可
  • React传递参数的多种方式

    最常见的就是父子组件之间传递参数 父组件往子组件传值 直接用this props就可以实现 在父组件中 给需要传递数据的子组件添加一个自定义属性 在子组件中通过this props就可以获取到父组件传递过去的数据 父组件 render re