如何在react-hooks状态内正确更新数组

IT技术 javascript arrays reactjs react-hooks state
2021-05-17 02:59:50

我一直在尝试更新表示react状态的数组中的对象,当输入的值更改时应该更新对象,我可以自己找到更新它的方法,但我不确定这是正确的方法,因为当我打开 React 开发工具并转到组件选项卡并单击我正在处理的组件时,状态不会在输入输入时立即更新,并且为了查看更改我必须单击开发工具中的另一个组件,然后返回到第一个组件并完成更改。

所以我基本上是在问我用来更新状态的方式是否正确,并获得一些关于更好的方法的建议,以便它立即更新。谢谢

这是代码

国家:

const [items, setItems] = useState([{ name: "", quantity: "", unit: "" }]);

更改处理函数(更新状态的函数):

const nameChange = (e, i) => {
  const newItems = items;
  newItems[i].name = e.target.value;
  setItems(newItems);
  console.log(items);
};

输入:

{
  items.map((item, i) => {
    return (
      <div key={i} className={`mt3 ${classes.root}`}>
        <TextField
          onChange={e => nameChange(e, i)}
          style={{ width: "30%" }}
          id="standard-basic"
          label="Item name"
        />
        <TextField
          style={{ width: "25%" }}
          id="standard-basic"
          label="quantity"
        />
        <TextField
          style={{ width: "10%" }}
          id="standard-basic"
          label="Unit"
        />
      </div>
    );
  });
}
1个回答
    const [items, setItems] = React.useState({
        name: '',
        quantity: '',
        unit: ''
    });
    const handleChange = prop => event => {
        setItems({ ...items, [prop]: event.target.value });
    };

在您的文本字段上:

    <TextField onChange={handleChange('name')}/>
    <TextField onChange={handleChange('quantity')}/>

更新:如果 items 是一个数组:

    const updateItem = (prop, event, index) => {
        const old = items[index];
        const updated = { ...old, [prop]: event.target.value }
        const clone = [...items];
        clone[index] = updated;
        setItems(clone);
    }

在您的文本字段上:

{items.map((item, i) => (
    <div key={i}>
        <TextField onChange={e => updateItem('name', e, i)}/>
        <TextField onChange={e => updateItem('quantity', e, i)}/>
        <TextField onChange={e => updateItem('unit', e, i)}/>
    </div>
))}