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

说明

"非受控(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} 属性传进来控制

相关推荐
Penge6665 分钟前
前端基础:html语义化
前端
用户308169987648516 分钟前
同一个端口能被两个程序监听吗?TCP 11 组绑定实测
前端
deli00723 分钟前
红绿灯配时实测:固定 60 秒 vs 自适应,2400 辆车差多少
前端
去伪存真23 分钟前
井道无信号、满手黑机油,我们如何用 DeepSeek V4 打造不“犯浑”的电梯维保 Agent?
前端·agent
deli00726 分钟前
60fps 为什么还是一顿一顿?帧时间曲线实测给你看
前端
时间的情敌1 小时前
Cesium 流动管线、管道动画、管线流向仿真,管网、油气、水利孪生高频需求
前端·交互·cesium
yuyuxun11 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
wangxiaoxuan2173 小时前
SLAM 的基本结构:前端、后端、回环与地图优化
前端·机器人·科沃斯八界
总要学点什么4 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Agent世界6 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript