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

react hooks--useRef

基本用法

  • 在类组件中获取一个dom元素实例,可以通过React.CreateRef或者回调函数的方式去获取。
  • 语法:const refContainer = useRef(initialValue);
  • 使用场景:在 React 中进行 DOM 操作时,用来获取 DOM
  • 作用:返回一个带有 current 属性的可变对象,通过该对象就可以进行 DOM 操作了。

const inputRef = useRef(null)

解释:

  • 参数:在获取 DOM 时,一般都设置为 null
  • 返回值:包含 current 属性的对象。

  • 注意:只要在 React 的函数组件中进行 DOM 操作,都可以通过 useRef Hook 来获取 DOM(比如,获取 DOM 的宽高等)。
  • 注意:useRef不仅仅可以用于操作DOM,还可以操作组件

通过useRef获取DOM元素或组件实例:

import React from 'react'
import {useRef} from 'react'

export default function UseRef() {
  let inputRef = useRef()

  function login() {
      console.log(inputRef.current.value)
  }

  return (
      <div>
          <input ref={inputRef} placeholder={'请输入账号'} />
          <button onClick={login}>登录</button>
      </div>
  )
}

绑定ref后,和React.createRef返回的结构一致,通过.current获取到元素。

useRef保存数据

在文件中定义一个全局变量保存数据

存在 bug

UseRef.jsx

import {useRef, useState} from "react";

let count = 0;

export default function UseRef() {
    console.log('ref')
    let inputRef = useRef()
    function login() {
        count += 1;
    }
    function printCount() {
        console.log(count)
    }
    return (
        <div>
            <input ref={inputRef} placeholder={'请输入账号'} />
            <button onClick={login}>登录</button>
            <button onClick={printCount}>打印count</button>
        </div>
    )
}

这种全局保存变量的方式,有问题,原因在于在组件中多次使用这个组件会共享数据,可能会导致一些bug存在。

import UseRef from './components/UseRef'

export default function App() {

  return (
      <div>
          <UseRef />
          <UseRef />
      </div>
  )
}

在函数组件中直接定义变量

存在 bug

import {useRef, useState} from "react";

export default function UseRef() {
    let count = 0;
    console.log('ref')
    let inputRef = useRef()
    let [name, setName] = useState('张三')
    function login() {
        count += 1;
    }
    function printCount() {
        console.log(count)
    }
    return (
        <div>
            <input ref={inputRef} placeholder={'请输入账号'} />
            <button onClick={login}>登录</button>
            <button onClick={printCount}>打印count</button>
            姓名:{name}
            <button onClick={() => setName('李四')}>修改name</button>
        </div>
    )
}

这种方式可以短暂的保存值,但是一旦函数组件更新渲染,那么这个变量的值就会重置

原因是因为函数组件更新渲染时,代码从上往下重新运行。

使用useRef保存值

在整个生命周期里ref里存储的都是同一个,这样就可以----

解决闭包陷阱问题

import {useRef, useState} from "react";


export default function UseRef() {
    // let count = 0;
    let count = useRef(0);

    console.log('ref')

    let inputRef = useRef()
    let [name, setName] = useState('张三')

    function login() {
        // console.log(inputRef.current.value)
        count.current += 1;
    }

    function printCount() {
        console.log(count.current)
    }

    return (
        <div>
            <input ref={inputRef} placeholder={'请输入账号'} />
            <button onClick={login}>登录</button>
            <button onClick={printCount}>打印count</button>
            姓名:{name}
            <button onClick={() => setName('李四')}>修改name</button>
        </div>
    )
}

通过useRef保存值,可以长期存贮,不会重置

使用useRef定义变量的好处:

  • 修改state后ref保存的数据不会变化
  • 多个组件的数据,不会共享,类似于class的实例字段
  • 修改ref的保存值,不会引起组件的更新渲染。

总结


http://www.kler.cn/a/317471.html

相关文章:

  • UE5 UE4 播放视频没有声音解决
  • 多进程/线程并发服务器
  • #include<string>和#include<string.h>有什么区别
  • WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等
  • 阿里云centos7.9服务器磁盘挂载,切换服务路径
  • 【数据结构与算法】第12课—数据结构之归并排序
  • 结构设计模式 -装饰器设计模式 - JAVA
  • dockerfile案例
  • unity将多层嵌套的结构体与json字符串相互转化
  • 定制智慧科技展厅方案:哪些细节是成功的秘诀?
  • 基于报位时间判断船舶设备是否在线,基于心跳时间判断基站网络是否在线
  • Android String资源文件中,空格、换行以及特殊字符如何表示
  • 循环遍历把多维数组中的某个值改成需要的值
  • 【计算机网络 - 基础问题】每日 3 题(十一)
  • 《深度学习》—— PyTorch的介绍及PyTorch的CPU版本安装
  • 把任务管理器里面的vmware usb arbitrition停了,虚拟机一直识别不到手机设备了
  • vue上传预览CAD文件
  • Java中ArrayList和LinkedList的比较
  • 【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】
  • 第九节 Opencv自带颜色表操作
  • Unity using API openai Error en la solicitud: HTTP/1.1 400 Bad Request
  • 本地搭建我的世界服务器(JAVA)简单记录
  • JSP(Java Server Pages)基础使用
  • 打破网络安全域限制:跨区域文件传输的创新解决方案
  • Unity项目的脚本继承关系
  • 如何编写自己的Arduino库?