react篇4--setState、LazyLoad和Hooks

先新建一个项目,准备以下文件:

一、setState

对象式setState()

案例为点击按钮让页面中的数据加1的效果。

其实setState()更新状态是异步的。

准确地说setState()是同步地,但是引起数据状态变化的动作是异步的。

效果如下:

setState()方法除了上面的写法,setState()也可以传两个参数,第一个参数还是数据对象,第二个参数为函数(状态改变函数),第二个参数的函数在状态更新完毕render()执行完后被调用。

函数式setState()

setState()还有一种写法,是函数的setState()。也有两个参数,第一个参数是函数,该函数返回state改变后的状态,第二个参数也是函数,也是状态更新完render()执行完之后被调用。

注意:第一个参数函数可以接收两个值state、props,

总结:若是新状态不依赖原状态,则使用对象式setState(),否则使用函数式setState()更方便(不是必须,只是不用手动获取state)。

二、LazyLoad

懒加载最多的使用场景是路由组件的懒加载。

这样会造成资源的浪费,需要实现点击一个路由组件加载一个的方式,即实现路由组件的懒加载。

三、Hooks

Hooks时react16.8版本增加的新特性,可以在函数组件中使用state以及其他的react特性。

之前说过,函数式组件没有this,不能使用对象实例的特性(除了props)。函数式组件也不能用生命周期函数。Hooks可以解决这些问题。

在之前一、setState的例子的基础上进行修改。

有三个常用的Hook,分别为React.useState()、React.useEffect()、React.useRef()。

useState()

useState()方法返回两个参数,第一个参数是数据,第二个参数是更新数据的方法,方法的参数是返回值第一个参数的初始值。

注意:每一次点击按钮函数组件Demo都会被调用一次,react底层做了处理,只有第一次执行的时候才会执行"const count,setCount = React.useState(0)"进行初始化操作。

改变数据的方法setCount也有两种写法。另一种写法也是传递一个函数,该函数参数为旧值,返回值为修改后的值。

useEffect()

useEffect()使得函数组件中可以使用生命周期函数。

用一个例子说明。

函数式组件中没有componentDidMount()方法。

React.useEffect()方法有两个参数(第二个可选),第一个参数表示执行的操作,第二个参数是一个数组,表示检测的setState的数据。

第二个参数不穿,React.useEffect()指定的第一个参数的方法类似于类组件的生命周期函数componentDidUpdate()。

所以,可以看出,不传第二次参数类似于类组件的,传空数组类似于类组件的componentDidMount()。

之前在类组件还有一个案例,若是组件被卸载了需要把定时器清楚,类组件是在生命周期函数componentWillUnmount()中卸载定时器的。

函数组件中若想实现componentWillUnmount()的效果,需要把React.useEffect()的第一个参数(函数)的返回值为一个函数,这个函数相当于componentWillUnmount()。

可以把useEffect()看成componentDidMount()、DidUpdate()与componentWillUnmount()的结合。

useRef()

在之前的点击按钮弹出用户的输入内容的例子中,类组件中一个组件(button)要获得另一个组件input的value值,需要需用ref属性。

函数式组件中需要使用useRef()。

相关推荐
一位正在转型AI全栈的前端工程师10 小时前
AI 全栈学习之旅 -Week 5:RAG 知识库问答系统:从零到生产级部署的全栈实践总结
前端·python
光影少年11 小时前
react navite 安卓iOS 打包、签名、环境区分
前端·react native·react.js
coderCN11 小时前
Nodejs 第三十四章 数据库(表达式和函数、子查询和连表)
前端·node.js
ssshooter12 小时前
AI 时代你不能不知道的 git worktree
前端·后端·面试
观测云12 小时前
AI时代的用户访问监测:观测云带你身临其境体验用户与前端UI交互旅程
前端·可观测性·观测云·rum
喵本喵叁肆12 小时前
06-M6-部门过滤与综合研判-从问答机到研判助手
前端·javascript·jquery
এ慕ོ冬℘゜13 小时前
JavaScript学习心得:从只会语法,到真正会写业务逻辑
开发语言·javascript·ecmascript
TomEval13 小时前
【Web UI 自动化】05 - KDT 模式原理与实现
前端·ui·自动化
南雨北斗13 小时前
vue3项目状态持久化方案Pinia
前端