Задать вопрос
@zlodiak

Как записать состояния в объект?

Состояние формы логина контролируется при помощи хука useState. На каждое поле формы повешен обработчик onChange. После ввода пользователя соответствующие значения записываются в объект состояния:

import React, { useState } from 'react';

function Auth(props) {
  const [form, setForm] = useState([{
    login: '',
    password: '',
  }]);

  return (
    <>
      <div className="login-form">
        <input type="text" onChange={ e => { setForm({ login: e.currentTarget.value }) } }/>
        <br/>
        <input type="text" onChange={ e => { setForm({ password: e.currentTarget.value }) } }/>
        <br/>
        <button>auth</button>
        { form.login }--
        { form.password }
      </div>
    </>
  );
}

export default Auth;


Проблема в том, что после заполнения поля login в стейте пропадают значения password. И при заполнеии поля password в стейте пропадают значения login. Это видно на экране:
{ form.login }--
{ form.password }


Помогите пожалуйста сделать так чтобы в стейте независимо сохранялись значения обоих полей.

Есть вариант использовать два хука useState, но мне нужен именно один
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Решения вопроса 2
<input type="text" onChange={e => setForm({ ...form, login: e.target.value })} />
<input type="text" onChange={e => setForm({ ...form, password: e.target.value })} />
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега React
const [ form, setForm ] = useState({
  login: '',
  password: '',
});

const onChange = ({ target: t }) => setForm({ ...form, [t.name]: t.value });

<input name="login" value={form.login} onChange={onChange} />
<input name="password" value={form.password} onChange={onChange} />
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kirbi1996
@kirbi1996
Да все верно, ты перезатираешь стэйт, поэтому необходимо использовать спрэд оператор, чтобы сохранять старые значения поля. Как и было указано в ответах выше. От себя могу добавить то что было бы не плохо сразу заюзать библиотеку react-hook-form. Она позволит сократить количество рендеров что хорошо скажется на производительности
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽