جستجو برای:
سبد خرید 0
  • صفحه اصلی
  • دوره های آموزشی
    • آموزش کتابخانه Ant Design به سادگی آب خوردن !
    • آموزش ساخت داشبورد حرفه ای با ری اکت !
    • آموزش فریمورک Tailwind CSS به زبان ساده!
    • آموزش HTML و CSS پروژه محور و اصولی !
  • وبلاگ
  • تماس با ما
  • درباره ما
logo-frontendi-150
0
  • خانه
  • دوره ها
  • وبلاگ فِرانت اِندی
  • تماس با ما
ورود / عضویت
  • صفحه اصلی
  • دوره های آموزشی
    • آموزش کتابخانه Ant Design به سادگی آب خوردن !
    • آموزش ساخت داشبورد حرفه ای با ری اکت !
    • آموزش فریمورک Tailwind CSS به زبان ساده!
    • آموزش HTML و CSS پروژه محور و اصولی !
  • وبلاگ
  • تماس با ما
  • درباره ما
ورود / عضویت

وبلاگ

فرانت اندی > وبلاگ فِرانت اِندی > ری اکت > کتابخانه React Hook Form برای مدیریت فرم در ری اکت ( آموزش و بررسی جامع )

کتابخانه React Hook Form برای مدیریت فرم در ری اکت ( آموزش و بررسی جامع )

27 آبان 1402
ارسال شده توسط احمد احمدنژاد
ری اکت
کتابخانه React Hook Form - کتابخانه React Hook Form در ری اکت - React Hook Form در ری اکت - React Hook Form در ریکت - React Hook Form در React - فرم در ری اکت - مدیریت فرم در ری اکت - اعتبار سنجی فرم در ری اکت - اعتبار سنجی فرم در ریکت - اعتبار سنجی فرم در React

کتابخانه React Hook Form در ری اکت یکی از خفن ترین و بهترین کتابخانه های مدیریت فرم به حساب میاد. تو این مقاله به آموزش React Hook Form میپردازیم و بصورت جامع و تخصصی بررسیش میکنیم 🙂

با فِرانت اِندی همراه باشید …

قضیه چیه ؟!

اکثر اپیکیشن های تحت وب شامل فرم هایی هستن که یکسری اطلاعات رو از کاربر دریافت میکنن ( مثل اطلاعات کاربر برای ثبت نام و .. )

پیاده سازی فرمها میتونن خیلی سخت و پیچیده باشن مخصوصا زمانیکه ما نیاز به فرم های پیچیده با ظاهر و عملکرد مناسب داریم.

 

آموزش ویدئویی React-Hook-Form

کتابخانه React Hook Form در ری اکت

React Hook Form یکی از بهترین کتابخانه های ری اکت هست که به ما اجازه میده فرم های پیچیده رو مدیریت کنیم. این کتابخانه عملکرد فوق العاده خوبی داره.

کتابخانه React Hook Form حجم خیلی پایینی داره، وابستگی کمی داره و خیلی عالی میتونه با کتابخانه های UI مثل Antd یا کتابخانه Material UI ادغام بشه.

پس اگه تو اپیکیشن ری اکتی خودمون فرم های پیچیده ای داریم و میخوایم خیلی راحت مدیریتشون کنیم، React Hook Form میتونه انتخاب فوق العاده ای برامون باشه

کتابخانه React Hook Form - کتابخانه React Hook Form در ری اکت - React Hook Form در ری اکت - React Hook Form در ریکت - React Hook Form در React - فرم در ری اکت - مدیریت فرم در ری اکت - اعتبار سنجی فرم در ری اکت - اعتبار سنجی فرم در ریکت - اعتبار سنجی فرم در React

چطور از کتابخانه React Hook Form استفاده کنیم ؟

تو مرحله اول به کمک دستور زیر میتونیم این کتابخونه رو نصب کنیم :

				
					npm i --save react-hook-form
				
			

حالا خیلی ساده میتونیم این کتابخانه رو داخل کامپوننت خودمون import کنیم :

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

تو تیکه کد بالا، ما هوک useForm رو فراخوانی کردیم. این هوک ویژگی ها و قابلیت های خیلی زیادی رو در اختیار ما میزاره. اما فعلا ما از ویژگی register و handleSubmit استفاده میکنیم.

مطابق کد زیر :

				
					const { register, handleSubmit } = useForm();
				
			

ما باید input های خودمون رو به کمک یک متغیر register کنیم تا برای Validation و submit کردن فرم از اون متغیر استفاده کنیم.

بطور مثال برای register کردن یک input میتونیم از روش زیر استفاده کنیم :

				
					<input
 className="border-2 outline-none p-2 rounded-md"
 placeholder="Name"
 {...register("name")}
 />
				
			

حالا برای اینکه بتونیم به اطلاعات فرم و submit شدن فرم دسترسی داشته باشیم، میتونیم مطابق کد زیر از onSubmitmethod استفاده کنیم :

				
					<form onSubmit={handleSubmit(onSubmit)}>
				
			

تموم مباحثی که راجبش صحبت کردیم ( تیکه کد های بالا ) رو میشه تو تیکه کد زیر بصورت کامل دید :

				
					import { useState } from "react";
import { useForm } from "react-hook-form";

export default function ReactHookFormMini() {
  const { register, handleSubmit } = useForm();
  const [data, setData] = useState("");
 
  const onSubmit = (data) => {
    setData(data)
  }

  return (
    <div className="w-full flex justify-center items-center bg-gray-900 p-8 border-r border-dashed">
      <div className="w-1/2 shadow-lg rounded-md bg-white p-8 flex flex-col" style={{height:'375px'}}>
        <h2 className="text-center font-medium text-2xl mb-4">
          React Hook Form Basic
        </h2>
        <form
          onSubmit={handleSubmit(onSubmit)}
          className="flex flex-1 flex-col justify-evenly"
        >
          <input
            className="border-2 outline-none p-2 rounded-md"
            placeholder="Name"
            {...register("name")}
          />
          <button
            className=" flex justify-center p-2 rounded-md w-1/2 self-center bg-gray-900  text-white hover:bg-gray-800"
            type='submit'
          >
            <span>
              Submit
            </span>
          </button>
        </form>
        <div className='h-4'>
          <p> Data: {JSON.stringify(data)}</p>
        </div>
      </div>
    </div>
  );
}
				
			

خروجی کد بالا رو میشه تو تصویر زیر دید :

react hook form ری اکت هوک فرم - کتابخانه ری اکت هوک فرم

اعتبار سنجی فرم ها ( Form Validation )

ما باید از ورود داده های ناخواسته به فرم های خودمون جلوگیری کنیم. پس تقریبا تمامی فرمهای میتونن شامل Form Validation باشن!

بطور مثال ما میتونیم تعداد کاراکتر های Input رو کنترل کنیم ( اگه کم یا زیاد بود به کاربر هشدار بدیم )

اعتبار سنجی داده ها معمولا تو سه لایه مختلف انجام میشه تا اطمینان حاصل کنیم که اطلاعات نادرست به back-end و درنهایت database نمیرسه!

 

1

اعتبار سنجی داده در

Front-End

2

اعتبار سنجی داده در

Back-End

3

اعتبار سنجی داده در

DataBase

اعتبار سنجی فرم در ری اکت میتونه چالش برانگیز و سخت باشه! مخصوصا اگه فرم ما برزگ باشه و فیلد های زیادی داشته باشه!

کتابخانه React Hook Form در ری اکت این کار رو برامون راحت کرده 🙂 خود React Hook Form به کمک ویژگی های زیر Form Validation رو انجام میده:

  • ویژگی required :

ویژگی required مشخص میکنه که پر کردن این فیلد ضروریه یا خیر.

  • ویژگی min :

حداقل مقداری که میتونه این فیلد قبول کنه ( مثلا عدد 1 میتونه به عنوان حداقل مقدار تنظیم بشه، پس عدد 0 قابل قبول نیست )

  • ویژگی max :

حداکثر مقداری که میتونه این فیلد قبول کنه ( مثلا عدد 99 میتونه به عنوان حداکثر مقدار تنظیم بشه، پس عدد 100 قابل قبول نیست )

  • ویژگی minLength :

این ویژگی حداقل طول قابل قبول فیلد رو مشخص میکنه. مثلا برای دریافت شماره همراه کاربر میتونیم این ویژگی رو 11 تنظیم کنیم. در این صورت کاربر نمیتونه یک شماره تلفن همراه 10 رقمی وارد کنه!

  • ویژگی maxLength :

این ویژگی حداکثر طول قابل قبول فیلد رو مشخص میکنه. مثلا برای دریافت شماره همراه کاربر میتونیم این ویژگی رو 11 تنظیم کنیم. در این صورت کاربر نمیتونه یک شماره تلفن همراه 12 رقمی وارد کنه!

  • ویژگی pattern :

ما میتونیم regex های خودمون رو به کمک این ویژگی برای Form Validation هر فیلد تنظیم کنیم.

  • ویژگی validate :

به کمک این ویژگی میتونیم Function های خودمون رو برای Form Validation اعمال کنیم.

 

تو تیکه کد زیر یک input داریم که Form Validation براش لحاظ کردیم ( به کمک ویژگی های بالا ) :

				
					<input
 className="border-2 outline-none p-2 rounded-md"
 placeholder="Phone Number"
 {...register("phoneNumber", {
    minLength: 1,
    maxLength: 10,
 })}
 />
				
			

اما این کافی نیست! چون اگه کاربر شرایط فیلد رو رعایت نکنه، هیچ اروری دریافت نمیکنه!

ما باید به کاربران خودمون یک متن ارور نمایش بدیم تا کاربر بدونه مشکل کجاست !! تو تیکه کد زیر یک Message به کاربر نمایش میدیم تا بدونه مشکلش کجاست :

				
					<input
 className="border-2 outline-none p-2 rounded-md"
 placeholder="Email"
 {...register("email", {
 pattern: {
   value: /^.*@hygraph.com$/,
   message: 'Email must end with FrontEndi.com'
 }
 })}
 />
				
			

ما حتی میتونیم ارور های دریافتی رو تو یه قالب دیگه به کاربر نمایش بدیم ( مثلا داخل تگ P ).

میتونیم ارور دریافتی رو که خودش یک Object هست از هوک useForm بگیریم و هر بلایی میخوایم سرش بیاریم :

 

				
					const { formState: { errors } } = useForm();

<span className="text-sm text-red-700">
   {errors?.email?.message}
</span>
				
			

تو تصویر زیر، ارور دریافتی کاربر مشخصه :

ادغام با کامپوننت های دیگر ( مثل Antd یا Material UI )

ما میتونیم React Hook Form رو با کامپوننت های دیگه، مثل کامپوننت های Antd ادغام کنیم.

تو تیکه کد زیر ما کتابخانه React Hook Form رو با کامپوننت های کتابخانه Antd ادغام کردیم :

				
					import React, { useState } from 'react';
import { Controller, useForm } from "react-hook-form";
import { Input, Checkbox, Slider } from "antd";


export default function RFHWithAntd() {
  const { control, handleSubmit } = useForm();
  const [data, setData] = useState({});
  const onSubmit = (data) => {
    setData(data)
  }
  return (
    <div className="w-full flex justify-center items-center bg-gray-900 p-8 border-r border-dashed">
      <div className="w-1/2 shadow-lg rounded-md bg-white p-8 flex flex-col" style={{ height: '375px' }}>
      <h2 className="text-center font-medium text-2xl mb-4">
          React Hook Form With AntD
        </h2>
        <form
          onSubmit={handleSubmit(onSubmit)}
          className="flex flex-1 flex-col justify-evenly"
        >
          <Controller
            control={control}
            name="name"
            render={({ field }) => (
            <Input
             {...field}
             placeholder="Name"
            />
            )}
          />

          <div className="flex">
            <label>Is Developer?</label>
            <Controller
              control={control}
              name="isDeveloper"
              render={({ field: { value, onChange } }) => (
                <Checkbox
                  className="ml-4"
                  checked={value}
                  onChange={(e) => {
                    onChange(e.target.checked);
                  }}
                />
              )}
            /></div>


          <section>
            <label>Experience In Years</label>
            <Controller
              control={control}
              name="experience"
              render={({ field }) => <Slider {...field} />}
            />
          </section>

         
          <button
            className=" flex justify-center p-2 rounded-md w-1/2 
            self-center bg-gray-900  text-white hover:bg-gray-800"
            type='submit'
          >
            <span>
              Submit
            </span>
          </button>
        </form>
        <div className='h-4'>
          <p> Data: {JSON.stringify(data)}</p>
        </div>
      </div>
    </div>
  )
};
				
			

تو تصویر زیر میشه خروجی تیکه کد بالا رو دید :

چند مثال از کتابخانه React Hook Form در ری اکت

کمی قبل تر اشاره کردیم که React Hook Form در ری اکت به بهبود Performance اپیکیشن کمک میکنه اما توضیح ندادیم چرا !

کتابخانه React Hook Form میتونه re-render های فرم رو مدیریت کنه و از re-render های اضافی جلوگیری کنه!

فرم های ساده چنین قابلیتی ندارن و با هر تغییر مقدار فرم، یکبار re-render میشن!

تو ادامه میخوایم 2 فرم بسازیم ( یک فرم با JSX خام و یک فرم با React Hook Form ) سپس مقایسه میکنیم که کدوم فرم عملکرد بهتری دارن ..

اول بریم فرم JSX ساده بسازیم :

				
					import React, { useState } from 'react';
let renderCount = 0

export default function NormalForm() {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');
  const [showFormData, setShowFormData] = useState(false)
  const onSubmit = (event) => {
    event.preventDefault()
    setShowFormData(true)
    console.log('Run Validations Manually, maintain & show errors on UI, if all good make API call.')
  }

  renderCount += 1
  return (
    <div className="w-1/2 flex justify-center items-center bg-gray-900 p-8">
      <div className="w-full shadow-lg rounded-md bg-white p-8 flex flex-col" style={{ height: '375px' }}>
        <h2 className="text-center font-medium text-2xl mb-4">
          Normal Form
        </h2>
        Render Count -- {renderCount}
        <form
          onSubmit={onSubmit}
          className="flex flex-1 flex-col justify-evenly"
        >
          <input
            className="border-2 outline-none p-2 rounded-md"
            placeholder="Name"
            value={name}
            onChange={(e) => { setName(e.target.value) }}
          />
          <input
            className="border-2 outline-none p-2 rounded-md"
            type="email"
            placeholder="Email"
            value={email}
            onChange={(e) => { setEmail(e.target.value) }}
          />
          <button
            className=" flex justify-center p-2 rounded-md 
            w-1/2 self-center bg-gray-900  text-white hover:bg-gray-800"
            type='submit'
          >
            <span>
              Submit
            </span>
          </button>
        </form>
        {

          <div className='h-4'>
            <p> Data:
              {
                showFormData ?
                  <span> {name} {email} </span>
                  : null
              }
            </p>
          </div>
        }
      </div>
    </div>
  );
}
				
			

حالا یک فرم به کمک کتابخانه React Hook Form در ریکت میسازیم :

				
					import { useState } from "react";
import { useForm } from "react-hook-form";
let renderCount = 0

export default function ReactHookForm() {
  const { register, handleSubmit } = useForm();
  const [data, setData] = useState("");

  const onSubmit = (data) => {
    setData(JSON.stringify(data))
  }

  renderCount += 1
  return (
    <div className="w-1/2 flex justify-center items-center bg-gray-900 p-8 border-r border-dashed">
      <div className="w-full shadow-lg rounded-md bg-white p-8 flex flex-col" style={{ height: '375px' }}>
        <h2 className="text-center font-medium text-2xl mb-4">
          React Hook Form
        </h2>
        Render Count -- {renderCount}
        <form
          onSubmit={handleSubmit(onSubmit)}
          className="flex flex-1 flex-col justify-evenly"
        >
          <input
            className="border-2 outline-none p-2 rounded-md"
            placeholder="Name"
            {...register("name")}
          />
          <input
            className="border-2 outline-none p-2 rounded-md"
            placeholder="Email"
            {...register("email")}
          />
          <button
            className=" flex justify-center p-2 rounded-md
            w-1/2 self-center bg-gray-900  text-white hover:bg-gray-800"
            type='submit'
          >
            <span>
              Submit
            </span>
          </button>
        </form>
        <div className='h-4'>
          <p> Data: {data}</p>
        </div>
      </div>
    </div>
  );
}
				
			

در آغاز میبینیم که هر فرم 2 بار render شده :

اما زمانیکه یکسری اطلاعات یکسان تو هر 2 فرم وارد میکنیم، نتیجه عجیب غریب میشه!!!

کتابخانه React Hook Form - کتابخانه React Hook Form در ری اکت - React Hook Form در ری اکت - React Hook Form در ریکت - React Hook Form در React - فرم در ری اکت - مدیریت فرم در ری اکت - اعتبار سنجی فرم در ری اکت - اعتبار سنجی فرم در ریکت - اعتبار سنجی فرم در React

توی فرمی که با React Hook Form ساختیم فقط 4 رندر گرفتیم اما توی فرم ساده JSX خودمون 54 رندر گرفتیم!

تفاوت این 2 عدد خیلی زیاده. این رو در نظر بگیرید که این فرم ما فقط 2 فیلد ورودی داره، حالا تصور کنید فرم ما ده ها فیلد ورودی داره! نتیجه وحشتناک میشه 🙂

دیدیم که React Hook Form چقدر به بهبود Performance اپیکیشن ما کمک میکنه .

ویژگی های پیشرفته کتابخانه React Hook Form

هوک useForm یک ویژگی به اسم formState در اختیار ما میزاره که یکسری اطلاعات درمورد تعامل کاربر با فرم در اختیار ما میزاره. بریم ببینیم چه اطلاعاتی در اختیار ما میزاره :

ویژگی isDirty :

این ویژگی یک مقدار boolean هست که نشون میده کاربر شروع به تعامل با فرم کرده یا نه.

ویژگی isValid :

این ویژگی یک مقدار boolean هست که نشون میده شرایط فعلی فرم Valid ( قابل قبول ) هست یا خیر.

ویژگی errors :

این ویژگی یک Object هست که شامل ارور های دریافتی فرم هست. ( اگه اروری وجود داشته باشه )

ویژگی isSubmitted :

این ویژگی یک مقدار boolean هست. اگه کاربر حداقل یکبار سعی کرده باشه که فرم رو submit کنه و اطلاعات ارسال بشه، این مقدار true میشه.

ویژگی touchedFields :

این ویژگی یک Object هست و شامل فیلدی هست که کاربر میخواد باهاش کار کنه.

ویژگی dirtyFields :

این ویژگی یک Object هست و شامل اون فیلدی هست که کاربر چیزی داخلش نوشته یا باهاش کار کرده.

جمع بندی

کتابخانه React Hook Form در React کمک میکنه تا خیلی بهتر بتونیم فرم های خودمون رو مدیریت کنیم .

ما دیدیم که توی فرم های ساده چقدر Performance ضعیفی داشتیم! ( به دلیل re-render زیاد )

پیشنهاد میکنم اگه توی اپیکیشن خودتون فرم دارید، حتما از React Hook Form استفاده کنید 🙂

کتابخانه React Hook Form در ری اکت چیست ؟

کتابخانه React Hook Form کمک میکنه تا بتونیم فرم های خودمون رو مدیریت کنیم. همچنین ویژگی های خوبی برای اعتبار سنجی فرم ( Form Validation ) در اختیار ما میزاره. علاوه بر همه اینها استفاده از React Hook Form به بهبود Performance اپیکیشن ما کمک میکنه و از re-render اضافی جلوگیری میکنه.

React Hook Form یا Formik ؟

مقایسه هایی که انجام دادیم نشون داد کتابخانه React Hook Form عملکرد بهتری در مدیریت فرم ها در React داره.

سوالات متداول فِرانت اِندی
درباره احمد احمدنژاد

من یه برنامه نویس و توسعه دهنده وب هستم که عاشق دنیای صفر و یکم❤️

نوشته‌های بیشتر از احمد احمدنژاد
قبلی تست نویسی در ری اکت و هرچیزی که باید راجبش بدونیم! راهنمای تست نویسی در React !
بعدی کتابخانه Formik در ری اکت برای ساخت و مدیریت فرم !

پست های مرتبط

ماژولار در ری اکت - ماژولار در React

11 مهر 1404

معماری ماژولار در پروژه های ری اکت !

احمد احمدنژاد
ادامه مطلب
هوک useFormStatus در ری اکت - هوک useFormStatus در ریکت - هوک useFormStatus در React

19 مرداد 1404

هوک useFormStatus در ری اکت ! ( بررسی مبتدی تا پیشرفته )

احمد احمدنژاد
ادامه مطلب
هوک useActionState در ری اکت - هوک useActionState در ریکت - هوک useActionState در React

18 مرداد 1404

هوک useActionState در ری اکت ! ( بررسی مبتدی تا پیشرفته )

احمد احمدنژاد
ادامه مطلب
هوک useOptimistic در ری اکت - هوک useOptimistic در ریکت - هوک useOptimistic در React

18 مرداد 1404

هوک useOptimistic در ری اکت ! ( بررسی مبتدی تا پیشرفته )

احمد احمدنژاد
ادامه مطلب
معماری MRAH در ری اکت - معماری MRAH در React - معماری MRAH در ریکت

15 مرداد 1404

معماری MRAH در ری اکت و هرچیزی که باید ازش بدونیم!

احمد احمدنژاد
ادامه مطلب

4 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • علی گفت:
    6 مهر 1403 در 12:59

    عالی بود 🙂

    پاسخ
    • احمد احمدنژاد گفت:
      10 مهر 1403 در 13:42

      سلام علی جان خوشحالم که برات مفید واقع شده موفق باشی 🙂

      پاسخ
  • محمد تمدن گفت:
    20 دی 1403 در 01:44

    دمتون گرم بابت زحماتی که برای ساخت این آموزش کشیدین ❤️‍🔥

    پاسخ
    • احمد احمدنژاد گفت:
      23 دی 1403 در 17:19

      قربانت محمدجان 🙂 خوشحالم که برات مفید بوده.
      موفق باشی

      پاسخ

دیدگاهتان را بنویسید لغو پاسخ

جستجو برای:
پیاده سازی و مشاوره فِرانت اِند!

پیاده سازی اصولی و بهینه پروژه های فِرانت اِند در کمترین زمان ممکن 🙂

پیاده سازی و مشاوره

صفحات فِرانت اِندی
  • وبلاگ
  • تماس با ما
  • درباره ما
تماس با ما
  • [email protected]
  • 09102944692
شبکه های اجتماعی
Youtube Instagram Telegram