在 React 中,针对非受控组件(即由 DOM 自身维护状态的组件),有哪些方法可以为其设置初始默认值?请详细说明其实现方式与注意事项。
考察说明
考查对 React 受控与非受控组件概念的理解,以及非受控组件默认值设置的实现细节。
回答思路
- 【回答框架 1】非受控组件的默认值通过 defaultValue 属性设置,该属性仅在组件挂载时生效,后续渲染不会更新 DOM 的值。与之相对,受控组件使用 value 属性并配合 onChange 事件,而 defaultValue 只用于非受控组件,二者不可混用。
- 【回答框架 2】对于不同表单元素,defaultValue 的使用方式略有差异:input 和 textarea 直接使用 defaultValue 属性,select 则使用 defaultValue 指定默认选中的 option 值(可以是数组实现多选),checkbox 和 radio 使用 defaultChecked 属性设置默认选中状态。
- 【回答框架 3】当需要为多个非受控字段设置默认值时,可以给每个元素分别添加 defaultValue,或者使用 ref 在组件挂载后(如 useEffect 中)手动设置 DOM 的 value 属性,但这种方式需要额外处理初始渲染,不如 defaultValue 简洁。
- 【回答框架 4】需要注意 defaultValue 不会响应后续的 props 变化,如果父组件期望动态更新值,应考虑使用受控组件或通过 key 属性强制重新挂载子组件来重置默认值。
- 【关键点 1】非受控组件通过 defaultValue 设置初始值,仅在挂载时生效。
- 【关键点 2】checkbox 和 radio 使用 defaultChecked 而非 defaultValue。
- 【关键点 3】select 可设置 defaultValue 为单个值或数组,对应单选或多选。
- 【关键点 4】如需动态更新默认值,可结合 key 属性重新挂载组件。
- 【易错点 1】误以为 defaultValue 会随 props 变化而更新,实际它只作为初始值。
- 【易错点 2】在受控组件中使用 defaultValue 会导致实际值重置问题,应避免混用。
- 【易错点 3】通过 ref 手动设置值时可触发不了 React 的事件系统,可能导致后续交互异常。