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

React useState存储动态输入框值重复追加问题解决方案

问题根源

现有代码存在4个问题导致输出不符合预期:

  • 初始状态默认写入了一条空值{value:'', product_id:''}冗余数据,无空值需求时初始值直接设为空数组即可
  • 输入变更逻辑是直接将新值追加到数组末尾,没有对相同product_id的历史记录做去重替换,每次输入都会新增一条重复id的历史条目
  • React的state更新是异步的,在调用setFilteredValuesSlider之后立刻打印state,拿到的是更新前的旧值,要观测最新状态需要用useEffect监听state变化
  • 动态列表渲染未给根节点加唯一key属性,会触发React渲染警告,建议补上
修复后完整代码
const [filteredValuesSlider, setFilteredValuesSlider] = React.useState([]);

const changeFilteresValuesFromSlider = (value, product_id) =>{
  setFilteredValuesSlider((prevValues) => {
    // 先移除当前product_id对应的旧记录,再追加最新输入值,自动实现同id只保留最新值
    const existedValues = prevValues.filter(item => item.product_id !== product_id);
    return [...existedValues, { value, product_id }]
  });
}

// 监听state变化打印最新值
React.useEffect(() => {
  console.log(filteredValuesSlider);
}, [filteredValuesSlider])

// 渲染部分
{filterListDataName && ( 
  filterListDataName.map((item) => {
    // 从state中匹配当前输入框对应的值,做受控绑定避免输入值和状态不同步
    const inputValue = filteredValuesSlider.find(v => v.product_id === item.id)?.value || '';
    return (
          <div className='mt-1 form-content' key={item.id}>
            <input 
              type="text" 
              placeholder="insert number" 
              value={inputValue}
              onChange={(e) => changeFilteresValuesFromSlider(e.target.value, item.id)}
            />
          </div>
    );
  }))}
实现效果

修改后输入时,相同product_id的旧值会被自动替换,最终state数组里每个id只会保留最后一次输入的最新值,和预期的2条数据结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:03:25