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()。

相关推荐
kyriewen7 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒7 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
山河木马8 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
小林攻城狮8 小时前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦8 小时前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
the_answer9 小时前
Webpack vs Vite 深度对比分析
前端·webpack
转转技术团队9 小时前
验证码识别实战:前端不写页面,改训模型了?
前端
MomentYY9 小时前
Temperature:AI 的“脑洞旋钮”
前端·llm·ai编程
远航_9 小时前
OpenSpec 完整详细介绍
前端·后端
召钱熏9 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端