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)
    })

}
相关推荐
滨哥GPT1 天前
Codex改完代码为什么保存后页面还是不生效?热更新、文件监听与开发服务器排查
前端开发·热更新·开发调试·codex·hmr
Richown2 天前
React 高级模式:并发渲染下的状态机驱动架构——从 Finite State Machine 到生产级实现
区块链·react
LayZhangStrive3 天前
Agent开发 - 实现人类与Manus智能体的终端窗口命令交互
ai·交互·agent·react·终端·manus
名字还没想好☜4 天前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
2601_962077985 天前
阿里二面,前端开发在web3.0中该如何应用,记录面经
区块链·前端开发·web3.0·技术趋势·学习准备
李游Leo8 天前
Node.js 开发环境安装与 npm/pnpm 国内镜像配置(Windows / macOS / Linux)
npm·node.js·pnpm·前端开发·开发环境
贝格前端工场9 天前
AI在生产制造企业的六大成熟落地场景(可量产、可验收、非噱头)
大数据·ui·前端开发
ZGG0039 天前
真题拆解 05:ReAct 还是 Plan-and-Execute——规划范式怎么选
python·agent·react
eokred11 天前
图片预览组件的另一种设计:Headless、可组合、开箱即用
前端·react
ylj_dev14 天前
从 0 构建 AI Workload Platform(九):真实场景、最小控制台与开源发布
go·react·开源项目·工作流·ai agent