Форма реакции отправляет только одно свойство состояния, а не все состояние целиком

#javascript #reactjs #react-hooks #react-hook-form

#javascript #reactjs #реагирующие хуки #react-hook-form

Вопрос:

Я пытаюсь отправить данные формы из моего клиента react на мой сервер nodejs; однако при отправке формы на мой сервер отправляется только последнее свойство состояния. Я знаю, что это проблема на стороне клиента, поскольку с Postman все мои данные формы отправляются в мою базу данных.

Кажется, когда я добавляю значение к каждому свойству в моем состоянии, поддерживается только это свойство user . Я не смог решить эту проблему за отведенное мне время, поэтому я был бы признателен за другую точку зрения / отзыв по этому вопросу.

 const ModalForm = ({ show }) => {
  if (!show) {
    return null;
  }
  let [user, setUser] = useState({
    firstName: '',
    lastName: '',
    email: '',
    password: '',
    age: ''
  });

  let handleChange = (e) => {
    console.log('event name', e.target.name, 'event value', e.target.value);
    setUser({
      [e.target.name]: e.target.value
    });
  };

  /*
    currently, only the last prop and value are sending to my API
    need to resolve so that all form data is sent to API
  */
  let handleSubmit = (e) => {
    e.preventDefault()
    let data = user;
    setUser({[e.target.name]: e.target.value});
    axios.post('/new/user', data)
    .then(res => console.log(res))
    .catch(err => console.error(err))
  }
  console.log('user:', user);
  return (
    <div className='form-container'>
      <form className='form-space' onSubmit={handleSubmit}>
        <label>
          First Name:<br/>
          <input type='text' name='firstName' onChange={handleChange}/>
        </label><br/>
        <label>
          Last Name:<br/>
          <input type='text' name='lastName' onChange={handleChange}/>
        </label><br/>
        <label>
          Email:<br/>
          <input type='email' name='email' onChange={handleChange}/>
        </label><br/>
        <label>
          Password:<br/>
          <input type='password' name='password' onChange={handleChange}/>
        </label><br/>
        <label>
          Age:<br/>
          <input type='text' name='age' onChange={handleChange}/>
        </label><br/>
        <input type='submit' value='Submit' />
      </form>
    </div>
  )
};

export default ModalForm;
 

Ответ №1:

useState установщики состояния не похожи setState на функциональные компоненты; в функциональных компонентах свойства объекта состояния сохраняются даже при setState вызове с объектом, лишенным этих свойств. Это похоже Object.assign .

В компонентах класса, начиная с состояния { foo: true } и выполняя setState({ bar: true }) результаты { foo: true, bar: true } .

Но useState в функциональных компонентах это не так. Вместо слияния старого состояния с новым состоянием новое состояние полностью заменяет старое состояние. Начиная с состояния { foo: true } и выполняя setState({ bar: true }) результаты { bar: true } .

Здесь, поскольку вы делаете

 setUser({
  [e.target.name]: e.target.value
});
 

любые предыдущие свойства user теряются.

Вместо этого перенесите предыдущее значение user в новое состояние, чтобы сохранить предыдущие свойства состояния:

 setUser({
  ...user,
  [e.target.name]: e.target.value
});