React error: from controlled to uncontrolled component

React error: from controlled to uncontrolled component

编辑:这个问题被一些用户标记为重复。不确定他们在这样做之前是否阅读过。如果有人这样做,请说明这是重复的。

我有一个复选框组件:

class Checkbox extends Component {
    onChange = (e) => {
        if (this.props.input) {
            this.props.input.onChange(e.target.checked);
        } else if (this.props.onChange) {
            this.props.onChange(e.target.checked, this.props.id);
        }
    };

    render() {
        const { input, value, className, label } = this.props;
        let inputValue = (input && input.value) || value;

        return (
            <div className={'Checkbox' + (className ? ' Checkbox--' + className : '')}>
                <input
                    className="Checkbox-input"
                    type="checkbox"
                    onChange={this.onChange}
                    checked={inputValue}
                />
                <span className="Checkbox-helper" />
                <span className="Checkbox-label" htmlFor="">
                    {label}
                </span>
            </div>
        );
    }
}

此组件 return 在值更改时出错。

Warning: A component is changing an uncontrolled input of type checkbox 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.

但是如果我替换:

let inputValue = (input && input.value) || value;

let inputValue = value;
if (input) {
    inputValue = input.value;
}

像这样:

class Checkbox extends Component {
    onChange = (e) => {
        if (this.props.input) {
            this.props.input.onChange(e.target.checked);
        } else if (this.props.onChange) {
            this.props.onChange(e.target.checked, this.props.id);
        }
    };

    render() {
        const { input, value, className, label } = this.props;

        let inputValue = value;
        if (input) {
            inputValue = input.value;
        }

        return (
            <div className={'Checkbox' + (className ? ' Checkbox--' + className : '')}>
                <input
                    className="Checkbox-input"
                    type="checkbox"
                    onChange={this.onChange}
                    checked={inputValue}
                />
                <span className="Checkbox-helper" />
                <span className="Checkbox-label" htmlFor="">
                    {label}
                </span>
            </div>
        );
    }
}

它 return 没有任何错误。为什么?

一种可能性——这里没有足够的信息可以肯定——是 input.value 存在但是 false(或假的),所以你回到 value prop ,即 undefined,您最终在输入中将 checked 设置为 undefined

这会导致出现不受控制的复选框。

然后,在随后的传递中,input.valueprops.value 已更改并且您将 checked 设置为实际值,这意味着它现在是受控输入并且反应发出警告。

在您的初始情况下,即使 input.value 明确为 false0 或空字符串,您也会获得 value 道具:

// if input.value === false here you get
// the fallback value which may be undefined
let inputValue = (input && input.value) || value;

在您修改的案例中……

let inputValue = value;
if (input) {
  inputValue = input.value;
}

…您已经避免了这种情况,因为您是根据 input 本身而不是 input.value.

的存在来预测它的