一、前言
在HTML中,表单元素例如 input
, textarea
, select
通常是根据用户的输入来维护它们自己的状态。
在React中,可变状态通常保存在 state
中,只能用 setState()
来进行更新操作
二、定义解释
正如上面所说,表单元素的数据可以由自身DOM元素来管理,也可以由React组件来管理
1.controlled_Component ( 受控组件 )
将表单状态保存在React组件中(state),呈现表单的React组件也会控制用户输入后所发生的情况。表单元素数据托管到React组件中的这种方式叫做 受控组件
React能控制
2.uncontrolled_Component ( 非受控组件 )
与受控组件相反,表单数据由dom元素自身管理的组件叫 非受控组件
React不能控制
三、栗子
1.controlled_Component ( 受控组件 )
1 | class App extends Component { |
可以看到 input 和 textarea的value值全都交给了React组件来管理。
注意 :
这种情况下每个表单元素必须要有onChange
事件,这样用户每次操作对应的元素,对应元素数据才能得到改变
2.uncontrolled_Component ( 非受控组件 )
1 | /*uncontrolled Component*/ |
可以看到 input 和 textarea的value值全都是由自身DOM元素来管理的。
注意 :
非受控组件这功中,通常你需要指定表单元素的初始值,但不控制后续的更新,这种情况需要指定defaultValue
属性,而不是 value属性
如果你不想让他有初始值,也可以不用写defaultValue
三、两者优缺点?
name | 优点 | 缺点 |
---|---|---|
非受控组件 | 简练、操作数据的方式更简洁 | 表单验证 、选择性开启或者关闭按钮 等功能不能处理 |
受控组件 | 相比之下略显繁琐 | 表单验证 、选择性开启或者关闭按钮 等功能能轻松处理 |
所以通常情况下受控组件更能满足我们需求