:::info
useRef返回一个ref对象,返回的ref对象让组件的整个生命周期保持不变。
作用:ref是react官方给我们预留的访问DOM元素或者组件实例的句柄。方便我们对DOM元素或者组件实例进行访问,对dom元素进行一些操作。
最常用的ref的两种用法:
- 用法1:引入实际的DOM元素(或者组件,但是需要是class组件)。
- 用法2:保存一个数据,这个对象在整个生命周期中可以保存不变。
:::
1、useRef的具体使用(不传递参数)
```javascript import React, { Component, useRef } from ‘react’
// 定义类子组件 class Son1 extends Component { render() { return (
Son1类组件
// 定义函数子组件 function Son2() { return (
Son2函数式组件
export default function RefHookDemo() { // 绑定普通的dom元素 const h2Ref = useRef() // 绑定input输入框 const inputRef = useRef()
// 绑定子组件 不能使用ref来绑定函数式组件 const son1Ref = useRef() const son2Ref = useRef()
// 定义函数 function btnClick() { // 在这里可以操作dom 改变html里面的数据 h2Ref.current.innerHTML = ‘测试数据’ // 使输入框进行聚焦 inputRef.current.focus()
// 获取子组件console.log(son1Ref) // 可以绑定类组件 类组件才有实例进行访问console.log(son2Ref) // 函数式组件 不能直接使用ref进行绑定 控制台直接报错
}
return (
useRef的初步体验
文本值
:::info总结: useRef代替了原生获取dom元素的功能。不传递参数的时候,直接帮助我们绑定DOM元素。还可以使用ref来绑定子组件,但是访问值的时候需要加上.current属性来得到元素。使用ref绑定子组件的时候,子组件只能是类组件,不能是函数式组件。类组件才有实例进行访问。<br />原理(个人理解):就是使用useRef提供的功能,创建一个标识符,将这个标识符与实际的DOM元素或者组件进行绑定,在后面就可以通过标识符的名称来访问对应绑定的组件。:::<a name="Wc72x"></a># 2、直接绑定相应的数据(传递参数)> 实现上一次数据的记录和本次修改后数据的展示```javascriptimport React, { useState, useRef, useEffect } from 'react'export default function RefHookDemo2() {// 定义一个状态数据 并且返回数据和修改数据的行为(action)const [count, setCount] = useState(200)// useRef传入其它的值 函数返回的是包裹了这个数据的对象 在整个生命周期函数中 只会执行一次const numberRef = useRef(count)// 使用useEffect useEffect函数依赖变量count 当变量count发生变化时,// useEffect中的回调函数就会执行,会修改number.current中的值。useEffect(() => {numberRef.current = count}, [count])// 可以获取这个对象function btnClick() {// 修改数据setCount(count + 10)}return (<div><p>useRef引用其它数据</p><h3>useRef的数据-- useState上一次的数据--{numberRef.current}</h3><h3>useState最新的数据--{ count }</h3><button onClick={ btnClick }>点击测试</button></div>)}
3、代码案例
:::info forwardRef的具体使用:
- 通过forward可以将ref转发到子组件。
- 子组件拿到父组件中创建的ref,绑定到子组件内部的某一个元素中。 ::: ```javascript import React, { useRef, forwardRef } from ‘react’;
// ref可以传递到子组件的内部 在子组件的内部进行使用 在这里需要使用forwardRef函数进行包裹,否则无法对父组件传递的ref进行转发 在自己的内部子组件中进行使用
// 子组件 const ChildInput = forwardRef((props, ref) => { return })
// 父组件 export default function ForwardRefDemo() { const inputRef = useRef();
return (
