React
的受控组件
与非受控组件
的概念是相对于表单而言的React
中,表单元素通常会持有一下内部的state
,因此,它的工作方式与其他HTML
元素不一样,而获取表单元素内部state
的实现方式的不同,就产生了受控组件
和非受控组件
前面提到,HTML的表单元素(如input
、textarea
、select
等)在react
中会维护内部的state
;而react
本身的数据也是由一个state
来维护的,将这两者结合起来,react
的state
将表示该组件的值的变量的值传入表单内部,作为默认值,待表单内部有修改时,会通过setState
同步到外界的state
中。
如下面的例子,input表单
的值由this.state.value
传入,onchange
绑定的方法经过setState
修改,组件的数据流动都是通过State
控制的,就是一个受控组件
handleChange(event) { this.setState({value: event.target.value}) } // 已bind绑定 render() { return ( <form onSubmit={Submit方法}> <label> 名字: <input type="text" value={this.state.value} onChange={this.handleChange} /> </label> <input type="submit" value="提交" /> </form> ) } 复制代码
如果上例中的标的元素并不经过state
,而是通过ref
修改(或者直接操作DOM
),那么它的数据无法通过state
控制,这就是非受控组件
consturctor(){ this.inputValue = defaultValue } render() { return ( <form onSubmit={Submit方法}> <label> 名字: <input type="text" ref={value=>this.inputValue = value} /> </label> <input type="submit" value="提交" /> </form> ) } 复制代码
当然,在React 16.3
之后,react
提供了一个更好的非受控组件的写法。
consturctor(){ this.inputValue = React.createRef(); } render() { return ( <form onSubmit={Submit方法}> <label> 名字: <input type="text" ref={this.inputValue} /> </label> <input type="submit" value="提交" /> </form> ) } 复制代码
判断一个组件是不是受控组件,就要看这个表单
组件它是否由react
的state
状态控制,它的值是否保存在this.state
中,是否只能使用setState
将修改后的值同步到初始变量。
简而言之,表单数据状态受React
的state
控制,通过setState
修改的就是受控组件
,通过DOM
控制,不受state
控制的就是非受控组件