如何用useRef在React中非事件监听获取DOM元素,实现疑问?
- 内容介绍
- 文章标签
- 相关推荐
在 React 开发过程中。你可能会遇到需要在组件生命周期里访问 DOM 元素的问题——比如想让一个 `
- 与 React 的声明式编程风格冲突,让代码难以维护。
- 容易出现时序问题——DOM 可能尚未挂载,导致引用为空。
- 手动管理查询和清理工作,增加了出错概率。
幸运的是React 提供了 useRef 钩子。它可以让我们在非事件监听场景下安全地获取 DOM 引用,并保持组件的可读性与可维护性。
1. 为什么传统方法会让人头疼
痛点一:时序不确定
如果你直接在函数体内写 const el = document.getElementById;不过, 并马上使用它,很可能在组件第一次渲染时还没有对应元素挂载到 DOM 上。导致 null 或者错误。
痛点二:破坏封装性
直接操作全局文档对象会把业务逻辑和 UI 分离开来使得组件变得难以复用和测试。
痛点三:手动清理麻烦
如果你要添加事件监听或做其它副作用。需要自己记得在卸载时移除,这很容易被忽略。
2. 用 useRef 来这些问题
`useRef` 的主要思想是返回一个可变对象。该对象会一直保持同一份实例,而且其 .current 属性可以随时被赋值为任何值。React 会在组件挂载后把对应元素赋值给该属性。
import { useState。useEffect,useRef } from 'react';function ChatInput {
const = useState;const textareaRef = useRef;// 初始化为 null
// ...
}
a. 自动高度调整的 `
目标: 当使用者输入内容时让 `
const textareaStyle = {
再看resize。'none',overflow: 'hidden',minHeight: '50px',maxHeight: '1000px'
};说起来,function ChatInput {
const = useState;const textareaRef = useRef;// 当文本变化时更新 textarea 高度
useEffect => {
if return;textareaRef.current.style.height = 'auto';// 重置高度
textareaRef.current.style.height =
`${textareaRef.current.scrollHeight}px`;// 设置为 scrollHeight
},);return (
);}
export default ChatInput;
关键点说明:
- `ref={textareaRef}`: 将 ref 对象绑定到 `
- `useEffect` 与依赖数组 ``: 确保每次文本变化后都重新计算并设置高度;避免频繁无意义更新,
- `style.height='auto'`: 先重置高度,否则 `scrollHeight` 会受限于当前高度导致计算错误。
- `scrollHeight`: 获取实际内容所需的完整高度,这样就能实现自适应
b. 在非事件监听场景中访问 DOM 的通用模式
- Create Ref: js const myEl = useRef;
- Add ref to JSX: jsx
- Treat in effect or callback: js useEffect => { if { // e.g.,focus or measure myEl.current.focus;} },),
3. 小结与常见陷阱
- No Re-render on Ref Change: “Refs don’t trigger re-renders.”
- Mistake “const ref=useRef;” vs “const ref=useRef;”: “Both fine—just clearer to initialize with null.
- Poor Cleanup?: For event listeners added via refs you must clean m in a cleanup function inside `useEffect`.
- Avoid Overusing Refs:: When state can represent UI changes。prefer state instead of mutating DOM directly.
常见错误提醒这方面,不要把 `` 放进循环或条件渲染里因为每次渲染都会创建新的 ref 对象,导致旧节点无法正确引用。始终保持单一稳定的 ref 实例。
现在你已经掌握了如何使用 `useRef` 在 React 中非事件监听场景下安全获取并操作 DOM 元素,从而解决那些因直接查询导致的困扰。祝编码愉快,
。在 React 开发过程中。你可能会遇到需要在组件生命周期里访问 DOM 元素的问题——比如想让一个 `
- 与 React 的声明式编程风格冲突,让代码难以维护。
- 容易出现时序问题——DOM 可能尚未挂载,导致引用为空。
- 手动管理查询和清理工作,增加了出错概率。
幸运的是React 提供了 useRef 钩子。它可以让我们在非事件监听场景下安全地获取 DOM 引用,并保持组件的可读性与可维护性。
1. 为什么传统方法会让人头疼
痛点一:时序不确定
如果你直接在函数体内写 const el = document.getElementById;不过, 并马上使用它,很可能在组件第一次渲染时还没有对应元素挂载到 DOM 上。导致 null 或者错误。
痛点二:破坏封装性
直接操作全局文档对象会把业务逻辑和 UI 分离开来使得组件变得难以复用和测试。
痛点三:手动清理麻烦
如果你要添加事件监听或做其它副作用。需要自己记得在卸载时移除,这很容易被忽略。
2. 用 useRef 来这些问题
`useRef` 的主要思想是返回一个可变对象。该对象会一直保持同一份实例,而且其 .current 属性可以随时被赋值为任何值。React 会在组件挂载后把对应元素赋值给该属性。
import { useState。useEffect,useRef } from 'react';function ChatInput {
const = useState;const textareaRef = useRef;// 初始化为 null
// ...
}
a. 自动高度调整的 `
目标: 当使用者输入内容时让 `
const textareaStyle = {
再看resize。'none',overflow: 'hidden',minHeight: '50px',maxHeight: '1000px'
};说起来,function ChatInput {
const = useState;const textareaRef = useRef;// 当文本变化时更新 textarea 高度
useEffect => {
if return;textareaRef.current.style.height = 'auto';// 重置高度
textareaRef.current.style.height =
`${textareaRef.current.scrollHeight}px`;// 设置为 scrollHeight
},);return (
);}
export default ChatInput;
关键点说明:
- `ref={textareaRef}`: 将 ref 对象绑定到 `
- `useEffect` 与依赖数组 ``: 确保每次文本变化后都重新计算并设置高度;避免频繁无意义更新,
- `style.height='auto'`: 先重置高度,否则 `scrollHeight` 会受限于当前高度导致计算错误。
- `scrollHeight`: 获取实际内容所需的完整高度,这样就能实现自适应
b. 在非事件监听场景中访问 DOM 的通用模式
- Create Ref: js const myEl = useRef;
- Add ref to JSX: jsx
- Treat in effect or callback: js useEffect => { if { // e.g.,focus or measure myEl.current.focus;} },),
3. 小结与常见陷阱
- No Re-render on Ref Change: “Refs don’t trigger re-renders.”
- Mistake “const ref=useRef;” vs “const ref=useRef;”: “Both fine—just clearer to initialize with null.
- Poor Cleanup?: For event listeners added via refs you must clean m in a cleanup function inside `useEffect`.
- Avoid Overusing Refs:: When state can represent UI changes。prefer state instead of mutating DOM directly.
常见错误提醒这方面,不要把 `` 放进循环或条件渲染里因为每次渲染都会创建新的 ref 对象,导致旧节点无法正确引用。始终保持单一稳定的 ref 实例。
现在你已经掌握了如何使用 `useRef` 在 React 中非事件监听场景下安全获取并操作 DOM 元素,从而解决那些因直接查询导致的困扰。祝编码愉快,
。
