函数组价 hook--useRef

useRef

useRef允许创建一个对元素或值的可变引用,创建的初始值为传入的参数,它的返回值是一个ref对象,这个对象使用.current属性就是该数据的最新值。它通常用于直接访问和管理DOM元素,存储持久值,或处理不应触发重新渲染的值。

  • 返回一个可变的 ref 对象,该对象只有个current属性,初始值为传入的参数
  • 返回的 ref 对象在组件的整个生命周期内保持不变,useRef类似于类组件的this
  • 当更新useRef创建的值时并不会触发组件的重新渲染,这是与useState不同的地方
  • 更新useRef创建的值是副作用操作,所以一般写在useEffect 或事件处理函数里

语法和使用

js 复制代码
const refContainer = useRef(initialValue);

多个同名ref情况

当页面中多个相同的同名的ref,后者会覆盖前者,只会获取一个。代码示例如下:

js 复制代码
import {useRef} from 'react'

export default function App() {
  let test=useRef();
  let look=()=>{
    console.log(test.current);
  }
  return (
    <div>
      <p ref={test}>App组件</p> 
      <p ref={test}>test</p>
      <button onClick={look}>look</button>
    </div>
  )
}

访问DOM元素

使用useRef的一个最简单的情况就是在函数组件里面获取DOM对象的引用。可以使用useRef直接引用组件内的元素,而不是使用document.getElementById或其他DOM的API来查询。

案例:组件挂载后输入框自动聚焦

js 复制代码
import {useRef,useEffect} from 'react'

export default function App() {
  // 使用useRef直接引用组件内的元素
  let inputel=useRef();
  useEffect(()=>{
    console.log(inputel);
    // 聚焦输入元素
    inputel.current.focus();
  })
  return (
    <div>
      <p>App组件</p> 
      <input type="text" ref={inputel}/> 
    </div>
  )
}

通过useRef定义inputel变量,在input元素上定义ref={inputel},这样通过inputel.current就可以获取到inputDom 元素,然后调用下focus函数进行获取焦点。

存储之前的值

使用useRef存储一个跨渲染持久的值,但更新它不会触发重新渲染。一个组件的state可以在多次渲染之后依旧不变。但是state的问题在于一旦修改了它就会造成组件的重新渲染。如果需要保存一些数据,并希望这些数据在组件重新渲染时不会丢失,可以使用 useRef

js 复制代码
import { useEffect, useRef, useState } from 'react';
export default function App() {
  const count = useRef(0);
  const [msg, setMsg] = useState([])
  useEffect(() => {
    count.current = count.current + 1;
  });
  const changeHandle = () => {
    const arr = [...msg];
    arr.push(7)
    setMsg(arr);
  };
  return (
    <>
      <div>
        页面加载了 {count.current} 次。
      </div>
      <button onClick={changeHandle}>修改msg</button>
    </>
  )
}
相关推荐
程序员ys7 小时前
前端权限控制设计
前端·vue.js·react.js
不会敲代码17 小时前
从零开始用 TypeScript + React 打造类型安全的 Todo 应用
前端·react.js·typescript
小时前端1 天前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
阿慧勇闯大前端1 天前
在AI时代,再去了解react19新特性还有用吗? 最近总有朋友问我:“现在AI写代码这么厉害了,我写个需求丢给ChatGPT,几秒钟就生成一堆组件,还学新特
前端·react.js
喵爱吃鱼1 天前
关于我明明用了ref还是陷入React闭包陷阱
前端·react.js
Lupino1 天前
被 React “玩弄”的 24 小时:为了修一个不存在的 Bug,我给大模型送了顿火锅钱
前端·react.js
ZengLiangYi2 天前
React 事件订阅的稳定引用问题:从 useEffect 到 useEffectEvent
react.js
是你的小橘呀2 天前
TypeScript在React项目中的实战应用指南
react.js
leolee182 天前
react redux 简单使用
前端·react.js·redux
gxp1233 天前
初学React:请求数据参数未更新 && 数据异步状态更新问题
react.js