深入理解前端组件:受控 vs 非受控组件

2,407 阅读2分钟

#日新计划更文活动

在前端开发中,我们经常需要处理各种用户输入和组件状态。在这个过程中,受控组件和非受控组件是两种不同的策略,用于管理组件的状态和用户输入。本文将深入探讨这两种策略以及它们的应用场景。

什么是受控组件?

受控组件是一种在 React 和其他前端框架中常见的设计模式。在受控组件中,组件的状态(例如输入字段的值)完全受控于 React 组件的 stateprops。这意味着组件的值和状态由 React 进行管理和更新。


// 代码

import React, { Component } from 'react';

  


class ControlledComponent extends Component {

  constructor(props) {

    super(props);

    this.state = { value: '' };

  }

  


  handleChange = (event) => {

    this.setState({ value: event.target.value });

  }

  


  render() {

    return (

      <input

        type="text"

        value={this.state.value}

        onChange={this.handleChange}

      />

    );

  }

}

  


export default ControlledComponent;

在上面的示例中,我们创建了一个受控的输入组件。它的值 value 受到 React 组件状态的控制。每次输入发生变化时,handleChange 方法将更新状态,从而更新输入框的值。

什么是非受控组件?

与受控组件相对,非受控组件在状态管理上更为自由。在非受控组件中,DOM 元素的值和状态不受 React 控制,而是由 DOM 元素本身管理。


// 代码

import React, { Component } from 'react';

  


class UncontrolledComponent extends Component {

  constructor(props) {

    super(props);

    this.inputRef = React.createRef();

  }

  


  handleButtonClick = () => {

    alert(`Input Value: ${this.inputRef.current.value}`);

  }

  


  render() {

    return (

      <div>

        <input type="text" ref={this.inputRef} />

        <button onClick={this.handleButtonClick}>Show Value</button>

      </div>

    );

  }

}

  


export default UncontrolledComponent;

在上面的示例中,我们创建了一个非受控的输入组件。DOM 元素的值存储在 DOM 节点自身中,我们使用 ref 来获取输入框的值。当用户点击按钮时,我们可以直接从 DOM 元素中获取值。

应用场景

受控组件的应用场景

  1. 表单验证和处理: 受控组件非常适合处理表单,因为您可以轻松地控制输入的值,执行验证和处理提交。

  2. 动态更新: 如果您需要根据其他输入值的变化来动态更新组件的状态,受控组件是最佳选择。

非受控组件的应用场景

  1. 第三方库集成: 当您需要集成不受 React 控制的第三方库或原生 DOM API 时,非受控组件非常有用。

  2. 简化逻辑: 对于某些简单的输入,例如搜索框,非受控组件可能会减少开发工作量。

总结

受控组件和非受控组件是前端开发中的两种状态管理策略,各自适用于不同的场景。受控组件通过 React 控制输入的值,适用于需要复杂逻辑和表单验证的情况。而非受控组件更适用于简单的输入框以及需要与第三方库集成的情况。选择哪种策略取决于项目需求和开发偏好。