setState组件更新

setState -> 告诉React 状态变化 -> 需要重新渲染 -> 重新执行NameInput函数

javascript 复制代码
import { useState } from "react";


function NameInput() {
    const [name, setName] = useState("")
    console.log(name)
    const [agreed, setAgreed] = useState(false)
    console.log(agreed)
    return (
        <>
            <input value={name}
                onChange={(e) => setName(e.target.value)}
            />

            <input type="checkbox"
                checked={agreed}
                onChange={(e) => setAgreed(e.target.checked)}
            />
        </>

    )
}

export default NameInput

原理很简单:console.log(agreed) 写在组件函数体里,不是写在事件回调里。

React 组件本质就是一个函数,每次这个组件要重新渲染,React 就会重新调用这个函数一遍,函数体里的代码(包括 console.log)都会重新执行一次。

点击 checkbox 的流程是:

  1. 触发 onChange,调用 setAgreed(e.target.checked)
  2. setAgreed 是 state 更新函数,调用它会告诉 React:"这个组件的状态变了,需要重新渲染"
  3. React 重新执行 NameInput() 这个函数
  4. 函数体从头执行一遍,console.log(agreed) 也就跟着执行一遍,打印出最新的 agreed

所以你点一次 checkbox,setAgreed 触发一次重渲染,NameInput 函数体整体跑一遍,console.log 自然就打印一次。同理你打字改 name 的时候,console.log(name) 也会跟着打印,因为 setName 也会触发重渲染。

这也是为什么之前提到的 TodoApp 里那个 console.log 在 StrictMode 下刷新会打印 2 次的原因是一样的:只要函数体被调用,里面所有同步代码都会执行,不只是 return 的 JSX。

相关推荐
东风破_4 小时前
Docker 基础:为什么需要容器?
前端·后端·nginx
东风破_4 小时前
Docker 实战:使用 Nginx 作为容器入口代理 Node 服务
前端·后端·nginx
你别说话了5 小时前
Vue项目解决跨域
前端·javascript·vue.js
指尖时光.5 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
唐青枫6 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
网安蟹佬霸6 小时前
OSINT开源情报收集实战:从信息搜集到资产测绘(2026最新万字保姆级指南)
前端·网络·安全·web安全·网络安全·开源
a1117766 小时前
3D历史建筑展览馆 THreeJS 开源
前端·开源
单线程_016 小时前
【源码阅读】Vue3 Tokenizer 词法分析器完整状态机流转深度梳理(3.4+ 新版架构)
前端
PBitW7 小时前
PM 丢来 3 个 Excel、12 个功能、4 种情形?用 TRAE Work 30 分钟整理成前端开发文档
前端·trae
学习星球8 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js