React动态输入框onChange如何将值存入对应嵌套对象数组
现有代码错误点
- 传参缺失:触发onChange时没有告诉处理函数要修改的是
native还是rolls数组,且调用时传入的item.id没有被处理函数接收 - state更新逻辑错误:你的初始state是包含两个数组属性的对象,原有代码错误将对象转为数组操作,完全偏离预期数据结构
- 拼写错误:渲染时
native被错写为navtive,会导致变量读取失败
修改方案
- 先修改渲染阶段的onChange调用逻辑,补充所属数组标识:
// native数组遍历部分 {data.native?.map((item, index) => { return ( <input type="text" name={item.id} onChange={(e) => // 第一个参数传入当前所属数组名 handleChange("native", "fee", e.target.value, index, item.id) } /> )})} // rolls数组遍历部分 {data.rolls?.map((item, index) => { return ( <input type="text" name={item.id} onChange={(e) => // 第一个参数传入当前所属数组名 handleChange("rolls", "fee", e.target.value, index, item.id) } /> )})}
- 替换handleChange处理函数为以下实现:
const handleChange = (arrayType, field, value, index, id) => { setData((prevState) => { // 拷贝目标数组,避免直接修改原state const targetArray = [...prevState[arrayType]] // 更新对应索引的对象,保留原有属性同时赋值新内容 targetArray[index] = { ...targetArray[index], id, [field]: value } // 返回全新的state对象,未修改的数组保持原引用 return { ...prevState, [arrayType]: targetArray } }) }
补充说明
如果你的动态新增item逻辑没有提前给每个item生成唯一id,建议新增时就赋值id(比如用Date.now()或者uuid库生成),避免出现id为空的情况。
内容的提问来源于stack exchange,提问作者Deepa
相关产品推荐
相关产品推荐

