Невозможно изменить состояние поля ввода реакции, всегда заканчивается начальным значением

Это функция редактирования профиля, которую я пытаюсь создать. Сначала я получаю данные пользователя и заполняю поля, назначая их состоянию

const [name, setName] = useState('')

useEffect(() => {
if (localStorage.getItem('userInfo') === null) {
    navigate('/login')
}
else{
userInfo=JSON.parse(localStorage.getItem('userInfo'))
setName(userInfo.name)
}
},)

до сих пор все в порядке, я вижу имя в поле ввода по умолчанию

 <Form onSubmit = {submitHandler}>
        <Form.Group controlId='name'>
          <Form.Label>Name</Form.Label>
          <Form.Control
            type='name'
            placeholder='Enter name'
            defaultValue = {name}
            onChange = {(e) => setName(e.target.value)}
          ></Form.Control>
        </Form.Group>
    </Form>

когда я отправляю форму, я все еще отправляю на сервер исходное значение, а не отредактированное значение.

Не могли бы вы показать функцию отправки формы?

FD3 25.11.2022 17:58

const submitHandler = async (e) => { e.preventDefault() if (password !== confirmPassword) { setMessage('Пароли не совпадают') } else { const formData = {name} updateResponse=wait updateUser(formData); console.info(updateResponse) } }

Raghuram 25.11.2022 18:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Замените defaultValue на value

и используйте useEffect таким образом React useState

если я заменю значением, я даже не смогу редактировать поле ввода

Raghuram 25.11.2022 17:53

Реакция выдает какие-либо ошибки? Консоль проверяли?

Sadman Sakib 25.11.2022 17:56

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

Raghuram 25.11.2022 17:59

я думаю теперь использовать useRef вместо usestate

Raghuram 25.11.2022 18:02
Ответ принят как подходящий

Возможно, вам нужно вызвать useEffect только при первом рендеринге компонента, добавив [] в массив зависимостей useEffect.

Вам нужно добавить функцию в onChange Param. Я добавил пример кода.

export default function App() {
      const [name, setName] = useState(""); // useState hook

  // handle change event
  const handleChangeEvent = (e) => {
    e.preventDefault(); // prevent the default action
    setName(e.target.value); // set name to e.target.value (event)
  };

  // render
  return (
    <div>
      <Form>
        <Form.Group>
          <Form.Control
            defaultValue = {name}
            type = "name"
            onChange = {handleChangeEvent}
          ></Form.Control>
        </Form.Group>
      </Form>
    </div>
  );
}

Что вы имеете в виду под You need to add function to onChange Param?

DreamBold 25.11.2022 18:15

Было бы лучше, если бы вы добавили функцию, а не добавляли переменную useState напрямую. И еще одно, не забудьте запретить действие по умолчанию и установить значение. Это очень важно.

Samuel Lee 25.11.2022 18:21

Вы видели ответ @Tarmah выше?

DreamBold 25.11.2022 18:23

Другие вопросы по теме