React 中 useState 语法详解

1. 语法定义

javascript 复制代码
const [state, dispatch] = useState(initData)

state:定义的数据源,可视作一个函数组件内部的变量,但只在首次渲染被创造。

dispatch:改变state的函数,推动函数渲染的渲染函数,有非函数和函数两种情况。

initData:state的初始值,有非函数和函数两种情况。

2. 使用案例

1. 变量的定义和修改

javascript 复制代码
import { useState } from 'react'

// 定义变量
const [name, setName] = useState('Vue')

// 修改变量
const handleUpdate = () => {
    setName('React')
}

2. 对象的定义和修改

javascript 复制代码
import { useState } from 'react'

// 定义对象
const [user, setUser] = useState({ name: '张三', age: 30 })

// 修改对象
const handleUser = () => {
    // setUser({ name: '李四', age: 50 })
    setUser({ ...user, age: 50 })
}

3. 数组的定义和修改

javascript 复制代码
import { useState } from 'react'

// 定义数组
const [list, setList] = useState(['Tom', 'Jack']);

// 修改数组
const handleList = () => {
    setList([...list, 'Lily'])
}

4. 声明时添加逻辑返回

javascript 复制代码
import { useState } from 'react'

const num = 1;

// 声明通过函数返回
const [name ,setName] = useState(()=>{
    if(num==1){
        return "这是单数"
    }else{
        return "这是双数"
    }
})

5. 更新时添加逻辑返回

javascript 复制代码
import { useState } from 'react'

// 定义变量
const [count, setCount] = useState(0);

// 修改变量
const handleCount = () => {
    // 通过函数返回
    setCount((count) => count + 1)

}

3. 异步更新

React是异步更新,它会将多次更新合并到一起。

javascript 复制代码
import { useState } from 'react'

// 定义变量
const [count, setCount] = useState(0);

// 修改变量
const handleCount = () => {
    setCount(count => count + 1)
    setCount(count => count + 1)
    setCount(count => count + 1)
    setCount(count => count + 1)
}

由于React是异步合并更新,上面调用了4次setCount会统一合并,值会变为4,但只会渲染一次。

如果想要强制刷新渲染,可以使用flushSync函数提高优级,这样就会又渲染一次。

javascript 复制代码
import { useState } from 'react'

import { flushSync } from 'react-dom'


// 定义变量
const [count, setCount] = useState(0);

// 修改变量
const handleCount = () => {

    // setCount(count => count + 1)
    // setCount(count => count + 1)
    // setCount(count => count + 1)
    // setCount(count => count + 1)

    // 合并批量更新渲染一次
    setTimeout(() => {
        setCount(count => count + 1)
        setCount(count => count + 1)
        setCount(count => count + 1)
        setCount(count => count + 1)
    })
    // 强制更新渲染一次
    flushSync(() => {
        setCount(count => count + 1)
        setCount(count => count + 1)
    })

}
相关推荐
badhope33810 小时前
当所有AI都在抄同一份作业:前端模板的趋同、困局与破局
前端·ai·ai编程·前端开发·tailwind·ui设计
孙启超19 小时前
【AI应用开发】 Agent篇(三):规划推理:ReAct 与 Plan-Execute
人工智能·llm·agent·react·observation·rag·plan-execute
名字还没想好☜1 天前
React useImperativeHandle 实战:让父组件安全地调用子组件的方法
前端·javascript·react.js·react·forwardref
孙启超2 天前
【AI应用开发】ReAct 原理是什么?和普通直接提问 LLM 差别在哪?
前端·人工智能·llm·agent·react·rag·ai应用开发
名字还没想好☜2 天前
React 用 IntersectionObserver 实现图片懒加载与无限滚动:封装一个 useInView Hook
前端·javascript·vue.js·react.js·react
名字还没想好☜2 天前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
人间凡尔赛3 天前
React Compiler 正式落地一年:告别手动 useMemo/useCallback 的全栈实践
前端·性能优化·react
SamChan906 天前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
名字还没想好☜6 天前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
妍妍爱学习6 天前
前端开发的就业现状及前景
前端开发·未来趋势·就业现状·技术需求·个人发展路径