red*_*ddy 62 javascript reactjs react-hooks
我检索了存储useState
在对象数组中的数据,然后将数据输出到表单字段中。现在我希望能够在我输入时更新字段(状态)。
我见过关于人们更新数组中属性状态的例子,但从来没有更新过对象数组中的状态,所以我不知道该怎么做。我已经将对象的索引传递给回调函数,但我不知道如何使用它更新状态。
// sample data structure
const datas = [
{
id: 1,
name: 'john',
gender: 'm'
}
{
id: 2,
name: 'mary',
gender: 'f'
}
]
const [datas, setDatas] = useState([]);
const updateFieldChanged = index => e => {
console.log('index: ' + index);
console.log('property name: '+ e.target.name);
setData() // ??
}
return (
<React.Fragment>
{datas.map((data, index) => {
<li key={data.name}>
<input type="text" name="name" value={data.name} onChange={updateFieldChanged(index)} />
</li>
})}
</React.Fragment>
)
Run Code Online (Sandbox Code Playgroud)
Mar*_*ler 128
这是你如何做到的:
// sample datas structure
/* const datas = [
{
id: 1,
name: 'john',
gender: 'm'
}
{
id: 2,
name: 'mary',
gender: 'f'
}
] */ // make sure to set the default value in the useState call (I already fixed it)
const [datas, setDatas] = useState([
{
id: 1,
name: 'john',
gender: 'm'
}
{
id: 2,
name: 'mary',
gender: 'f'
}
]);
const updateFieldChanged = index => e => {
console.log('index: ' + index);
console.log('property name: '+ e.target.name);
let newArr = [...datas]; // copying the old datas array
newArr[index] = e.target.value; // replace e.target.value with whatever you want to change it to
setDatas(newArr); // ??
}
return (
<React.Fragment>
{datas.map((data, index) => {
<li key={data.name}>
<input type="text" name="name" value={data.name} onChange={updateFieldChanged(index)} />
</li>
})}
</React.Fragment>
)
Run Code Online (Sandbox Code Playgroud)
spe*_*der 63
您可以通过将旧数组映射到新数组,并在此过程中将要更改的内容交换为更新的项目,而无需更改即可完成此操作。
setDatas(
datas.map(item =>
item.id === index
? {...item, someProp : "changed"}
: item
))
Run Code Online (Sandbox Code Playgroud)
ohl*_*hlr 15
setDatas(datas=>({
...datas,
[index]: e.target.value
}))
Run Code Online (Sandbox Code Playgroud)
其中index是目标位置,e.target.value是新值
您甚至不需要使用索引(如果需要,键除外),也不需要复制旧的数据数组,甚至可以内联执行,或者如果您不喜欢 updateFieldChanged 不内联,则只需将数据作为参数传递。这样就完成得非常快:
const initial_data = [
{
id: 1,
name: "john",
gender: "m",
},
{
id: 2,
name: "mary",
gender: "f",
},
];
const [datas, setDatas] = useState(initial_data);
return (
<div>
{datas.map((data, index) => (
<li key={index}>
<input
type="text"
value={data.name}
onChange={(e) => {
data.name = e.target.value;
setDatas([...datas]);
}}
/>
</li>
))}
</div>
);
};
Run Code Online (Sandbox Code Playgroud)
小智 5
这就是我所做的:
const [datas, setDatas] = useState([
{
id: 1,
name: "john",
gender: "m",
},
{
id: 2,
name: "mary",
gender: "f",
},
]);
const updateFieldChanged = (name, index) => (event) => {
let newArr = datas.map((item, i) => {
if (index == i) {
return { ...item, [name]: event.target.value };
} else {
return item;
}
});
setDatas(newArr);
};
return (
<React.Fragment>
{datas.map((data, index) => {
<li key={data.name}>
<input
type="text"
name="name"
value={data.name}
onChange={updateFieldChanged("name", index)}
/>
</li>;
<li key={data.gender}>
<input
type="text"
name="gender"
value={data.gender}
onChange={updateFieldChanged("gender", index)}
/>
</li>;
})}
</React.Fragment>
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
118046 次 |
最近记录: |