返回

剖析 React 表单:有控与无控输入详解

前端

在 React 中处理表单输入时,您可以选择使用受控或非受控输入。这两种方法各有优缺点,在不同的场景下发挥着不同的作用。本文将深入解析受控和非受控输入的差异,帮助您在开发中做出明智选择。

受控表单输入

在受控表单输入中,表单元素的值由 React 组件的状态控制。这意味着当用户在表单元素中输入数据时,React 组件会跟踪这些数据的变化,并更新组件的状态。这种方式的好处在于,React 可以随时访问表单元素的当前值,并对用户交互做出及时的响应。

实现方式:

import React, { useState } from "react";

const MyForm = () => {
  const [name, setName] = useState("");

  const handleChange = (event) => {
    setName(event.target.value);
  };

  return (
    <form>
      <label htmlFor="name">Name:</label>
      <input id="name" type="text" value={name} onChange={handleChange} />
    </form>
  );
};

export default MyForm;

优点:

  • 允许您轻松控制表单元素的值。
  • 方便处理表单验证,因为您可以随时访问表单元素的当前值。
  • 易于实现表单数据与其他组件共享。

缺点:

  • 需要在组件中定义和管理状态,增加了组件的复杂度。
  • 如果表单元素的数量很多,管理起来可能会比较繁琐。

非受控表单输入

在非受控表单输入中,表单元素的值由 DOM 元素本身控制。这意味着当用户在表单元素中输入数据时,React 组件不会跟踪这些数据的变化。这种方式的优点在于,表单元素可以独立于 React 组件而存在,简化了组件的实现。

实现方式:

import React from "react";

const MyForm = () => {
  const handleSubmit = (event) => {
    event.preventDefault();
    const name = event.target.querySelector("input[name='name']").value;
    console.log(name);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="name">Name:</label>
      <input id="name" type="text" name="name" />
      <input type="submit" value="Submit" />
    </form>
  );
};

export default MyForm;

优点:

  • 实现简单,不需要在组件中定义和管理状态。
  • 表单元素可以独立于 React 组件而存在,提高了组件的可复用性。
  • 适用于表单元素数量较少,不需要复杂交互的场景。

缺点:

  • 无法通过 React 组件直接访问表单元素的当前值,需要通过 DOM 操作来获取。
  • 不利于表单验证,因为您需要在提交表单时手动获取表单元素的值并进行验证。
  • 不利于表单数据与其他组件共享。

选择哪种方式?

在选择使用受控或非受控表单输入时,您需要考虑以下因素:

  • 表单元素的数量:如果表单元素的数量较多,则使用受控表单输入更合适,因为您可以通过 React 组件的状态轻松管理这些元素。
  • 表单交互的复杂程度:如果表单需要复杂的交互,例如实时验证或数据联动,则使用受控表单输入更合适。
  • 表单数据的共享需求:如果需要将表单数据与其他组件共享,则使用受控表单输入更合适。

总之,受控和非受控表单输入各有优缺点,您需要根据具体的需求选择合适的方式。在大多数情况下,受控表单输入是更常用的选择,因为它提供了更好的灵活性、可控性和可维护性。