React 受控组件和非受控组件

受控组件

在HTML中,表单元素的标签<input>、<textarea>、<select>等的值改变通常是根据用户输入进行更新。

而在React中,这些输入表单元素的值,应该保存在state中,并且只能由setState()进行更新。比如给表单元素绑定onChange事件,当input状态发生改变的时候,就会触发onChange事件,从而更新组件的state。

React中推荐使用受控组件,因为可以减少使用ref,受控组件可以理解为Vue中的数据双向绑定,只不过React没有替我们实现,需要自己绑定 onChange

class Login extends React.Component {
    // 初始化状态
    state = {username: '', password: ''}

    saveUsername = (event) => {
        this.setState({username: event.target.value})
    }

    savePassword = (event) => {
        this.setState({password: event.target.value})
    }

    handleSubmit = (event) => {
        // 阻止表单提交的默认事件
        event.preventDefault()
        const {username, password} = this.state
        alert('你输入的用户名是:' + username + ',你输入的密码是:' + password)
    }

    render() {
        return (
            <form action="xxx" onSubmit={this.handleSubmit}>
                用户名:<input onChange={this.saveUsername} type="text" name="username"/>
                密码:<input onChange={this.savePassword} type="password" name="password"/>
                <button>登录</button>
            </form>
        )
    }
}

ReactDOM.render(<Login/>, document.getElementById('test1'));

非受控组件

非受控组件指的是,表单数据由DOM本身处理。即不受setState()的控制,与传统的HTML表单输入相似,input输入值即显示最新值。

在非受控组件中,可以使用一个ref来从真实DOM获得表单元素的值。

class Login extends React.Component {
    handleSubmit = (event) => {
        // 阻止表单提交的默认事件
        event.preventDefault()
        const {username, password} = this
        alert('你输入的用户名是:' + username.value + ',你输入的密码是:' + password.value)
    }

    render() {
        return (
            <form action="xxx" onSubmit={this.handleSubmit}>
                用户名:<input ref={c => this.username = c} type="text" name="username"/>
                密码:<input ref={c => this.password = c} type="password" name="password"/>
                <button>登录</button>
            </form>
        )
    }
}

ReactDOM.render(<Login/>, document.getElementById('test1'));

总结

  • 共同点,都是指表单元素,或者表单组件。
  • 不同点,被react的state控制,就是受控组件。不被state控制,就是非受控组件。
  • 受控组件的实现方式,就是设置state,调用setstate来更新数据和视图。
  • 非受控组件使用ref等方式,更新数据和视图。
posted @ 2022-09-23 10:43  笔下洛璃  阅读(228)  评论(0编辑  收藏  举报