• React | 实例三大核心属性(state、props、refs)


    目录

    一、state

    1、理解

    2、强烈注意

    二、props

    1、基本用法

    2、类型、默认值、必要性

    三、refs


    一、state

    1、理解

    • state是组件对象最重要的属性,值是对象(可以包含多个key-value的组合)

    • 组件被称为“状态机”,通过更新组件的state来更新对应的页面显示(重新渲染组件)

    2、强烈注意

    • 组件中render方法中的this为组件实例对象
    • 在方法中 ,组件自定义的方法中this为undefined,如何解决?
    1. 强制绑定this:通过函数对象的bind()
    2. 箭头函数 
    • 状态数据,不能直接修改或更新

    我们来通过一个切换天气的小案例来理解一下:

    原本写法:

    在原本的写法中,change方法在实例对象的原型对象上,供实例使用。由于change是作为onClick的回调,所以不是通过实例调用的,是直接调用,因为类中的方法默认开启了局部的严格模式,所以change中的this为undefined。

    我们可以在代码中看到,我们通过函数对象的bind()改变了this的指向。

     简写:

     在我们的简写中,我们之前就知道,箭头函数是没有自己的this指向的,所以当我们自定义方法,需要用赋值语句的形式+箭头函数来完成我们的自定义方法。

    其中,还一个需要注意的点,不管是原本的写法,还是我们的简写,当我们给state进行更新时,都必须通过setState这个API来进行设置!!!

    二、props

    在说props之前,先说一个题外话,那就是我们的constructor构造函数可以省略嘛?

    我们可以看到React官网上也有说明,我们的constructor构造函数其实只有在以下两种情况下会用到:

     但是,我们上面的state简写中已经有说到,我们可以直接在组件中用赋值语句的方法初始化内部state

    1. // 初始化状态(赋值语句)
    2. state = {isHot:true}

    这就解决了我们需要用到构造函数的第一种情况;而第二种情况,我们也说过,我们可以不用bind()函数来改变this指向这个麻烦的方法,我们可以直接用箭头函数+赋值语句的方法。

    1. // 自定义方法(赋值语句的形式 + 箭头函数)
    2. change=()=>{
    3. const isHot = this.state.isHot
    4. this.setState({isHot:!isHot})
    5. }

    这样看来,我们的确可以不用constructor构造函数,但是没有构造函数和用到构造函数真的就一点点区别都没有嘛?事实也不是这样,如果需要在为 React.Component 子类实现构造函数时,应在其他语句之前调用 super(props)。否则,this.props 在构造函数中可能会出现未定义的 bug。

    好了,我们继续说回到props……

     什么是props?

    每个组件对象都会有props属性,组件标签的所有属性都保存在props中。

    它的作用是通过标签属性从组件外向组件内传递变化的数据,但是需要注意的点是:组件内部不要修改props数据,因为它是只读的。

    1、基本用法

     这是props批量传递参数,我们是这样使用的:

     我们看到 {...P1}一定很眼熟,大家会想到展开运算符,但是需要我们注意的点是,之前学习的扩展运算符真的是这样使用的嘛?

    构造字面量对象时展开语法:

    这样看,是很正常的 ,但是如果这样呢?

    一开始没有报错的原因很简单,因为我们在【...】时外面用了花括号,如果不用花括号,就会报错,大家肯定好奇怪,我们在标签体内也用到花括号了哇,所以不报错也是情理之中呀。但是此花括号非彼花括号,标签体内的花括号代表的是,括号里的是表达式,在JS层面来说,它就是直接【...P1】了,但是为什么没有报错呢?不绕弯子了,是因为在JSX里,有babel.js和react.js的加持,所以可以直接写,但公允许在标签体里用来属性的传递。 

    2、类型、默认值、必要性

     
    

     其中,propTypes代表的是规则的意思,要注意首字母是小写,而Person.propTypes里的PropTypes的首字母要大写。这种写法的意思是给Person这个实例对象上添加了这些规则,我们也可以直接写在组件里,但是要用static这个关键字。

    三、refs

    refs提供了一种方式,允许我们访问DOM节点或在render方法中创建的React元素。

    在典型的React数据流中,props是父组件与子组件交互的唯一方式。要修改一个子组件,你需要使用新的props来重新渲染它。但是,在某些情况下,你需要在典型数据流之外强制修改子组件。被修改的子组件可能是一个React组件的实例,也可能是一个DOM元素。对于这两种情况,React都提供了解决办法。

    何时使用refs?

    • 管理焦点,文本选择或媒体播放。
    • 触发强制动画。
    • 集成第三方DOM库。 

    我们来看一下用字符串形式的ref属性:

     首先,我们给我们想要操作的节点做一个节点,例如 "inp1"。你可以通过 this.refs.inp1 来访问 DOM 节点。我们不建议使用它,因为 string 类型的 refs 存在 一些问题。它已过时并可能会在未来的版本被移除。

    所以我们接下来看一下回调函数形式的ref属性:

    如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。

    通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。

    okk,今天说到这。拜比~

  • 相关阅读:
    100量子比特启动实用化算力标准!玻色量子重磅发布相干光量子计算机
    Linux进程信号
    Web基础和HTTP协议
    Unity3D : 本地坐标系,世界坐标系,和TransformPoint,TransformVector,TransformDirection的区别
    Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理
    基于Python爬虫和K-means算法的校园微博热点话题发现系统
    【深度学习】Transformer
    FlexRay通信协议概述
    玩机搞机---全网最详细的手机全机型 刷机教程一
    【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统
  • 原文地址:https://blog.csdn.net/m0_72383454/article/details/127579373