Неконтролируемый ввод React Hooks

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

Warning: A component is changing an uncontrolled input of type text to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component.

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

Я попытался установить начальное состояние для входов и изменить

setInputs(inputs => ({
  ...inputs, [event.target.name]: event.target.value
}));

к

setInputs({...inputs, [event.target.name]: event.target.value});

но я все еще получаю ошибку.

JSX

import React from 'react';
import './styles/form.scss';
import useSignUpForm from './hooks/customHooks.jsx';

const Form = () => {

    const {inputs, handleInputChange, handleSubmit} = useSignUpForm();

    return (
        <React.Fragment>
            <div className = "formWrapper">
                <h1 className = "header">Form</h1>
                <form onSubmit = {handleSubmit}>
                    <div className = "form-group">
                        <label htmlFor = "nicknameInput">Nickname</label>
                        <input type = "text" id = "nicknameInput" name = "nickname" onChange = {handleInputChange}
                               value = {inputs.nickname} required/>

                        <label htmlFor = "emailInput">Email Address</label>
                        <input type = "text" id = "emailInput" name = "email" onChange = {handleInputChange}
                               value = {inputs.email} required/>

                        <label htmlFor = "lastName">Last Name</label>
                        <input type = "text" id = "lastName" name = "lastName" onChange = {handleInputChange}
                               value = {inputs.lastName} required/>
                    </div>
                    <button type = "submit" className = "btn btn-primary">Submit</button>
                </form>
            </div>
        </React.Fragment>
    )
};

export default Form;


Хуки

import React, {useState} from 'react';

const useSignUpForm = (callback) => {
    const [inputs, setInputs] = useState({});
    console.info(inputs);

    const handleSubmit = (event) => {
        if (event) {
            event.preventDefault();
        }
    };

    const handleInputChange = (event) => {
        event.persist();
        setInputs(inputs => ({
                ...inputs, [event.target.name]: event.target.value
            })
        );
    };

    return {
        handleSubmit,
        handleInputChange,
        inputs
    };

};

export default useSignUpForm;

Любые идеи, что вызывает эту ошибку?

К вашему сведению, это контролируемые, а не неконтролируемые входы.

Fellow Stranger 15.08.2019 17:26
Поведение ключевого слова "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) для оценки ваших знаний,...
5
1
6 889
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы получаете ошибку, потому что ваши входные данные начинают свою жизнь как undefined, а затем имеют значение. Если заменить это const [inputs, setInputs] = useState({}); на это:

const [inputs, setInputs] = useState({
   nickname: '',
   lastname: '',
   email: ''
});

это уйдет.

блин, это сработало, я думал, что уже пробовал это, но спасибо!

Kamil Sienkiewicz 06.06.2019 20:06

вау, я так долго ломал голову над этим. не понимал, что проблема была в неопределенном значении. Спасибо

Andy 03.10.2019 20:46

мой любимый способ обработки контролируемых входов в реагирующих хуках - это синтаксис. Создайте отдельное состояние для каждого ввода, который вы пытаетесь обработать, а затем внутри onChange просто вызовите setInput

onChange = {e => setInput(e.target.value)}

причина, по которой у вас есть ошибка, заключается в том, что начальное состояние - это просто пустой объект, если вы хотите сделать это таким образом, вам придется изменить свое состояние на.

const [inputs, setInputs] = useState({
   nickname: '',
   lastname: '',
   email: ''
});

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