React setState
相关代码题目setState
import React, {Suspense, lazy, useState, useEffect} from "react"; // JSX、VDOM、diff算法、Fiber架构、并发模式、合成事件 // 为什么React需要Fiber并发模式而Vue不需要 ??? // React18开发环境下,组件渲染时会被执行两次,是为了更早的验证组件完整的生命周期 // 生产环境下不会重复渲染 // ★ 不管是Vue还是React都是异步更新 异步渲染的,同步代码中无法获取到最新的值 // setValue(value + 1) 这种会合并更新 // setValue(value => value + 1) 这种不会合并更新 function Demo() { console.log('output-> Hello') const [value, setValue] = useState(100) function clickHandler() { setValue(value + 1) setValue(value + 1) console.log('output-> value1:: ', value) setValue((value) => value + 1) setValue((value) => value + 1) console.log('output-> value2:: ', value) } return ( // React.Fragment 可以帮助你在不增加额外 DOM 节点的情况下返回多个元素 <React.Fragment> <span>{value}</span> <button onClick={clickHandler}>increase</button> </React.Fragment> ) } /** * 终端输出 * app01 * output-> Hello * app02 * App.jsx:12 output-> value1:: 100 * App.jsx:15 output-> value2:: 100 * App.jsx:7 output-> Hello * 界面输出 * 103 * */ const App = () => { console.log('output-> app01', ) useEffect(() => { // 组件首次渲染完成后才会执行 console.log('output-> app02') }) return ( <div> <Demo/> </div> ); }; export default App;
setState是同步还是异步 指的是状态更新是同步还是异步的,setState调用都是异步的
为什么setState设计是异步的?
- 提高应用性能,每一次setState都会触发组件重渲染包括协调、调度、渲染层的过程
setState会触发什么
- react-scheduler会接收到一个更新请求,将该更新包装成一个任务task对象将更新逻辑存放在Task对象的callback中并放到任务队列等待调度
- react-reconciler会协调react-scheduler的执行提供Fiber树的构造逻辑、调和算法并根据状态更新创建新的Fiber树
- react-reconciler中调和算法会对Fiber树进行比较获取差异结果并通过react-dom进行增量更新
setState(updater, [callback])
- setState被视为请求更新而不是立即更新
- updater的返回值会和state进行浅合并(会保留未更新的部分)
- 第二个可选的回调函数会在合并完成之后执行
- this.setState在shouldComponentUpdate()返回true后,render()方法之前才会更新
setState的第二个参数 callback
callback会在状态更新并且组件重新渲染之后执行
React18之后所有setState都是异步的若需要实现通过需要使用 flushSync实现
flushSync(() => { this.setState({data: 2}); }); console.log('data', this.state.data); flushSync(() => { this.setState({data: 3}); }); console.log('data', this.state.data);
学而不思则罔,思而不学则殆!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2023-03-01 AntDesign样式穿透