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

React表单问题:未修改字段返回初始状态而非API默认值

解决方案

问题核心是状态初始化逻辑和组件受控性不匹配:你用defaultValue仅设置了输入框的初始显示值,但状态(noResi/kurir/ongkir)的初始值是0,用户未修改字段时,状态不会自动同步defaultValue的内容,提交时自然会带上初始的0。

解决方法是把表单改成受控组件,让状态与输入框值完全同步,且初始化状态时直接复用API返回的transaction数据:

  1. 用API数据初始化表单状态

    // 基于React Hooks示例,获取到transaction数据后初始化状态
    const [formData, setFormData] = useState({
      resi: transaction.resi,
      courier: transaction.courier,
      ongkir: transaction.ongkir
    });
    
  2. 将defaultValue替换为value绑定状态,通过onChange同步更新

    <input 
      value={formData.resi} 
      onChange={(e) => setFormData(prev => ({ ...prev, resi: e.target.value }))} 
    />
    <select 
      value={formData.courier} 
      onChange={(e) => setFormData(prev => ({ ...prev, courier: e.target.value }))} 
    />
    <input 
      value={formData.ongkir} 
      onChange={(e) => setFormData(prev => ({ ...prev, ongkir: e.target.value }))} 
    />
    
  3. 提交时直接使用formData对象
    此时不管用户修改了哪些字段,formData里未修改的字段都会保留API返回的初始值,不会出现0的异常情况。

如果是类组件,逻辑类似:在获取到API数据后,将transaction赋值给组件状态,表单元素绑定this.state对应字段,onChange时更新状态即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:40:29