React前端面试每日一试 5.什么是受控组件和非受控组件?

在React中,受控组件和非受控组件是两种处理表单数据的方式。理解这两种方式对于管理和维护表单状态非常重要。

受控组件(Controlled Components)

受控组件 是指那些表单数据完全由React组件的状态控制的组件。也就是说,表单元素的值是通过React的state来管理的,任何对表单元素值的更改都通过事件处理器来更新状态。

特点 如下:

1.数据源 :表单元素的值由React组件的状态控制。

2.单一数据源 :表单元素的值和组件状态保持同步,确保数据源一致性。

3.事件处理:通过事件处理器(如onChange)来更新组件状态,从而更新表单元素的值。

示例代码

javascript 复制代码
import React, { useState } from 'react';

function ControlledForm() {
  const [inputValue, setInputValue] = useState('');

  function handleChange(event) {
    setInputValue(event.target.value);
  }

  function handleSubmit(event) {
    event.preventDefault();
    alert('Submitted value: ' + inputValue);
  }

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Input:
        <input type="text" value={inputValue} onChange={handleChange} />
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}

export default ControlledForm;

在上面示例中,输入框的值由组件的状态inputValue 控制,handleChange函数更新状态,从而更新输入框的值。

非受控组件(Uncontrolled Components)

非受控组件 是指那些表单数据由DOM本身管理的组件。即表单元素的值存储在DOM中,React并不直接控制这些值。通常,非受控组件使用ref来访问DOM元素并获取其值。

特点如下

1.数据源 :表单元素的值由DOM本身控制。

2.访问方式 :使用ref来访问表单元素的值。

3.独立管理:表单元素的值不与组件状态绑定,因此不需要事件处理器来更新组件状态。

示例代码

javascript 复制代码
import React, { useRef } from 'react';

function UncontrolledForm() {
  const inputRef = useRef(null);

  function handleSubmit(event) {
    event.preventDefault();
    alert('Submitted value: ' + inputRef.current.value);
  }

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Input:
        <input type="text" ref={inputRef} />
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}

export default UncontrolledForm;

在上面这个示例中,输入框的值由DOM本身控制,通过inputRef访问输入框的值并在表单提交时读取。

总结

受控组件和非受控组件是两种处理React表单数据的不同方式 。受控组件使用React状态 来管理表单数据,提供更高的控制性和一致性,但代码相对复杂。非受控组件则依赖于DOM本身来管理表单数据,代码简单,但数据流可能不如受控组件明确。选择哪种方式取决于具体的使用场景和需求。

通过合理选择和使用受控组件和非受控组件,可以构建高效、可维护的React表单组件,满足各种复杂的表单处理需求。

拓展 双控组件

有时候我们可能希望组件能够兼具受控和非受控的特性,这种组件可以称为"双控组件"(Hybrid Components)。双控组件允许开发者在需要时以受控方式使用组件,而在其他情况下则以非受控方式使用组件。

双控组件的实现可以通过以下方式:

1.受控模式 :如果组件接收到value和onChange props,则以受控方式运行。

2.非受控模式:如果组件没有接收到value和onChange props,则以非受控方式运行,并使用defaultValue初始化组件的值。

通过这种方式,组件可以更好地适应不同的使用场景,同时保持代码简洁和可维护性.

相关推荐
jnene7 分钟前
html 时间、价格筛选样式处理
前端·css·html
slongzhang_29 分钟前
jquery 修复怪异模式html未声明“<!DOCTYPE html>”
前端·html·jquery
黄昏回响1 小时前
信息系统基础知识(八):典型信息系统架构模型详解
程序人生·面试·系统架构·改行学it
云水一下1 小时前
Vue.js从零到精通系列(三):组件化基础——Props、Emits、插槽与生命周期
前端·javascript·vue.js
SEO_juper2 小时前
新独立站冷启动收录全攻略:配置、推送、抓取配额优化完整手册
前端·谷歌·seo·跨境电商·外贸·geo·独立站
TinssonTai2 小时前
这个 VS Code 插件让我的 AI Coding 又快又稳 - 旧瓶装新酒
前端·人工智能·程序员
体验家2 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
Maimai108082 小时前
Web3 前端交易系统如何落地:从下单 UI 到 Operation 编码、签名与实时状态更新
前端·react.js·ui·架构·前端框架·web3
Cxiaomu2 小时前
React接入WebRTC实时视频实践
react.js·音视频·webrtc
kidding7232 小时前
高效备忘清单工具类小程序
前端·计算机网络·微信小程序·小程序