Как правильно менять состояние вложенного объекта?

На данный момент при изменении любого инпута стираются остальные свойства объекта. Как правильно поменять состояние?

import React, {useState} from 'react'
import "./styles.css";
export default function App() {
  const [data, setData] = useState({
    a: {
      value: "data",
      value2: "data2"
    },
    b: {
      value: "data",
      value2: "data2"
    }
  })
  const changeInput = (e, key) => {
    setData(value => ({...value, [key]: {[e.target.name]: e.target.value}}))
    console.log(data) 
  }
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <input name="value" value={data.a.value} onChange={(e) => changeInput(e, 'a')}/>
      <input name="value2" value={data.a.value2} onChange={(e) => changeInput(e, 'a')}/>

    </div>
  );
}

Ответы (1 шт):

Автор решения: entithat

Поменяйте [key]: { ...value[key], [e.target.name]: e.target.value }

import "./styles.css";
import { useState } from "react";

export default function App() {
  const [data, setData] = useState({
    a: {
      value: "data",
      value2: "data2"
    },
    b: {
      value: "data",
      value2: "data2"
    }
  });
  const changeInput = (e, key) => {
    setData((value) => ({
      ...value,
      [key]: { ...value[key], [e.target.name]: e.target.value }
    }));
    console.log(data);
  };
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <input
        name="value"
        value={data.a.value}
        onChange={(e) => changeInput(e, "a")}
      />
      <input
        name="value2"
        value={data.a.value2}
        onChange={(e) => changeInput(e, "a")}
      />
    </div>
  );
}
→ Ссылка