赞
踩
const intervalRef = useRef(initialValue);
useRef 返回一个具有单个 current 属性的 ref 对象。current 属性值可以修改,初始值为 initialValue。与 state 不同的是,改变 ref 不会触发重新渲染,因此可以使用 useRef 存储那些在组件多次渲染之间需要存储但又不需要渲染在页面上的数据,如定时器 ID、缓存的请求结果等。
import { useRef } from "react"; export default () => { const count = useRef(0); const handleClick = () => { count.current += 1; console.log(count.current); }; return ( <> <span>count: {count.current} </span> <button onClick={handleClick}>点击增加</button> </> ); };
使用 useRef 实现倒计时,可用于发送验证码
import { useRef, useState } from "react"; export default () => { const [count, setCount] = useState(undefined); const intervalId = useRef(null); const handleStart = () => { setCount(5); intervalId.current = setInterval(() => { setCount((count) => { if (count === 0) { clearInterval(intervalId.current); return undefined; } return count - 1; }); }, 1000); }; return ( <> <button onClick={handleStart}> {count ? "倒计时:" + count : "发送验证码"} </button> </> ); };
useRef 可以关联到组件的 DOM 元素上,通过 ref.current 来访问该 DOM 元素,以便直接访问元素的方法或属性,如获取焦点、获取滚动位置等。
import { useRef } from 'react'; export default () => { const inputRef = useRef(null); const handleClick = () => { inputRef.current.focus(); } return ( <> <input ref={inputRef} /> <button onClick={handleClick}> 聚焦输入框 </button> </> ); }
默认情况下,react 不允许访问其他组件的 DOM 节点,即使是自己的子组件。需要使用 forwardRef API 将父组件的 ref 转发给子组件,从而使父组件可以操作子组件的 DOM。
import { useRef, forwardRef } from 'react'; const MyInput = forwardRef((props, ref) => { return <input { ...props} ref={ref} /> }); export default () => { const ref = useRef(null); const handleClick = () => { ref.current.focus(); } return ( <> <MyInput ref={ref} /> <button onClick={handleClick}> 聚焦输入框 </button> </> ); }
useImperativeHandle 通常和 forwardRef 一起使用,用于向父组件暴露一个自定义的 ref 句柄。通常用于需要在父组件中调用子组件中定义的函数的情况。
import { useRef, forwardRef, useImperativeHandle } from "react"; const MyInput = forwardRef((props, ref) => { const inputRef = useRef(null); const handleFocus = () => { inputRef.current.focus(); }; // useImperativeHandle 返回一个对象,包含了父组件可以通过 ref 访问到的属性和方法 useImperativeHandle(ref, () => ({ handleFocus, })); // useImperativeHandle(ref, () => { // return { handleFocus }; // }); return <input {...props} ref={inputRef} />; }); export default () => { const ref = useRef(null); const handleClick = () => { ref.current.handleFocus(); }; return ( <> <MyInput ref={ref} /> <button onClick={handleClick}>聚焦输入框</button> </> ); };
上面两段代码都实现了聚焦输入框的功能,区别在于:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。