当前位置: 首页 > news >正文

WHAT - 受控组件和非受控组件

文章目录

  • 子组件实现
  • 父组件使用方式
    • 情况 1:非受控使用(自己内部管理)
    • 情况 2:受控使用(父组件控制)
  • 这样设计的好处

场景:有一个react组件,他的功能是有一个title和Content,后者基于一个hidden的状态来控制。我现在希望这个组件内部支持toggle之外,父组件也可以去控制。怎么实现比较好?

这是一个非常经典的“受控 + 非受控组件”场景。

  1. 组件内部有一个 hidden 状态,可以通过自身的 toggle 来控制显示/隐藏;
  2. 父组件也可以通过传入 props 来控制 hidden 状态;
  3. 当父组件不传时,组件自行管理状态;当父组件传了时,组件跟随父组件状态变化。

推荐的实现方式是使用 “受控优先 + 非受控兜底” 模式。


子组件实现

import React, { useState, useEffect } from "react";interface ToggleBoxProps {title: string;hidden?: boolean; // 受控defaultHidden?: boolean; // 非受控onToggle?: (nextHidden: boolean) => void;
}const ToggleBox: React.FC<ToggleBoxProps> = ({title,hidden: controlledHidden,defaultHidden = false,onToggle,children
}) => {// 内部状态,仅当父组件不传 controlledHidden 时生效const [uncontrolledHidden, setUncontrolledHidden] = useState(defaultHidden);const isControlled = controlledHidden !== undefined;const effectiveHidden = isControlled ? controlledHidden : uncontrolledHidden;const handleToggle = () => {const next = !effectiveHidden;if (!isControlled) {setUncontrolledHidden(next);}onToggle?.(next);};return (<div style={{ border: "1px solid #ccc", padding: "8px" }}><divstyle={{ cursor: "pointer", fontWeight: "bold" }}onClick={handleToggle}>{title} {effectiveHidden ? "▼" : "▲"}</div>{!effectiveHidden && <div>{children}</div>}</div>);
};export default ToggleBox;

父组件使用方式

情况 1:非受控使用(自己内部管理)

export default function App() {return (<ToggleBox title="非受控组件"><p>这是一段内容,点击标题可以展开/收起</p></ToggleBox>);
}

情况 2:受控使用(父组件控制)

import React, { useState } from "react";
import ToggleBox from "./ToggleBox";export default function App() {const [hidden, setHidden] = useState(false);return (<><button onClick={() => setHidden((prev) => !prev)}>父组件控制 {hidden ? "展开" : "收起"}</button><ToggleBoxtitle="受控组件"hidden={hidden}onToggle={(next) => setHidden(next)}><p>这段内容跟随父组件变化</p></ToggleBox></>);
}

这样设计的好处

  • 保留组件内部交互能力(非受控)
  • 父组件也能随时接管控制(受控)
  • 受控和非受控不会冲突,通过 hidden 是否传入自动切换模式
  • 通过 onToggle 让父组件也能响应用户点击

如果你希望“父组件控制优先,但子组件点击也能同步状态”,那 onToggle 就非常关键——它让子组件的行为能回传给父组件来同步状态。

http://www.dtcms.com/a/517948.html

相关文章:

  • 建设部网站规范查询包装设计效果图生成器
  • 成都公司的网站制作目前哪些企业需要做网站建设的呢
  • 郑州手机网站制作宁金诚信建设网站
  • 比较好的网站建设公司电话工程公司注册经营范围
  • 西安网站建设哪家好织梦做商城网站
  • 惠州建设集团网站涪城移动网站建设
  • 网站开发项目名学校网站建设内容
  • 使用MCP构建AI Apps 《MCP: Build Rich-Context AI Apps with Anthropic》
  • 营销网站建设的步骤东莞市网站建设系统企业
  • 企业公司网站建设ppt建设一个简单的网站
  • 查询网站的二级域名网页设计如何添加图片
  • 信阳网站设计个人网站网页制作
  • 企业网站优化方案的策划个旧市建设网站
  • 肥西县建设发展局网站福州台江区网站建设
  • 广州哪个区最繁华重庆seo优化公司
  • 官方网站弹幕怎么做需要推销自己做网站的公司
  • 上海未成年人思想道德建设网站网站的运营
  • 东台网站建设logo设计在线生成免费平台只需4步
  • 深圳网站建设伪静态 报价 jsp 语言网站建设龙头企业
  • 网站建设管理 自查 报告小企业网站建设地点
  • 自己做淘宝返利网站网站投资设计
  • 电竞网站建设方案wordpress拼团
  • 赣州企业网站建设推广做网课网站
  • 英文旅游网站建设找个会做网站的 一起做网站
  • 网站公司不给ftp上海网站建设 找思创网络
  • 企业网站建设可行性杭州萧山做网站
  • 树莓派玩win游戏:树莓派5 安装box86 wine vulkan运行Windows游戏,性能非常强劲,仙剑四测试完美通过
  • 网站建设费 科研 类wordpress 后台列表
  • WebGL关键知识点
  • 图片瀑布流网站模板网络空间安全学院