React组件三大属性回顾
state属性
我们知道最难的属性就是组件的state属性。那么state中我们都学习了些什么呢?
对state的理解
- state是一个状态属性,这个属性中存放着某些数据,通过更新state中的数据可以驱动页面重新渲染,从而使得页面可以动态加载和更新。
- state在类组件的实例对象上
- 一个组件如果拥有state,那么该组件则是复杂组件
初始化state
- state的类型是一个对象
- satte初始化要借助构造器,或者直接使用赋值语句
- 如果使用构造器方法需要接受props并且传给super方法
- 需要通过this来调用state
react事件绑定
- 原生js添加点击事件有三种方法
- addEventListener方法
- onclick方法
- onclick属性配合回调函数
- react中允许使用原生js中的方法
- react不推荐使用addEventListener和onclick,大力推崇onClick属性配合回调函数
- react中onClick属性中click首字母必须大写
- onClick属性不能用引号括起来,需要用{}括起来
- onClick属性必须是函数,所以函数名后面不可以加()
类方法中的this指向
- react类组件中推荐将类组件需要用到的函数全部包含在类里,以方法的形式来写
- 类组件中的方法要通过this调用
- 类方法赋值给变量或者作为事件监听的回调的话,对该方法的调用属于函数直接调用而不是通过类的实例对象调用
- 类中所有方法都默认局部开启了strict模式
- bind(this)做了两件事
- 生成新函数
- 修改新函数中的this指向
- 实例对象调用属性和方法会先从自身查找,自身没有才会顺着原型链去查找原型对象
- this.notify = this.notify.bind(this)是将原型对象上的notify方法生成新函数并修改this指向之后存放在实例对象自身
使用setState方法
- react不支持直接修改state,必须通过setState方法来修改state
- setState存放在React.Component的原型对象上
- setState方法接收的参数是一个对象
- setState方法并不是直接全局替换掉原来的state而是合并
- 整个过程中类组件的构造器方法只被调用一次
- render方法被调用1 + n次
简写state
- 标准写法比较繁琐,在实际开发中会拖慢我们的进度,所以要进行精简
- 精简后的代码结构分为三个部分,就目前来说,不需要构造器,至于后面要不要我们再说
- 赋值语句直接初始化状态
- render方法
- 自定义方法,所有自定义方法全部使用赋值语句加箭头函数来写
- 箭头函数自身没有this
- 箭头函数中如果要使用this,那么就会去查找箭头函数外层的this并作为自己的this来使用
props属性
学习完了state属性之后,我们又开始了第二个属性props
props的基本应用
- props是一个对象
- props是通过外面往组件内传入数据
- props在组件的实例对象上可以通过this调用
- props可以在组件标签处通过标签属性传入
批量传入props
- props可以在标签中使用展开运算符展开一个对象来批量传入属性
- props在使用展开运算符时必须确保被展开对象中的属性和解构props时的变量一致才能正常取数
- 展开运算符在原生js语法中不能展开对象
- babel和react库支持仅在组件标签批量传入属性时展开对象
对props进行限制
- 限制并不是必须的
- 限制props必须引入prop-types
- 限制可以避免一些不必要的错误
- 限制有三种场景
- 限制属性是否必须非空
- 限制属性类型
- 限制属性默认值
- 限制属性类型为函数时,不能用function而要用func
简写props
- propsTypes和defaultProps必须是组件类自身的属性,不是实例对象的属性
- 用static关键字给类自身添加属性
- props是只读的
类中构造器和props
- 类组件不写构造器完全可以,而且能不写就尽量不写
- 构造器中props传给super和不传给super的区别就是在构造器中能否通过this访问到props
函数式组件使用props
- 函数式组件目前只能使用props
- 函数式组件使用参数来接收props
- 函数式组件可以限制props但是只能写在函数体外
refs属性
那么我们来回忆一下最后一个属性。
字符串形式的rfs
- refs是一个收集各个标签ref属性来作为标识的一个对象
- refs可以代替document.getElementById方法来获取页面节点
- refs可以配合事件处理来完成相应的功能需求。
回调形式的refs
- 回调式refs不会自动收集到this.refs中
- 字符串式refs有问题,后期可能会废弃
- 回调式refs所传入的ref属性是一个回调函数
- 回调式refs是将传入的标签节点传入回调函数,并通过回调函数将标签节点挂在实例自身
回调式refs被调用的次数
- 回调式refs会在页面第一次被渲染时调用一次
- 如果回调式refs是内联函数形式,那么在state更新之后,会被重新调用两次
- 内联函数形式的回调式refs调用次数对程序不会有影响
- 类组件绑定函数的方式可以解决refs被多次调用的问题
使用createRef
- createRef可以返回一个容器用于存放被ref属性标识的DOM节点
- createRef返回的容器“专人专用”
- 如果多个标签要被标识,就要创建多个容器
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 丁丁的小窝(*^_^*)!