react hooks--useRef

简介: 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 (





)
}

绑定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 (






)
}

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

import UseRef from './components/UseRef'

export default function App() {

return (





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

存在 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 (





姓名:{name}


)
}

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

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

使用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的保存值,不会引起组件的更新渲染。

相关文章
|
算法
算法竞赛入门【暑期速成计划】(二)
算法竞赛入门【暑期速成计划】(二)
235 1
算法竞赛入门【暑期速成计划】(二)
|
传感器
【湍流介质的三维传播模拟器】全衍射3-D传播模拟器,用于在具有随机和背景结构的介质中传播无线电和光传播(Matlab代码实现)
【湍流介质的三维传播模拟器】全衍射3-D传播模拟器,用于在具有随机和背景结构的介质中传播无线电和光传播(Matlab代码实现)
160 0
|
运维 Kubernetes jenkins
Tekton系列之实践篇-如何用Jenkins来管理Tekton
Tekton系列之实践篇-如何用Jenkins来管理Tekton
Tekton系列之实践篇-如何用Jenkins来管理Tekton
|
存储 人工智能 算法
|
3天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
10天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
4天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
418 187