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

说明

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

相关推荐
迅猛龙办公室2 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
小狼154542 小时前
浏览器扩展脚本为什么有时候不生效:注入时机、iframe 和单页路由,多多开票助手
前端·chrome
じòぴé南冸じょうげん3 小时前
油猴脚本突然发现变成灰色了,无法使用?页面不生效?刷新页面没反应?
前端
Csvn4 小时前
组合式 API(Composition API)
前端
火柴就是我5 小时前
Android 打包报错 25.0.3
android·前端
BD_Marathon5 小时前
消息对象中字段的说明
java·前端·python
八荒启·交互动画6 小时前
Web特效025—用 Canvas 2D 做Web特效的定义与边界:这支画笔能做到哪一步
前端·webgl·网页特效·八荒启-交互动画·八荒启
Ai-_Man6 小时前
您您这可以把Dola的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。用AI导出鸭,答案是可以的
开发语言·前端·人工智能·小程序
excel6 小时前
Nuxt 中使用 useHead 优化 SEO 与 GEO
前端
IT_陈寒7 小时前
SpringBoot启动慢得像蜗牛?原来是这个配置在捣鬼
前端·人工智能·后端