react组件正在更改要控制的复选框类型的不受控制的输入

IT技术 javascript reactjs
2021-05-02 20:39:50

react给我一个警告:“一个组件正在改变一个不受控制的复选框类型的输入来控制。输入元素不应该从不受控制切换到受控制(反之亦然)。”

但是我的复选框是通过 state 属性更改的。我错过了一些明显的东西吗?

    import React from 'react';

// Components
import Checkbox from './checkbox';
import HelpBubble from './helpBubble';

export default class CheckboxField extends React.Component {


    constructor(props) {
        super(props);
        this.state = {value: props.value};
        this.handleChange = this.handleChange.bind(this);
    }

    handleChange(event) {
        this.setState({value: event.target.value});
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.value !== this.props.value) {
            this.setState({value: nextProps.value});
        }
    }

    render() {
        const {label, meta = {}, help, disabled, required, onChange} = this.props;

        return (
            <label className="checkbox-wrap form-field">
                <Checkbox
                    disabled={disabled}
                    type="checkbox"
                    onChange={(event) => {
                        onChange(event, !this.state.value);
                    }}
                    checked={this.state.value}/>
                {label && (
                    <div className="checkbox-label">
                        {label}
                        {required && <div className="form-field__required"/>}
                    </div>
                )}
                {help && <HelpBubble help={help}/>}
                {meta.error && meta.touched && (
                    <div className="input-error">{meta.error}</div>
                )}
            </label>
        );
    }}

父组件:handleChangeParams(key, value) } /> Handle change params 改变模型中的值并调用服务器。根据服务器结果,该值可能会发生变化。

提前致谢。

4个回答

如果你的状态被初始化props.valuenullReact 会认为你的Checkbox组件是不受控制的。

尝试设置您的初始状态,使值 never null

this.state = { value: props.value || "" };

如果您使用的是复选框,react 也不喜欢字符串,因此请尝试

this.state = { checkboxValue: props.checkboxValue || false };

关于上述代码片段的一些值得注意的地方。当您从 props 在构造函数中设置状态时,最好将状态设置为“受控”值,即有形值,例如 int、float、string、array、map 等。您得到的错误是props.value 设置为 null 的结果

因此,请考虑像这样设置构造函数状态:

this.state = {
    value: props.value ? props.value : 'empty'
}

这里发生的事情是检查是否props.value有值,如果有,则将状态设置为 props.value,如果props.value为 null,则将状态设置为字符串:`'empty'

另一种简单的方法是!!你的props.checkboxValuevalue。这样即使未定义,!!props.checkboxValue也会解析为 false。

this.state = { checkboxValue: !!props.checkboxValue };