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

React中同时使用useRef与value导致输入框无法编辑的解决方法

问题解决方法

你的问题核心是把输入框写成了受控组件,但外部传入的value是静态值10,每次输入时组件重渲染,输入框会被强制重置回10,导致无法编辑。要实现「允许自由编辑、仅在需要时通过ref取值、避免频繁重渲染」的需求,只需将组件改为非受控模式即可。

步骤1:修改InputField组件

将value属性替换为非受控组件的defaultValue,移除不需要的onChangeState(因为不需要同步状态到外部):

type Props = {
    defaultValue?: number; // 替换原value为defaultValue
};

const InputField = forwardRef<HTMLInputElement, Props>(({ defaultValue }, ref) => {
    return (
        <StyledInputField
            type="number"
            defaultValue={defaultValue || 0} // 用defaultValue设置初始值
            ref={ref}
        />
    );
});

export default InputField;

步骤2:修改MyComponent使用方式

保留ref用于后续取值,添加按钮触发取值逻辑,全程不会因输入操作触发重渲染:

const MyComponent= () => {
    const inputValueRef = useRef<HTMLInputElement>(null);

    // 点击按钮时获取当前输入值
    const getCurrentInputValue = () => {
        if (inputValueRef.current) {
            const value = inputValueRef.current.valueAsNumber;
            // 这里处理获取到的值,比如提交表单
            console.log("当前输入值:", value);
        }
    };

    return (
        <>
            <InputField defaultValue={10} ref={inputValueRef} />
            <button onClick={getCurrentInputValue}>获取输入值</button>
        </>
    );
}

可选:支持动态重置初始值

如果需要在某些场景下(比如表单重置)更新输入框的初始值,可以在InputField中添加useEffect监听defaultValue变化,手动同步到DOM:

import { useEffect } from 'react';

const InputField = forwardRef<HTMLInputElement, Props>(({ defaultValue }, ref) => {
    useEffect(() => {
        if (ref.current && defaultValue !== undefined) {
            ref.current.value = defaultValue.toString();
        }
    }, [defaultValue, ref]);

    return (
        <StyledInputField
            type="number"
            defaultValue={defaultValue || 0}
            ref={ref}
        />
    );
});

这样既保留了非受控组件的性能优势,又能在需要时动态重置输入框内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:55:06