如果需要使用表单,react-hook-form是一个不错的选择
首先
我认为许多网站上都有表单存在。
无论是像Qiita这样的用户投稿型网站,还是像博客这样的静态网站,在询问页面等地方都可能有表单。
在处理React表单时,应该采取什么样的方法?
通常情况下,我们会首先考虑使用useState或useRef来管理表单的值,并调用API的方法。
然而,状态管理和错误处理等工作变得非常繁琐。
因此,出现了表单库。
2022年目前,React中很受欢迎的是react-hook-form。
这次我们来谈谈关于react-hook-form的事情
什么是React Hook Form?
如上所述,它会为我们管理表单的状态和错误。还有一个好处是,该文档是用日语编写的。
这次我将选择一些我个人认为不错的事情来谈谈。
原则
import { useState } from "react";
import { useForm } from "react-hook-form";
import Header from "./Header";
export function App() {
const { register, handleSubmit } = useForm();
const onSubmit = () => {
// api叩いたりする
}
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Header />
<input {...register("firstName")} placeholder="First name" />
<select {...register("category", { required: true })}>
<option value="">Select...</option>
<option value="A">Option A</option>
<option value="B">Option B</option>
</select>
<textarea {...register("aboutYou")} placeholder="About you" />
<p>{data}</p>
<input type="submit" />
</form>
);
}
尽管仅仅提到的这一点,可能只会让人感受到它作为状态管理工具的好处,但它还具有许多其他功能,我会一一介绍给你。
校验和错误处理
您可以在提交表单时嵌入验证逻辑。另外,如果使用ErrorMessage组件,您可以处理错误状态并切换显示。
import React from "react";
import { useForm } from "react-hook-form";
import { ErrorMessage } from '@hookform/error-message';
export default function App() {
const { register, formState: { errors }, handleSubmit } = useForm();
const onSubmit = data => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("singleErrorInput", { required: "This is required." })} />
<ErrorMessage errors={errors} name="singleErrorInput" />
<ErrorMessage
errors={errors}
name="singleErrorInput"
render={({ message }) => <p>{message}</p>}
/>
<input type="submit" />
</form>
);
}
提供有关脏乱、有效等方面的状态
useState的hooks返回的不仅仅是error对象。
-
- isDirty: フォームに触れられたかどうか
- isValid: バリデーションが通っているか
可以退还等等。
例如,我们可以很容易地实现这样的逻辑:只有当用户触碰了表单并且验证未通过时,才禁用提交按钮。
const { formState: { isDirty, isValid } } = useForm();
return <button disabled={!isDirty || !isValid} />;
此外,还提供了其他API,如dirtyFields,可以灵活地获取每个表单的状态。
如果自己想要管理这个范围的状态的话,会非常繁琐,所以非常感激。
处理并管理提交状态
同样,formState中包含了isSubmitted和isSubmitSuccessful等。
所以,在表单提交成功时进行重定向。
可以轻松地编写类似的处理方式。
const { push } = useRouter()
const { formState: { isSubmitSuccessful } } = useForm();
useEffect(()) => {
if (isSubmitSuccessful) {
push('/success')
}
}, [isSubmitSuccessful]}
在提交中不要堆砌过多的处理,将关注点分离出来,这样写代码非常好。
如果有其他需要,在表单提交后重置表单内容的情况下,还可以使用名为resetFiled的API来实现。
表單提供者
这个Provider提供了处理表单状态和错误的钩子函数,使得我们可以在子组件中灵活地处理表单的错误状态和状态。通常情况下我们会将表单切割成不同的组件,所以子组件能够方便地获取和处理表单的错误状态和状态是很好的。
import React from "react";
import { useForm, FormProvider, useFormContext } from "react-hook-form";
export default function App() {
const methods = useForm();
const onSubmit = data => console.log(data);
return (
<FormProvider {...methods} > // pass all methods into the context
<form onSubmit={methods.handleSubmit(onSubmit)}>
<NestedInput />
<input type="submit" />
</form>
</FormProvider>
);
}
function NestedInput() {
const { register } = useFormContext(); // retrieve all hook methods
return <input {...register("test")} />;
}
总结
虽然还有很多我没有介绍到的内容,但我挑选了一些我个人认为不错的内容来写关于 react-hook-form 的文章。
请务必在查看各种官方文档的同时尝试使用。