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

useRef、useForwardRef 和 useImperativeHandle

useRefuseForwardRef 和 useImperativeHandle 是 React 中用于处理引用(refs)的三个不同 Hook,它们的用途和应用场景有明显区别:

1. useRef

  • 用途:创建一个可变的 ref 对象,用于存储不需要触发渲染的变量(如 DOM 节点、定时器 ID、任意值)。
  • 特点
    • 不触发重新渲染:修改 .current 属性不会触发组件更新。
    • 跨渲染周期保留值:每次渲染时返回同一个 ref 对象。
  • 示例

    jsx

    function TextInput() {const inputRef = useRef(null);const focusInput = () => {inputRef.current.focus(); // 访问 DOM 节点};return (<div><input ref={inputRef} type="text" /><button onClick={focusInput}>聚焦输入框</button></div>);
    }
    

2. forwardRef

  • 用途:将 ref 从父组件传递到子组件的内部元素(通常是 DOM 节点),突破组件封装。
  • 特点
    • 函数组件默认不接收 ref,需用 forwardRef 包裹才能接收。
    • 常用于自定义组件(如封装 Input、Button 等)。
  • 示例

    jsx

    // 子组件:使用 forwardRef 接收 ref
    const CustomInput = forwardRef((props, ref) => {return <input ref={ref} {...props} />;
    });// 父组件:传递 ref
    function Parent() {const inputRef = useRef(null);const focusInput = () => {inputRef.current.focus(); // 直接访问 CustomInput 内部的 input};return (<div><CustomInput ref={inputRef} /><button onClick={focusInput}>聚焦</button></div>);
    }
    

3. useImperativeHandle

  • 用途:与 forwardRef 配合使用,自定义暴露给父组件的 ref 内容(例如,只暴露特定方法而非整个 DOM 节点)。
  • 特点
    • 控制 ref 的暴露内容:可以隐藏内部实现细节,只暴露需要的方法或属性。
    • 提高封装性:避免直接暴露 DOM 节点。
  • 示例

    jsx

    // 子组件:自定义暴露的 ref 内容
    const CustomInput = forwardRef((props, ref) => {const inputRef = useRef(null);useImperativeHandle(ref, () => ({focus: () => {inputRef.current.focus();},clear: () => {inputRef.current.value = '';}}));return <input ref={inputRef} {...props} />;
    });// 父组件:只能访问子组件暴露的方法
    function Parent() {const inputRef = useRef(null);const handleFocus = () => {inputRef.current.focus(); // 可用// inputRef.current.value = 'xxx'; // 不可用,未暴露};return (<div><CustomInput ref={inputRef} /><button onClick={handleFocus}>聚焦</button></div>);
    }
    

总结对比

Hook主要用途是否与子组件通信暴露内容
useRef存储 DOM 节点或可变值,不触发渲染整个 ref 对象或 DOM 节点
forwardRef将父组件的 ref 传递到子组件内部的 DOM 节点完整的 DOM 节点
useImperativeHandle与 forwardRef 配合,自定义暴露给父组件的内容(如特定方法)自定义的方法或属性

使用场景建议

  • useRef:内部管理 DOM 或状态(如定时器、表单值)。
  • forwardRef:封装可复用组件,需要父组件直接操作内部 DOM。
  • useImperativeHandle:限制父组件对 ref 的访问,暴露有限的 API(如只允许调用 focus())。
http://www.xdnf.cn/news/713665.html

相关文章:

  • SpringSecurity
  • 深入了解 C# 异步编程库 AsyncEx
  • Minimax-speech-hd
  • Qt DateTimeEdit(时间⽇期的微调框)
  • 【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack实战 (下)
  • ElasticSearch简介及常用操作指南
  • TypeScript中?和!号用法
  • Asp.Net Core 托管服务
  • Cannot find any provider supporting AES/ECB/PKCS7Padding
  • 智能外呼系统中 NLP 意图理解的工作原理与技术实现
  • 【前端】Vue3 中实现两个组件的动态切换保活
  • 制造企业生产数据分析全解析:5大类数据定义、分析方法与落地指南
  • 【Oracle】DCL语言
  • 【深度学习新浪潮】什么是混合精度分解?
  • Docker常用命令操作指南(一)
  • OPC Client第6讲(wxwidgets):Logger.h日志记录文件(单例模式);登录后的主界面
  • 【HTML/CSS面经】
  • 各国竞争的下一代液晶技术:中国铁电液晶取得重大突破突破
  • python和风api获取天气(JSON Web Token)
  • PostgreSQL如何更新和删除表数据
  • 【达梦数据库】内存使用资源评估
  • 图片压缩工具 | 发布到咸鱼并配置网盘自动发货
  • 通义灵码2.5——基于MCP实现我的12306火车票智能查询小助手
  • 66常用控件_QTableWidget的使用
  • 如何在 Odoo 18 中创建 PDF 报告
  • 【JavaScript 高级】事件循环机制详解
  • 第一个桌面应用程序的创建
  • 实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.2 R语言解题
  • 文科小白学习Linux系统之安全管理
  • QT使用说明