Редактировать форму, которая предварительно заполнена данными API - React

Я создаю форму, которая предварительно заполняется результатами запроса axios get к API-интерфейсу nodejs, который возвращает массив (хранящийся в MySQL). Я задал этот вопрос вчера, реализовал предоставленное решение, и оно сработало. На следующий день я тщательно протестировал его, и оказалось, что при отправке были переданы только отредактированные поля, а не значения из неотредактированных полей.

Я могу получить данные для отображения в форме, но я не могу редактировать форму. Идея состоит в том, чтобы это была форма «редактирования пользователя». Я подозреваю, что проблема в части onChange поля ввода.

Доступ к форме осуществляется из таблицы, которая также сопоставляется с результатами запроса на получение. При нажатии кнопки редактирования идентификатор пользователя из строки таблицы передается в форму редактирования через useNavigate и useLocation (при необходимости я могу добавить эту часть кода).

Бэкенд

Вот контроллер API, который запрашивает базу данных MySQL, а затем отправляет во внешний интерфейс:

export const edit = async (req, res) => {
  db.query(
    "SELECT * FROM userIndex WHERE userID = ?",
    [req.params.userID],
    (err, rows) => {
      if (!err) {
        res.send(rows);
      } else {
        console.info(err).res.send({ alert: err });
      }
    }
  );
};

Вот пример результата запроса выше:

[
    {
        "userID": 143,
        "firstName": "Kenan",
        "lastName": "Erasmus",
        "role": "student",
        "email": "[email protected]",
        "password": "$2b$12$v3s0D6cNkGwM3/IWXPdv..TRfRZLmDNuZBfrWlUCt4vKnyRi75jWe",
        "createdAt": "06/10/2022, 13:56:51",
        "updatedAt": "07/10/2022, 19:45:46",
        "lastLogin": null
    }
]

Внешний интерфейс

Вот часть кода, которая выполняет запрос к API:

useEffect(() => {
    const config = {
      headers: { "x-auth-token": token },
    };

    const fetchData = async () => {
      const results = await api.get("/users/edituser/" + userID, config);
      setRows(results.data);
      setFirstName(rows.firstName)
    };
    fetchData();
  }, [setRows, userID, token]);

Состояние для «строк» ​​(установлено в ответе API):

const [rows, setRows] = useState([]);
const [firstName, setFirstName] = useState("");

И, наконец, пример поля ввода:

<input
 type = "text"
 className = "form-control"
 id = "inputEmail4"
 placeholder = "First Name"
 name = "firstName"
 value = {firstName}
 onChange = {(e) => setFirstName(e.target.value)}
></input>

Я включил только ввод «firstName» в качестве примера. Всего в этой форме около 6 полей.

Буду очень признателен за любую помощь в этом. Дайте мне знать, если я могу предоставить больше кода.

Отвечает ли это на ваш вопрос? Форма React не обновляет состояние при изменении

Dean Van Greunen 08.10.2022 19:31

Я реализую и скоро свяжусь с вами @DeanVanGreunen

cameronErasmus 08.10.2022 19:33

Эта реализация дает мне «rows.map не является функцией». Таким образом, состояние пусто, а не содержит данные ответа API @DeanVanGreunen

cameronErasmus 08.10.2022 19:42
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

const [firstName, setFirstName] = useState("");

Затем сопоставили форму с «строками» и установили для каждого значения поля соответствующее состояние (как показано в useEffect ниже).

Использование внешнего интерфейсаЭффект:

useEffect(() => {
    const config = {
      headers: { "x-auth-token": token },
    };

    const fetchData = async () => {
      const results = await api.get("/users/edituser/" + userID, config);
      setRows(results.data);
      setFirstName(results.data[0].firstName);
      setLastName(results.data[0].lastName);
      setEmail(results.data[0].email);
      setPassword(results.data[0].password);
      setRole(results.data[0].role);
    };
    fetchData();
  }, [setRows, userID, token]);

Пример поля ввода:

<input
 type = "text"
 className = "form-control"
 id = "inputEmail4"
 placeholder = "First Name"
 name = "firstName"
 value = {firstName}
 onChange = {(e) => setFirstName(e.target.value)}
></input>

Делая это таким образом, форма отображается через «строки», а затем каждое поле ввода сразу же получает новое состояние после ввода.

Я знаю, что это некрасиво, но это эффективно. Я новичок в кодировании, поэтому еще не знаю всех тонкостей React, но это решение работает для меня. Надеюсь, это поможет любому, кто ищет решение той же проблемы!

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