Hooks从语法上来说是一些函数。这些函数可以用于在函数组件中引入状态管理和生命周期方法。
可以在函数式组件中存储/查找组件内的元素或其他数据
useRef(initialValue)返回一个可变的ref对象,该对象只有一个current属性,初始值为传入的参数initialValue,并且返回的ref对象在组件的整个生命周期内保持不变。
作用:
import {useRef} from 'react'
function APP(){
const userRef = useRef(null);
const clickButton = ()=>{
if(userRef.current){
console.log(userRef.current);
}
}
return
}
import {useRef,useState} from 'react'
function APP(){
const [count,setCount] = useState(0);
const countRef = useRef(null);
const preCount = countRef.current;
useEffect(()=>{
countRef.current = count;
});
const clickButton = ()=>{
setCount(count+1);
}
return
}
当ref作用在一个函数式组件上时不会获取到组件实例。因此需要使用forwardRef。
forwardRef会创建一个React组件,这个组件能够将其接收的ref属性转发到自己的组件树。
forwardRef()的用法是包裹一个组件。
import {forwardRef,useRef,useEffect} from 'react'
const Child = forwardRef((props,ref)=>{
return
});
function App(){
const childRef = useRef(null);
useEffect(()=>{
childRef.current.focus();
});
return <>
>
}
useImperativeHandle允许组件自定义需要暴露的ref数据,是为了解决useRef获取到组件的所有属性和方法的问题。
useImperativeHandle(ref,handle,[deps]):
import {useRef,useImperativeHandle,forwardRef} from 'react'
const Child = forwardRef((props,ref){
useImperativeHandle(ref,()=>{
return {
focus:()=>ref.current.focus()
}
},[props.value]);
retunr
});
function App(){
const childRef = useRef(null);
return <>
>
}