[备忘录] React Hook form怎么用?

首先

这篇文章仅仅是根据我之前在 GitHub 上写的 TIL(Today I Learn)笔记随手写成的,请事先知晓。(如果想要了解更详细的内容,请参考附上的优质资料)

如果使用React Hook Form,就可以不使用复杂的状态管理,如useState或useRef等,来创建表单。

引言的开始

在过去,创建表单时我经常使用useState或者useRef来进行状态管理,但是状态管理变得过多或者验证变得困难等等问题经常困扰我。于是我决定尝试并引入了备受瞩目的React Hook Form库,希望能够使用这个简单而又强大的库来解决我的问题。

迄今为止的实施方式

使用useState (状态管理过于复杂)

如果输入数量继续增加,那就得相应地增加状态。

import React, { useState } from 'react';

const LoginForm = () => {
  const [name, setName] = useState('');
  const [password, setPassword] = useState('');
  const [email, setEmail] = useState('');

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

  const handlePasswordChange = (event) => {
    setPassword(event.target.value);
  };

  const handleEmailChange = (event) => {
    setEmail(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    // フォームの送信ロジックを追加する
    console.log('Submitted:', name, password, email);
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label>
          名前:
          <input type="text" value={name} onChange={handleNameChange} />
        </label>
      </div>
      <div>
        <label>
          パスワード:
          <input type="password" value={password} onChange={handlePasswordChange} />
        </label>
      </div>
      <div>
        <label>
          メールアドレス:
          <input type="email" value={email} onChange={handleEmailChange} />
        </label>
      </div>
      <div>
        <button type="submit">送信</button>
      </div>
    </form>
  );
};

export default LoginForm;

使用useRef

import React, { useRef } from 'react';

const LoginForm = () => {
  const nameRef = useRef('');
  const passwordRef = useRef('');
  const emailRef = useRef('');

  const handleSubmit = (event) => {
    event.preventDefault();

    const name = nameRef.current.value;
    const password = passwordRef.current.value;
    const email = emailRef.current.value;

    // フォームの送信ロジックを追加する
    console.log('Submitted:', name, password, email);

    // 入力フィールドをクリアする
    nameRef.current.value = '';
    passwordRef.current.value = '';
    emailRef.current.value = '';
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label>
          名前:
          <input type="text" ref={nameRef} />
        </label>
      </div>
      <div>
        <label>
          パスワード:
          <input type="password" ref={passwordRef} />
        </label>
      </div>
      <div>
        <label>
          メールアドレス:
          <input type="email" ref={emailRef} />
        </label>
      </div>
      <div>
        <button type="submit">送信</button>
      </div>
    </form>
  );
};

export default LoginForm;

使用React Hook Form的好处是什么?

    1. 可以减少state管理等代码的编写量

 

    1. 包是轻量的

 

    采用了Uncontrolled Components模式,可以减少渲染次数

优点1

React Hook Form能够极大地简化表单状态的管理。与使用普通的React的useState或useReducer相比,它可以用更少的代码来管理表单状态。表单的值和验证错误等状态都是在React Hook Form内部进行管理的,开发人员不需要显式地管理状态。

以下是「メリット2」的中文翻譯:

优点2

React Hook Form是一个轻量级的库,可以最小化额外的依赖和包的大小。这样可以提高性能,并实现方便构建和维护表单。此外,还可以按需导入所需的功能,避免包含不必要的功能。

3个优点

React Hook Form 采用了非受控组件模式。这样一来,就不需要将表单的输入状态保存为React状态,从而减少了表单组件重新渲染的次数。此外,即使发生了表单值的更改,也不会导致整个表单组件重新绘制。这样可以提高性能并改善用户体验。

实施案例

import { useForm } from 'react-hook-form';

function App() {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data) => console.log(data);

  return (
    <div className="App">
      <h1>ログイン</h1>
      <form onSubmit={handleSubmit(onSubmit)}>
        <div>
          <label htmlFor="email">Email</label>
          <input id="email" {...register('email')} />
        </div>
        <div>
          <label htmlFor="password">Password</label>
          <input id="password" {...register('password')} type="password" />
        </div>
        <button type="submit">ログイン</button>
      </form>
    </div>
  );
}

export default App;

// registerで登録する
<input id="password" {...register("password")} type="password" />
// validationはターゲットの横に書く
<input
  id="password"
  {...register("password", { required: true })}
  type="password"
/>

验证库

听说Zod和Yup是一个常见的验证库,所以尝试引入它们是个不错的选择(个人更偏爱Zod)。

参考资料的内容。

    • REFFECT React Hook form

 

    • REFFECT Zod

 

    私のTIL
广告
将在 10 秒后关闭
bannerAds