【前端】受控和非受控组件

说明

"非受控(Uncontrolled)"与"受控(Controlled)"是前端开发中非常核心的概念,尤其在 React 等现代前端框架中极为常见

它们主要用于描述组件(特别是表单元素)如何管理和控制自身的数据状态

受控组件(Uncontrolled Components)

在非受控组件中,表单元素的数据由 DOM 自身维护(类似于传统的原生 HTML),React 并不主动管理其内部状态

用shadcn/ui的dialog组件举例

Dialog - shadcn/ui

状态由 Radix 内部自己管理(点<DialogTrigger>打开,点<DialogClose>关闭)

受控组件(Controlled Components)

在受控组件中,React 组件的 State 是数据的唯一可信源。表单元素(如 <input>)本身不存储数据,仅作为展示和交互的载体

工作机制:用户输入时触发事件(如 onChange),事件处理函数更新 React State,State 的更新再反向渲染到表单元素上,从而驱动界面的更新

新建项目的弹窗

复制代码
export default function NewProjectDialog({ open, onClose }: NewProjectDialogProps) {
  return (
    <Dialog open={open} onOpenChange={(v) => !v && onClose()}>
      <DialogContent>...</DialogContent>
    </Dialog>
  )
}

为什么要受控?

因为在真实软件里,"打开新建项目弹窗"可能有好几个不同的入口:

  • 用户在欢迎界面点击了"新建项目"卡片
  • 用户在顶部菜单栏点击了"文件 -> 新建"

这些入口都需要能够从外部直接命令弹窗打开或关闭,所以弹窗的开关状态不能封死在组件内部,必须由外部通过 open={true / false} 属性传进来控制

相关推荐
中屹指纹浏览器svip8 分钟前
中屹指纹浏览器和普通 Chrome 有什么区别?
前端·chrome·中屹指纹浏览器
feixing_fx23 分钟前
CSS Grid 入门:二维布局时代的降维打击
前端·css·前端框架·css3
Lank_M28 分钟前
JPG的8×8块里只要有条边,白底就保不住255
前端
coding漫漫长路31 分钟前
主图纯白检测,阈值放宽到250会放过252的底
前端
计算机魔术师32 分钟前
藏了八个月没被当漏洞的洞,AI红队一晚上翻出来了
前端
用户831348593069834 分钟前
Vue3 v-for:常用用法与开发高频坑点
前端·javascript·vue.js
用户6210075870237 分钟前
Web 3D 开发实践:BIM+GIS 融合需要解决哪些技术问题?
前端·three.js
志尊宝38 分钟前
AI原生前端开发(017):端侧AI与Vue 3结合实战
前端·人工智能·prompt·1024·ai-native
钱栈up39 分钟前
配料秤料位查出来是负数——IoTDB存的是周期增量,我却在拿首尾相减
前端·数据库
Funlang40 分钟前
fun-ui 开源:把浏览器界面接回来
前端·javascript