# 详解非受控组件的实现方案

# 非受控组件

在上一个小节中,我们学习了受控组件,但是有时候受控组件不能完全满足我们的需求,所以React中还提供了非受控组件的方式来操作表单元素。

使用非受控组件,这时表单数据将交由 DOM 节点来处理,代码如下:

class Welcome extends React.Component {
    state = {
        msg: 'hello'
    }
    changeInput = (ev) => {
        this.setState({
            msg: ev.target.value
        });
    }
    render(){
        return (
            <div>
                <input type="text" defaultValue={this.state.msg} onInput={this.changeInput} /> { this.state.msg }
            </div>
        );
    }
}

其中defaultValue属性可以设置表单的默认值,下面再举一个上传控件的非受控组件使用方式。

class Welcome extends React.Component {
    myRef = React.createRef()
    handleSubmit = (ev) => {
        console.log(
            this.myRef.current.files[0].name 
        );
        ev.preventDefault();
    }
    render(){
        return (
            <form onSubmit={this.handleSubmit}>
                <input type="file" ref={this.myRef} />
                <input type="submit" value="submit" />
            </form>
        );
    }
}