我有一个表单。最初有一些默认值(用户名和地址)。当用户点击add
时,有一个额外的输入,用户可以输入另一个名称和地址,额外的名称和地址将存储在additionConfigs
中。
示例:https://codesandbox.io/s/elastic-pateu-2uy4rt
import "./styles.css";
import { useState, useEffect } from "react";
export default function App() {
const [value, setValue] = useState([]);
const [additionConfigs, setAdditionConfigs] = useState([]);
useEffect(() => {
setTimeout(() => {
setValue([
{
id: 1,
baseName: "XXX",
config: {
name: "Kenny",
address: "New york"
}
},
{
id: 2,
baseName: "YYY",
config: {
name: "Ben",
address: "Boston"
}
},
{
id: 3,
baseName: "ZZZ",
config: {
name: "Mary",
address: "Los Angeles"
}
}
]);
}, 1000);
}, []);
const onAddBaseConfig = (item) => {
setAdditionConfigs((preValue) => [
...preValue,
{
id: item.id,
config: {
name: "",
address: ""
}
}
]);
};
console.log(additionConfigs);
const onChangeName = (e, id) => {
setAdditionConfigs((preValue) => {
const newValue = preValue.map((v) => {
if (v.id === id) {
return {
...v,
config: {
...v.config,
name: e.target.value
}
};
}
return v;
});
return newValue;
});
};
const onChangeAddress = (e, id) => {
setAdditionConfigs((preValue) => {
const newValue = preValue.map((v) => {
if (v.id === id) {
return {
...v,
config: {
...v.config,
address: e.target.value
}
};
}
return v;
});
return newValue;
});
};
return (
<>
{value.length > 0 &&
value.map((v, index) => (
<div className="item" key={index}>
<div className="item">
{v.config.name}
{v.config.address}
{additionConfigs.length > 0 &&
additionConfigs
.filter((config) => config.id === v.id)
.map((config) => (
<div>
<label>name</label>
<input
value={config.config.name}
onChange={(e) => onChangeName(e, config.id)}
/>
<label>address</label>
<input
value={config.config.address}
onChange={(e) => onChangeAddress(e, config.id)}
/>
</div>
))}
</div>
<button onClick={() => onAddBaseConfig(v)}>Add</button>
</div>
))}
</>
);
}
目前,我使用config.id
来更新额外的名称和地址,但有一个问题是,如果用户添加两个或更多额外的名称和地址输入,当更新第一个时,第二个也会更新。
如何分别更新?给每组输入一个标志?
1条答案
按热度按时间dsekswqp1#
假设组件不应修改由
useEffect
设置的基value
,而是保留需要支持任意数量的配置输入的additionConfigs
,也许一个解决方案可以是使additionConfigs
状态成为对象。additionConfigs
对象可以将来自基本value
的id
作为键,将配置数组作为值,并且可能每个配置需要其自己的id
,以便可以通过添加的input
来控制它们,而无需对现有代码结构进行重大重构。带修改的分叉:codesandbox
或许可以尝试以下示例:
将
additionConfigs
状态定义为对象:添加配置
input
时更新additionConfigs
的逻辑:(* 这里的
id
逻辑只是添加了以前的id++
,在实际项目中可能应该替换为唯一的id生成器 *)更新
input
的配置逻辑name
,添加baseId
作为参数,因为每个基本value
可以有多个配置:相同,但对于
address
:变更后的输出: