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。

相关推荐
kyriewen1 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒1 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端
Revolution612 小时前
React 组件重新渲染时,到底重新执行了什么
前端·react.js·面试
用户2181697049303 小时前
Flutter(四)Dart语法 空安全 运算符 流程控制
前端
许彰午3 小时前
政务督办的分合模式:主办协办的并发审批
前端·javascript·政务
用户69371750013843 小时前
AI时代,程序员该往哪走?
前端·后端
ttwuai3 小时前
GoFrame 后台日志清空失败:无 WHERE 删除为什么被拦住
前端·golang
易筋紫容3 小时前
创建型模式:对象的诞生艺术
开发语言·前端·javascript
半句唐诗4 小时前
我是如何通过 Access Token 成功发布第一个 npm 包的
前端·npm·node.js
程序员黑豆4 小时前
鸿蒙应用开发:@Provider 与 @Consumer 跨组件双向同步详解
前端·harmonyos