You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.forwardRef使用疑问:传递ref后current始终为null原因?

问题原因与修复方案

核心问题1:同一个ref被重复绑定

你将usernameRef同时绑定到了<input>和<InputClipboardButton>的ref属性上。React中一个ref对象只能关联一个DOM节点或组件实例,重复绑定会导致ref的指向冲突,最终无法正确关联到目标input元素,导致current为null。

问题2:ClipboardButton组件未返回JSX

ClipboardButton作为函数组件,没有明确返回<button>元素,这会导致组件无法渲染,属于语法错误。


修复后的代码示例

Details.jsx

import { useRef } from 'react';
import ClipboardButton from './ClipboardButton';

const Details = () => {
    const usernameRef = useRef(null);

    // 直接把input的ref通过props传给ClipboardButton即可,无需额外封装forwardRef组件
    return (
        <div>
            <input type="text" ref={usernameRef} />
            <ClipboardButton targetInputRef={usernameRef} />
        </div>
    );
};

ClipboardButton.jsx

const ClipboardButton = ({ targetInputRef }) => {
    const copyToClipboard = () => {
        // 现在可以正确获取到input的DOM节点
        console.log(targetInputRef.current);
        if (targetInputRef.current) {
            targetInputRef.current.select();
            document.execCommand('copy');
        }
    };

    // 必须明确返回JSX元素
    return (
        <button onClick={copyToClipboard}>
            Copy
        </button>
    );
};

export default ClipboardButton;

补充说明:若需使用forwardRef的场景

如果你的业务场景确实需要给InputClipboardButton自身绑定ref,同时传递input的ref,可以这样调整:

// Details.jsx
import { useRef, forwardRef } from 'react';
import ClipboardButton from './ClipboardButton';

const Details = () => {
    const usernameRef = useRef(null);
    // 单独创建ref用于关联InputClipboardButton自身
    const buttonRef = useRef(null);

    const InputClipboardButton = forwardRef((props, ref) => {
        // ref指向buttonRef,用于关联组件自身
        // 通过props传递input的ref给子组件
        return <ClipboardButton ref={ref} targetInputRef={props.targetInputRef} />;
    });

    return (
        <div>
            <input type="text" ref={usernameRef} />
            <InputClipboardButton ref={buttonRef} targetInputRef={usernameRef} />
        </div>
    );
};

内容的提问来源于stack exchange,提问作者Karolis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:40:20