React那些事

hooks之useRef

2022-01-12  本文已影响0人  _静夜听雨_

react hooks已经是大势所趋,简单整理一下useRef的使用:

useRef基础

1、useRef返回一个可变的 ref 对象,该对象只有个 current 属性,初始值为传入的参数( initialValue )。
2、返回的 ref 对象在组件的整个生命周期内保持不变,每次返回同一个引用
3、当更新 current 值时并不会引起页面重新渲染
4、更新 useRef 是 side effect (副作用),所以一般写在 useEffect 或 event 里
5、useRef 类似于类组件的 this

const domRef = useRef(initialValue)

为什么用useRef

页面不需要重新渲染,就可以取到最新的值

如何优雅获取子组件

通过useImperativeHandle,配合forwardRef

import React, {
    MutableRefObject,
    useState,
    useImperativeHandle,
    useRef,
    forwardRef,
    useCallback
} from 'react'
interface IProps {
    label: string
}
let ChildInput = forwardRef((props: IProps, ref: any) => {
    const { label } = props
    const [value, setValue] = useState('')
    // 作用: 减少父组件获取的DOM元素属性,只暴露给父组件需要用到的DOM方法
    // 参数1: 父组件传递的ref属性
    // 参数2: 返回一个对象,父组件通过ref.current调用对象中方法
    useImperativeHandle(ref, () => ({
        getValue
    }))
    const handleChange = (e: any) => {
        const value = e.target.value
        setValue(value)
    }
    const getValue = useCallback(() => {
        return value
    }, [value])
    return (
        <div>
            <span>{label}:</span>
            <input type="text" value={value} onChange={handleChange} />
        </div>
    )
})
const ParentCom: React.FC = (props: any) => {
    const childRef: MutableRefObject<any> = useRef({})
    const handleFocus = () => {
        const node = childRef.current
        console.log(node.getValue())
    }
    return (
        <div>
            <ChildInput label={'名称'} ref={childRef} />
            <button onClick={handleFocus}>focus</button>
        </div>
    )
}
export default ParentCom

常用使用场景

定时器
获取Dom元素
定义不需要引起页面渲染的变量
等等

上一篇下一篇

猜你喜欢

热点阅读