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

函数组件中使用forwardRef后ref.current为null的问题咨询

问题分析与修正

你的核心问题是对forwardRef的使用逻辑理解有误,主要存在两个关键错误:

错误1:父组件未正确传递ref

你把ref作为自定义props(ref_input)传递给子组件,但forwardRef的机制是接收组件的原生ref属性,而非自定义props。父组件里的ref_input始终是{current: null},就是因为没有通过正确的通道绑定到子组件。

错误2:子组件对ref的调用逻辑错误

子组件中你试图通过ref_input?.current?.clear()调用方法,但即便传递正确,forwardRef传递过来的ref已经是包含current的ref对象,绑定到TextInput后,直接操作ref.current即可,但前提是传递通道要正确。


修正后的代码

父组件LoggedInHome

export function LoggedInHome({ navigation }) {
    const ref_input = useRef();
    function focusInput() {
        ref_input.current?.focus()
    }
    // 原有的focusInput调用逻辑可保留,现在会正常生效
    return (
        // ...其他代码
        <MainInput navigation={navigation} ref={ref_input} />
    )
}

子组件MainInput

const MainInput = forwardRef(function MainInput({ navigation }, inputRef) {
    let swipeableRow: Swipeable;
    
    const updateRef = (ref: Swipeable) => {
        swipeableRow = ref;
    };

    // 清除输入框的逻辑,现在可正常调用
    const clearInput = () => {
        inputRef.current?.clear();
    };

    return (
        <Swipeable
            // ...其他属性
            ref={updateRef}
        >
            <View>
                <TextInput
                    // ...其他属性
                    ref={inputRef}
                />
            </View>
        </Swipeable>
    );
});

额外说明

如果子组件需要频繁操作输入框ref,也可以在子组件内部定义本地ref,同步父组件传递的ref:

const localInputRef = useRef(null);
// 同步父组件的ref
useEffect(() => {
    localInputRef.current = inputRef.current;
}, [inputRef]);
// 之后用localInputRef.current?.clear()调用即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:05:17