【React】函数式组件的 ref 结果为 undefined(useRef)

函数式组件不能直接应用 ref。

class ClassComp extends Component {
    render() {
        return '';
    }
}

function FuncComp(props) {
    return '';
}

function App() {
    let refClass = useRef();
    let refFunc = useRef();

    return (
        <div>
            <ClassComp ref={refClass} />
            <FuncComp ref={refFunc} />
            <button onClick={() => console.log(refClass, refFunc)}>Log</button>
        </div>
    );
}

对于类组件,ref 实际上指向的是类组件的实例。函数式组件没有实例,因此只能得到 undefined,同时 React 会给出警告。
DevTools 报错提示


为了解决这个问题,需要引入 forwardRef 函数。forwardRef 函数能够让函数式组件接受 ref 属性,然后转发给其他可以处理 ref 的组件。

例如将 ref 转发给 DOM 节点,这样就不会出现 undefined 了。

// ...

function _FuncComp(props, ref) {
    return <div ref={ref}>123</div>;
}
const FuncComp = forwardRef(_FuncComp);

// ...

DevTools 打印 ref 结果为 div

有时候并不需要保留 DOM 节点,而是想暴露一些属性或方法对外使用。此时可以使用 useImperativeHandle。

function _FuncComp(props, ref) {
    useImperativeHandle(ref, () => {
        return {a: 1, foo: () => console.log('foo') };
    }, []); // 第三个参数为依赖,类似 useEffect
    return <div ref={ref}>123</div>;
}
const FuncComp = forwardRef(_FuncComp);

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值