React 受控组件和非受控组件

2021-05-14 09:39:35
# 前提 只有表单的输入元素区分受控组件和非受控组件 # 受控组件 表单元素含有 `value` 属性,且 `value` 绑定到 `state`。当元素没有更新到 `state` 的 `onChange` 事件时,无法改变组件的值。每当输入的值改变,组件会被重新渲染。 >```react >function Input() { > const [content, setContent] = useState("") > return ( > <input > value={content} > onChange={(e) => {setContent(e.target.value)}} > /> > ) >} >``` # 非受控组件 表单元素没有 `value` 属性,输入会使用 DOM 原生方法及时反馈到页面上,输入改变时,组件不会重新渲染。 >```react >function Input() { > const [content, setContent] = useState("") > return ( > <input > onChange={(e) => {setContent(e.target.value)}} > /> > ) >} >``` # 为什么要使用受控组件 使用受控组件,可以做到在输入的时候获得实时处理,比如将输入的值转换为大写字母,限制输入的字符总数,在输入的同时做格式判断等。 > 将输入的字符实时转换为大写: > > ```react > function Input() { > const [content, setContent] = useState("") > return ( > <input > value={content} > onChange={(e) => { > setContent(e.target.value.toUpperCase()) > }} > /> > ) > } > ``` # 受控组件的问题 每当表单的值发生变化时,都会调用 `onChange ` 事件并重新渲染依赖该状态的整个组件树,导致性能上的损耗