我已经检索了使用useState存储在对象数组中的数据,然后将这些数据输出到表单字段中。现在,我希望能够在键入时更新字段(状态)。
我看过一些例子,说明人们在更新数组中属性的状态,但是从不更新对象数组中的状态,所以我不知道该怎么做。我已经将对象的索引传递给了回调函数,但是我不知道如何使用它来更新状态。
// sample datas 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> )
这是您的操作方式:
// 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> )