如何在 React 中实现一个可复用的自定义 Hook 来处理表单输入状态?

如何在 React 中实现一个可复用的自定义 Hook 来处理表单输入状态?

回答与解析:

可以创建一个名为 useInput 的自定义 Hook,封装 useState 并返回当前值、onChange 事件处理函数以及重置方法。这样能减少重复代码,提升表单控件的复用性。

示例代码如下:

import { useState } from 'react';

// 自定义 Hook
function useInput(initialValue) {
  const [value, setValue] = useState(initialValue);

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

  const reset = () => {
    setValue(initialValue);
  };

  return {
    value,
    onChange: handleChange,
    reset,
    // 也可以直接返回绑定好的 props 对象
    bind: {
      value,
      onChange: handleChange
    }
  };
}

// 使用示例
function MyForm() {
  const nameInput = useInput('');
  const emailInput = useInput('');

  const handleSubmit = (e) => {
    e.preventDefault();
    console.log('Name:', nameInput.value, 'Email:', emailInput.value);
    nameInput.reset();
    emailInput.reset();
  };

  return (
    <form onSubmit={handleSubmit}>
      <input {...nameInput.bind} placeholder="Name" />
      <input {...emailInput.bind} placeholder="Email" />
      <button type="submit">Submit</button>
    </form>
  );
}

解析要点:

  • 自定义 Hook 必须以 use 开头,这是 React 的命名约定。
  • 通过返回一个包含 value、onChange 和辅助方法(如 reset)的对象,使组件可以灵活使用。
  • 使用展开运算符 {...input.bind} 可以简洁地将属性绑定到 input 元素。
  • 初始值通过参数传入,增强通用性。
  • 该模式适用于受控组件,确保状态与 UI 同步,并易于测试和维护。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: