React-useRef

  • useRef
    useRef 是 React 的一个 Hook,用来创建一个 可变的引用对象,这个引用对象在组件的整个生命周期内保持不变。
    翻译成人话就是,用useRef创建一个相对共享的对象管理器,它里面装的内容的读写是不会引起界面渲染的。
    典型的应用就是将某个界面控件放到里面,然后在适当的时候调出操作,比如获取 DOM 元素的引用,可以像原生 JavaScript 的 document.getElementById 一样,获取 DOM 元素。
javascript 复制代码
import React, { useRef } from 'react';

function FocusInput() {
  const inputRef = useRef(null);

  const handleClick = () => {
    inputRef.current.focus();  // 获取 input 元素并聚焦
  };

  return (
    <div>
      <input ref={inputRef} type="text" />
      <button onClick={handleClick}>点击聚焦</button>
    </div>
  );
}

如果要手动存放,则直接 const handlerRef = useRef(null); handlerRef.current = 'abcd'/1234/handlerRef.current = handler; current可以装任何类型

比如如果在页面初始化时需要调用后端api,我一般将操作放在useLayoutEffect里面,但是useLayoutEffect会被至少执行两次! 下面用useRef防止重复调用:

javascript 复制代码
// 使用 ref 确保 updateCounter 只执行一次
  const counterUpdatedRef = useRef(false);
  // 使用 useLayoutEffect 确保在渲染完成后再设置返回处理函数
  useLayoutEffect(() => {
    const doit = async () => {
      // 确保 updateCounter 只执行一次
      if (!counterUpdatedRef.current && curTask?.id) {
        await updateCounter();
        counterUpdatedRef.current = true;
      }
      ...
    };

    doit();
  }, [curTask, setBackHandler])
相关推荐
空中湖20 分钟前
Spring AI Agent 编排:ReAct 模式 + 多 Agent 协作实战
人工智能·spring·react.js
Revolution611 小时前
一段 JavaScript 代码执行时,到底发生了什么
前端·javascript
To_OC10 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
To_OC12 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
小林ixn12 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
এ慕ོ冬℘゜13 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
随心点儿13 小时前
js postMessage 实现跨域发送消息-应用示例
javascript·ecmascript·postmessage
kyriewen15 小时前
我让AI改一个bug——它偷偷动了5个我没让它碰的地方
前端·javascript·ai编程
gis开发之家19 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码