首页 > 其他分享 >React Hooks之useRef详解

React Hooks之useRef详解

时间:2023-10-11 11:44:38浏览次数:36  
标签:useRef const Hooks React forwardRef Demo return ref

React Hooks之useRef详解

最新推荐文章于 2023-08-26 21:32:11 发布 于 2023-02-18 10:23:20 发布 2717 收藏 5 分类专栏: React 文章标签: react.js Hook Hooks useRef ref 版权 React 专栏收录该内容 4 篇文章 0 订阅 订阅专栏

一、什么是useRef

const refContainer = useRef(initialValue);

  • useRef 返回一个可变的 ref 对象,其内部只有一个 current 属性被初始化为传入的参数(initialValue)
  • useRef 返回的 ref 对象在组件的整个生命周期内持续存在
  • 更新 current 值时并不会触发页面的重新渲染(re-render)
  • useRef 会在每次渲染时返回同一个 ref 对象

本质上,useRef 就像是可以在其 .current 属性中保存一个可变值的“盒子”。

二、useRef的使用

1. 使用useRef获取DOM元素
import { useRef, MutableRefObject } from 'react';
const Demo = () => {
  let inputEle: MutableRefObject<any> = useRef(null);
  useEffect(() => {
  	console.log(inputEle);
  }, [])

  return (
    <>
     <input ref={ inputEle } type="text" />
     <button onClick={
      () => {
        inputEle.current.focus();
      }
     }>输入框聚焦</button>
    </>
  )
};

export default Demo;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

inputEle值如下:
在这里插入图片描述
小结: 通过useRef定义inputEle变量,在input 元素上定义ref={inputEle},这样通过inputEle中current保存的值为input DOM 元素,这样就可以操作DOM元素了。

2. 使用useRef获取子组件中的DOM元素
import { useRef } from "react";

const Demo = () => {
  let childRef = useRef(null);

  return (
    <>
      <Child ref={ childRef } />
    </>
  );
};

const Child = () => {
  return (
    <>
      <input type="text" />
    </>
  );
}

export default Demo;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

当我们给子组件加了ref后,控制台会报以下错误:
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

上述报错的意思是我们不能直接使用ref给子组件,需要forwardRef进行传递转发。

forwardRef: 将父类的ref作为参数传入函数式组件中
React.forwardRef((props, ref) => {})

用法如下:

import { forwardRef, useEffect, useRef } from "react";

const Demo = () => {
  let childRef = useRef(null);
  useEffect(() => {
    console.log(childRef);
  }, [])

  return (
    <>
      <Child ref={ childRef } />
    </>
  );
};

const Child = forwardRef((props, ref) => {
  return (
    <>
      <input type="text" ref={ ref } />
    </>
  );
})

export default Demo;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

childRef值如下:
在这里插入图片描述

3. 使用useRef获取子组件中的属性和方法

useImperativeHandle(ref, createHandle, [deps]);

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值,大多数情况下useImperativeHandle 应当与 forwardRef 一起使用:

import {
  forwardRef,
  useEffect,
  useImperativeHandle,
  useRef,
  useState,
} from "react";

const Demo = () => {
  let childRef = useRef(null);
  useEffect(() => {
    console.log(childRef);
  }, []);

  return (
    <>
      <Child ref={childRef} />
    </>
  );
};

const Child = forwardRef((props, ref: any) => {
  const [num, setNum] = useState(0);
  const handleClick = () => {
    console.log("Hello World!");
  };

  useImperativeHandle(ref, () => {
    return {
      num,
      handleClick,
    };
  });
  return (
    <>
    </>
  );
});

export default Demo;
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

childRef的值如下:
在这里插入图片描述

 

标签:useRef,const,Hooks,React,forwardRef,Demo,return,ref
From: https://www.cnblogs.com/sexintercourse/p/17756708.html

相关文章

  • 前端进阶系列——理解 React Ref
    前端进阶系列——理解ReactRef秦书羽杭州@朝夕光年​关注他 17人赞同了该文章Ref是Reference(引用)的缩写。一、前言在React中通常遵循“自上而下”的“单向数据流”。父组件和子组件的通讯只能通过Props。如果要修改一个子组件,我们要修改......
  • React跨路由组件动画
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:佳岚回顾传统React动画对于普通的React动画,我们大多使用官方推荐的react-transition-group,其提供了四个基本组件Transition、CSSTr......
  • 盘点KendoReact五大功能,让JavaScript数据网格构建更轻松!
    在本文中,我们将为大家分享KendoReact DataGrid中最受欢迎的五大功能:性能、数据组织、列和行交互、编辑自定义以及导出。有了这些功能,开发者大可不必从头开始构建JavaScript数据网格了!KendoUI是带有jQuery、Angular、React和Vue库的JavaScriptUI组件的最终集合,无论选择哪种Jav......
  • 如何编写难以维护的 React 代码?耦合通用组件与业务逻辑
    在众多项目中,React代码的维护经常变得棘手。其中一个常见问题是:将业务逻辑直接嵌入通用组件中,导致通用组件与业务逻辑紧密耦合,使其失去“通用性”。这种做法使通用组件过于依赖具体业务逻辑,导致代码难以维护和扩展。示例:屎山是如何逐步堆积的让我们看一个例子:我们在业务组件Pag......
  • useState() and useEffect() in react
    foruseState(),see:https://www.freecodecamp.org/news/usestate-vs-redux-state-management/  foruseEffect(),see: https://www.freecodecamp.org/news/react-useeffect-absolute-beginners/简单说就是:当前component之行完毕后会之行useEffect定义的第一个参数的函......
  • [完结16章]React18内核探秘:手写React高质量源码迈向高阶开发
    点击下载——[完结16章]React18内核探秘:手写React高质量源码迈向高阶开发  提取码:8epr手写React高质量源码,迈向高阶开发React18内核探秘:手写React高质量源码迈向高阶开发batching批处理,说的是,可以将回调函数中多个setState事件合并为一次渲染,因此是异步的。解决的问题是......
  • React 大师版
    第一部分一、todoList案例相关知识点 1.拆分组件、实现静态组件,注意:className、style的写法 2.动态初始化列表,如何确定将数据放在哪个组件的state中? ——某个组件使用:放在其自身的state中 ——某些组件使用:放在他们共同的父组件state中(官方称此操作为:状态提升) 3.关于......
  • 创建vue3项目、setup函数、ref函数、reactive函数、计算监听属性、生命周期、torefs、
    创建vue3项目#两种方式-vue-cli:vue脚手架---》创建vue项目---》构建vue项目--》工具链跟之前一样-vite:https://cn.vitejs.dev/-npmcreatevue@latest一路选择即可#运行vue3项目-vue-cli跟之前一样-vi......
  • The Road to learn React
    React基础组件内部状态组件内部状态也称之为局部状态,允许保存、修改和删除存储在组件内部的属性使用ES6类组件可以在构造函数种初始化组件的状态,构造函数只会在组件初始化的时候调用一次constlist=[{title:'React',url:'https://facebook.github.io/react......
  • Vue3中shallowReactive 与 shallowRef 的用法
    转自:https://blog.csdn.net/qq_54527592/article/details/119840044  shallowReactive与shallowRef   shallowReactive:只处理对象最外层属性的响应式(浅响应式)。   shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。   什么时候使用?     ......