警告:组件正在更改要控制的文本类型的不受控制的输入

时间:2018-11-14 12:17:38

标签: javascript reactjs

完整错误: 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) 我的代码:

//Form.js
componentDidMount = () => {
    let state = {};
    const { inputProps } = this.props;
    //example for inputProps: {
    //    {nameInput: {element: Input/*Input.js*/, value: "initial value"}}
    //}
    Object.keys(inputProps).forEach(key => {
        const input = inputProps[key];
        const { value } = input;
        state[key] = {
            ...input,
            value,
            onChange: this.inputChange(key)
        }
    })
    this.setState(state)
}
inputChange = key => event => this.setState({
    [key]: {
        ...this.state[key],
        value: event.target.value
    }
})
inputs = () => Object.keys(this.state).map(key => {
    const input = this.state[key];
    const { element, typeCheck, ...props } = input;
    return React.createElement(element, props);
})
//Input.js
//the error comes after typeChecking in Form.js I just didn't wanted to show unnecessary code
const Input = ({error, ...props}) => <div className="inputContainer">
    {React.createElement("input", props)}
    <p className="inputError">{error || ""}</p>
</div>

所以这里发生的是,我有一个组件Form,它接受​​一个对象,因为它可以用来定义需要创建的输入。挂载后,它将处理输入属性并将其设置为状态。这有点偷偷摸摸,因为我们可能会获得价值作为投入的支柱,但我们将其置于表单的状态。另外,我们还将值赋给Input元素,以便对其进行控制,如果输入发生更改,则会触发在Form中调用的函数,并将该值设置为其自己的状态,然后将更新后的值返回给Input 。因此,似乎输入受到控制,但是我仍然收到错误。一切正常,因此输入获取更新后的值,然后发送更改后的输入,我刚得到错误,这很烦人。

1 个答案:

答案 0 :(得分:2)

如果输入值初始化为null或未定义,则始终会出现此错误。您可以通过将输入值设置为空字符串来避免这种情况。