返回

以新视角理解 React 表单输入:全面剖析受控与非受控

前端

在 React 中处理表单输入:受控与非受控

在 React 中,处理表单输入有两种主要方式:受控表单和非受控表单。每种方式都有其优缺点,适合不同的使用场景。

受控表单

在受控表单中,表单元素的值由 React 组件的状态管理。当用户在表单中输入或选择值时,React 组件会更新其状态,从而导致表单元素的值发生变化。受控表单通常使用 stateonChange 事件处理程序来实现。

import React, { useState } from "react";

function ControlledForm() {
  const [value, setValue] = useState("");

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

  return (
    <form>
      <input type="text" value={value} onChange={handleChange} />
      <input type="submit" value="Submit" />
    </form>
  );
}

export default ControlledForm;

在上面的示例中,value 状态变量用于存储表单输入的值。当用户在输入框中输入内容时,onChange 事件处理程序被触发,并更新 value 状态变量。这导致输入框的值发生变化,并且 React 组件重新渲染。

非受控表单

在非受控表单中,表单元素的值由表单元素本身管理。React 组件不跟踪表单元素的值,而是通过引用(ref)来访问表单元素并获取或设置值。非受控表单通常使用 refonSubmit 事件处理程序来实现。

import React, { useRef } from "react";

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

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log(inputRef.current.value);
  };

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

export default UncontrolledForm;

在上面的示例中,inputRef 是一个引用(ref),指向输入框元素。当用户在输入框中输入内容时,React 组件不会跟踪该值。但是,我们可以通过 inputRef.current.value 来获取输入框的当前值。当用户提交表单时,onSubmit 事件处理程序被触发,并打印输入框的值到控制台。

受控与非受控表单的区别

特征 受控表单 非受控表单
数据绑定 由 React 组件状态管理 由表单元素本身管理
事件处理 使用 onChange 事件处理程序 使用 refonSubmit 事件处理程序
优点 表单状态更容易管理和验证 表单元素更独立,不需要 React 组件的状态
缺点 表单元素的值需要在 React 组件中显式更新 表单元素的值需要通过引用(ref)获取,可能会增加组件的复杂性

何时使用受控表单

  • 当需要在 React 组件中管理表单状态时
  • 当需要对表单输入进行验证时
  • 当需要使用表单数据来更新其他组件的状态时

何时使用非受控表单

  • 当不需要在 React 组件中管理表单状态时
  • 当不需要对表单输入进行验证时
  • 当需要使用表单数据来更新其他组件的状态时,但这些组件不需要知道表单输入的值是如何改变的