输入不受控制的React Hooks

时间:2019-06-06 17:54:35

标签: javascript html reactjs react-hooks

我已经开始用simple tutorial讲解反应钩子了,令我惊讶的是我遇到了一个我无法弄清的错误:

  

警告:组件正在将文本类型的不受控制的输入更改为   被控制。输入元素不应从不受控制的切换到   控制(反之亦然)。决定使用受控还是   组件生命周期中不受控制的输入元素。

出现此错误后,我的组件消失了,但是我仍然可以输入可以在控制台中正确打印出的数据。

我尝试设置输入的初始状态并更改

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.log(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;

有什么想法会导致此错误?

2 个答案:

答案 0 :(得分:1)

您会收到错误消息,因为您的输入以undefined开头,然后有一个值。如果您在const [inputs, setInputs] = useState({});中声明对象,则该对象将消失。

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

答案 1 :(得分:0)

我最喜欢的在React钩子中处理受控输入的方法是这种语法。.为要处理的每个输入设置单独的状态,然后在onChange内仅调用setInput

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

出现错误的原因是因为初始状态只是一个空对象,如果要这样做,则必须将状态更改为。

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