WiX/mag

ویکس مگ / مجله آموزشی ویکس سِوِن

فرم های ری اکت

ساخت و مدیریت فرم ها در ری اکت: راهنمای جامع

پیمان باقری

پیمان باقری

برنامه نویس و متخصص وب

مدیریت فرم‌ها یکی از نیازهای اساسی در هر اپلیکیشن وب است و در ری‌ اکت، روش‌های مختلفی برای ساخت و مدیریت فرم‌ها وجود دارد. این مقاله به بررسی روش‌های مختلف مدیریت فرم‌ها، از جمله استفاده از state و ref برای فرم‌های ساده، تا استفاده از کتابخانه‌هایی مانند Formik، React Hook Form، و Yup برای اعتبارسنجی و مدیریت پیچیده‌تر فرم‌ها می‌پردازد. علاوه بر این، روش‌هایی برای بهینه‌سازی عملکرد، مدیریت فرم‌های چندمرحله‌ای و ارتباط با APIها در این مقاله پوشش داده می‌شود. هدف از این مقاله ارائه راهکارهایی است که به توسعه‌دهندگان ری‌ اکت کمک می‌کند تا با استفاده از ابزارها و تکنیک‌های مختلف، فرآیند مدیریت فرم‌ها را در پروژه‌های خود ساده‌تر و کارآمدتر کنند.

 

روش‌های ساده مدیریت فرم‌ ها در ری‌ اکت با State و Ref

در ری‌ اکت، برای مدیریت فرم‌ها می‌توان از روش‌های ساده‌ای مانند استفاده از state و ref بهره برد. این روش‌ها به خصوص در اپلیکیشن‌های کوچک یا فرم‌های ساده که نیاز به مدیریت پیچیده داده‌ها ندارند، کاربرد دارند. در ادامه، هرکدام از این روش‌ها به تفصیل توضیح داده می‌شود.

  1. استفاده از state برای مدیریت فرم‌ های ری اکت

در این روش، از state برای ذخیره‌سازی مقادیر ورودی‌ها استفاده می‌شود. هر فیلد از فرم به صورت یک state جداگانه مدیریت می‌شود و هنگام تغییر مقدار فیلد، state مربوطه به‌روز می‌شود. این روش برای فرم‌های ساده و قابل فهم است و از نظر خوانایی کد، معمولا ترجیح داده می‌شود.

مثال:

import React, { useState } from 'react';

function SimpleForm() {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log(`Name: ${name}, Email: ${email}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label>Name</label>
        <input
          type="text"
          value={name}
          onChange={(e) => setName(e.target.value)}
        />
      </div>
      <div>
        <label>Email</label>
        <input
          type="email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
        />
      </div>
      <button type="submit">Submit</button>
    </form>
  );
}

export default SimpleForm;

در این مثال، مقدار هر فیلد در state ذخیره می‌شود و هنگام تغییر، مقدار جدید در state به‌روزرسانی می‌شود. سپس این داده‌ها در زمان ارسال فرم به کنسول لاگ می‌شوند.

  1. استفاده از ref برای مدیریت فرم های ری اکت

در این روش، به جای ذخیره‌سازی مقادیر ورودی‌ها در state، از ref برای دسترسی مستقیم به عناصر فرم استفاده می‌شود. این روش بیشتر برای مواقعی مناسب است که نیاز به دسترسی به مقادیر فرم‌ها بدون نیاز به رندر مجدد باشد.

مثال:

import React, { useRef } from 'react';

function RefForm() {
  const nameRef = useRef();
  const emailRef = useRef();

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log(`Name: ${nameRef.current.value}, Email: ${emailRef.current.value}`);
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label>Name</label>
        <input type="text" ref={nameRef} />
      </div>
      <div>
        <label>Email</label>
        <input type="email" ref={emailRef} />
      </div>
      <button type="submit">Submit</button>
    </form>
  );
}

export default RefForm;

در این مثال، از ref برای ذخیره‌سازی مقادیر ورودی‌ها استفاده شده است. هنگام ارسال فرم، به مقادیر ورودی‌ها با استفاده از nameRef.current.value و emailRef.current.value دسترسی پیدا می‌کنیم. این روش کمتر منابع سیستم را مصرف می‌کند چون نیازی به رندر مجدد کامپوننت‌ها نیست.

مزایا و معایب استفاده از State و Ref در فرم های ری اکت

  • مزایا:
    • خوانایی بالا: کد ساده و قابل فهم است.
    • سهولت پیاده‌سازی: به راحتی می‌توان فرم‌ها را ایجاد کرد بدون نیاز به کتابخانه‌های اضافی.
  • معایب:
    • مدیریت پیچیدگی‌ها: زمانی که فرم‌ها پیچیده‌تر می‌شوند، این روش ممکن است به دردسر بیافتد، زیرا مدیریت چندین فیلد با استفاده از state می‌تواند کد را شلوغ و دست‌وپاگیر کند.
    • عدم پشتیبانی از اعتبارسنجی پیچیده: اعتبارسنجی فرم‌ها در این روش نیاز به پیاده‌سازی دستی دارد.

روش‌های state و ref برای فرم‌های ساده بسیار مناسب هستند، اما با افزایش پیچیدگی فرم‌ها، ممکن است به ابزارها و کتابخانه‌های پیچیده‌تری مانند Formik یا React Hook Form نیاز داشته باشید. این دو روش، به طور کلی برای پروژه‌های کوچک و متوسط به خوبی کار می‌کنند و می‌توانند به راحتی برای فرم‌های داینامیک و ساده پیاده‌سازی شوند.

 

کتابخانه‌ های مدیریت فرم در ری‌ اکت

در پروژه‌های بزرگ‌تر، مدیریت فرم‌ها می‌تواند به یک چالش پیچیده تبدیل شود. به ویژه زمانی که نیاز به ویژگی‌هایی مانند اعتبارسنجی پیچیده، مدیریت خطاها، کنترل ورودی‌های داینامیک و یا ارسال داده‌های فرم به سرور دارید. در چنین مواردی استفاده از کتابخانه‌های مدیریت فرم می‌تواند روند توسعه را ساده‌تر و کارآمدتر کند.

در این بخش، به معرفی برخی از پرکاربردترین کتابخانه‌های مدیریت فرم در ری‌ اکت می‌پردازیم که به طور گسترده در پروژه‌های بزرگ و پیچیده مورد استفاده قرار می‌گیرند.

  1. Formik

Formik یکی از محبوب‌ترین کتابخانه‌ها برای مدیریت فرم‌ها در ری‌ اکت است. این کتابخانه تمرکز خود را روی سه ویژگی اصلی گذاشته است: مدیریت وضعیت فرم، مدیریت اعتبارسنجی‌ها و مدیریت ارسال داده‌ها.

ویژگی‌های Formik:

  • مدیریت وضعیت فرم: Formik به شما این امکان را می‌دهد که تمام وضعیت‌های فرم خود را در یک مکان متمرکز نگه دارید.
  • اعتبارسنجی: با Formik می‌توانید اعتبارسنجی‌ها را با استفاده از schema‌ها یا به صورت ساده‌تر با استفاده از فانکشن‌ها پیاده‌سازی کنید.
  • ارسال داده‌ها: ارسال داده‌ها به سرور به راحتی با Formik انجام می‌شود. این کتابخانه به طور خودکار داده‌های فرم را به شکل یک شی JSON آماده ارسال می‌کند.
  • تسهیل رندر کردن ورودی‌ها: با استفاده از کامپوننت‌های Formik، می‌توانید به راحتی ورودی‌ها را به فرم‌ها متصل کنید.

مثال کد:

import React from 'react';
import { Formik, Field, Form } from 'formik';

function MyForm() {
  return (
    <Formik
      initialValues={{ email: '', password: '' }}
      onSubmit={values => {
        console.log(values);
      }}
    >
      <Form>
        <Field name="email" type="email" />
        <Field name="password" type="password" />
        <button type="submit">Submit</button>
      </Form>
    </Formik>
  );
}

Formik به دلیل سادگی و امکانات گسترده‌ای که در اختیار کاربران قرار می‌دهد، بسیار محبوب است.

  1. React Hook Form

React Hook Form یک کتابخانه سبک و سریع برای مدیریت فرم‌ها است که از ویژگی‌های React hooks بهره می‌برد. این کتابخانه با هدف کاهش تعداد رندرهای غیرضروری و ارائه تجربه‌ای ساده و موثر برای مدیریت فرم‌ها طراحی شده است.

ویژگی‌های React Hook Form:

  • سرعت بالا: به دلیل استفاده از hooks و کاهش رندرها، React Hook Form سرعت بسیار بالایی دارد.
  • پشتیبانی از اعتبارسنجی و مدیریت خطاها: این کتابخانه به شما اجازه می‌دهد تا به راحتی اعتبارسنجی‌ها و پیام‌های خطا را مدیریت کنید.
  • سازگاری با سایر کتابخانه‌ها: React Hook Form به راحتی با دیگر کتابخانه‌ها مثل Yup برای اعتبارسنجی سازگار است.
  • کاهش کد نویسی: به دلیل استفاده از refها و hooks، نیاز به نوشتن کد زیاد و پیچیده ندارید.

مثال کد:

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

function MyForm() {
  const { register, handleSubmit } = useForm();
  const onSubmit = data => console.log(data);

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("email")} />
      <input {...register("password")} />
      <button type="submit">Submit</button>
    </form>
  );
}

React Hook Form به دلیل کارایی بالا و حجم کم، برای پروژه‌هایی که نیاز به فرم‌های داینامیک و با عملکرد بالا دارند، بسیار مناسب است.

  1. Redux Form

Redux Form کتابخانه‌ای است که از Redux برای مدیریت وضعیت فرم استفاده می‌کند. این کتابخانه برای اپلیکیشن‌های بزرگ و پیچیده‌ای که نیاز به مدیریت وضعیت سراسری دارند، مناسب است.

ویژگی‌های Redux Form:

  • یکپارچگی با Redux: وضعیت فرم در استیت جهانی اپلیکیشن ذخیره می‌شود.
  • قابلیت گسترش و سفارشی‌سازی: به دلیل استفاده از Redux، می‌توانید قابلیت‌های زیادی به فرم‌ها اضافه کنید.
  • مدیریت کامل داده‌ها: تمام داده‌های فرم در استیت گلوبال ذخیره می‌شود، که این قابلیت در پروژه‌های بزرگ که نیاز به اشتراک‌گذاری داده‌های فرم بین کامپوننت‌ها دارند، مفید است.

مثال کد:

import React from 'react';
import { Field, reduxForm } from 'redux-form';

const MyForm = ({ handleSubmit }) => (
  <form onSubmit={handleSubmit}>
    <Field name="email" component="input" type="email" />
    <Field name="password" component="input" type="password" />
    <button type="submit">Submit</button>
  </form>
);

export default reduxForm({ form: 'myForm' })(MyForm);
  1. Final Form

Final Form یک کتابخانه دیگر برای مدیریت فرم‌ها است که هدف آن ارائه یک API ساده و قدرتمند برای کنترل وضعیت فرم است. برخلاف Redux Form، Final Form از Redux استفاده نمی‌کند، بلکه وضعیت فرم را به صورت محلی در کامپوننت‌ها مدیریت می‌کند.

ویژگی‌های Final Form:

  • API ساده: استفاده از Final Form بسیار ساده است و نیاز به پیکربندی پیچیده ندارد.
  • عدم نیاز به Redux: برخلاف Redux Form، Final Form وضعیت فرم را در داخل خود کامپوننت‌ها ذخیره می‌کند.
  • پشتیبانی از اعتبارسنجی و مدیریت خطاها: این کتابخانه به راحتی از اعتبارسنجی و خطاها پشتیبانی می‌کند.

مثال کد:

import React from 'react';
import { Form, Field } from 'react-final-form';

function MyForm() {
  return (
    <Form
      onSubmit={formData => console.log(formData)}
      render={({ handleSubmit }) => (
        <form onSubmit={handleSubmit}>
          <Field name="email" component="input" type="email" />
          <Field name="password" component="input" type="password" />
          <button type="submit">Submit</button>
        </form>
      )}
    />
  );
}

کدام کتابخانه برای مدیریت فرم در ری اکت بهتر است؟

برای انتخاب کتابخانه مناسب برای مدیریت فرم‌ها در ری‌ اکت، بسته به نیازهای پروژه باید یکی از این کتابخانه‌ها را انتخاب کنید. Formik و React Hook Form بیشتر برای پروژه‌هایی که نیاز به سادگی و عملکرد بالا دارند توصیه می‌شوند. در حالی که Redux Form و Final Form برای پروژه‌هایی که نیاز به مدیریت وضعیت سراسری دارند، گزینه‌های مناسبی هستند.

استفاده از این کتابخانه‌ها می‌تواند پیچیدگی‌ها را کاهش داده و فرآیند پیاده‌سازی فرم‌ها را به طور چشمگیری ساده‌تر کند.

 

اعتبارسنجی فرم‌ها در ری‌ اکت با استفاده از Yup

Yup یک کتابخانه جاوا اسکریپت است که برای اعتبارسنجی داده‌ها و تعریف schema استفاده می‌شود. این کتابخانه به طور خاص در اعتبارسنجی فرم‌ها و داده‌های ورودی در ری‌ اکت کاربرد دارد. Yup به شما این امکان را می‌دهد که قواعد اعتبارسنجی دقیق و قابل‌فهمی را برای داده‌های ورودی تعریف کنید و آن‌ها را به‌راحتی با سایر کتابخانه‌ها و ابزارهای ری‌ اکت ترکیب کنید.

ویژگی‌های مهم Yup

  • ساده‌سازی ساختار اعتبارسنجی: Yup به شما این امکان را می‌دهد که اعتبارسنجی‌ها را به صورت واضح و مختصر بنویسید. این کتابخانه به شما کمک می‌کند تا الگوهای پیچیده اعتبارسنجی را به راحتی پیاده‌سازی کنید.
  • پشتیبانی از انواع داده‌ها: Yup انواع داده‌ها مانند رشته‌ها، اعداد، تاریخ‌ها و آرایه‌ها را به خوبی اعتبارسنجی می‌کند.
  • توانایی ترکیب با سایر کتابخانه‌ها: Yup می‌تواند به راحتی با کتابخانه‌هایی مانند Formik و React Hook Form ترکیب شود تا اعتبارسنجی را در فرآیندهای مدیریت فرم ساده‌تر کند.

مثال ساده از اعتبارسنجی با Yup

import * as Yup from 'yup';

const validationSchema = Yup.object({
  email: Yup.string().email('ایمیل معتبر نیست').required('ایمیل الزامی است'),
  password: Yup.string().min(6, 'کلمه عبور باید حداقل ۶ کاراکتر باشد').required('کلمه عبور الزامی است')
});

این schema اعتبارسنجی برای فیلدهای email و password تعریف شده است و در هنگام استفاده می‌تواند به صورت خودکار خطاها را برای این فیلدها نمایش دهد.

1. استفاده از Yup در روش‌ مدیریت فرم با State

در صورتی که بخواهید فرم‌ها را به‌صورت دستی مدیریت کنید، می‌توانید از state برای نگهداری مقادیر ورودی و خطاهای فرم استفاده کنید. در این روش، برای اعتبارسنجی می‌توانید از Yup استفاده کنید تا در هنگام ارسال فرم، داده‌ها را بررسی کنید.

مثال کد:

import React, { useState } from 'react';
import * as Yup from 'yup';

const validationSchema = Yup.object({
  email: Yup.string().email('ایمیل معتبر نیست').required('ایمیل الزامی است'),
  password: Yup.string().min(6, 'کلمه عبور باید حداقل ۶ کاراکتر باشد').required('کلمه عبور الزامی است')
});

function MyForm() {
  const [formData, setFormData] = useState({ email: '', password: '' });
  const [errors, setErrors] = useState({});

  const handleSubmit = () => {
    validationSchema.validate(formData, { abortEarly: false })
      .then(() => {
        // ارسال فرم موفقیت‌آمیز
        console.log('فرم ارسال شد');
      })
      .catch(err => {
        const newErrors = err.inner.reduce((acc, current) => {
          acc[current.path] = current.message;
          return acc;
        }, {});
        setErrors(newErrors); // نمایش خطاها
      });
  };

  return (
    <div>
      <input 
        type="email" 
        value={formData.email} 
        onChange={(e) => setFormData({ ...formData, email: e.target.value })} 
      />
      {errors.email && <p>{errors.email}</p>}

      <input 
        type="password" 
        value={formData.password} 
        onChange={(e) => setFormData({ ...formData, password: e.target.value })} 
      />
      {errors.password && <p>{errors.password}</p>}

      <button onClick={handleSubmit}>ارسال</button>
    </div>
  );
}

2. استفاده از Yup در روش‌ مدیریت فرم با Ref

در این روش، از ref برای دسترسی مستقیم به المان‌های فرم استفاده می‌شود. این روش معمولاً برای فرم‌های ساده‌تر که نیاز به تعاملات کمی دارند، مناسب است.

مثال کد:

import React, { useRef, useState } from 'react';
import * as Yup from 'yup';

const validationSchema = Yup.object({
  email: Yup.string().email('ایمیل معتبر نیست').required('ایمیل الزامی است'),
  password: Yup.string().min(6, 'کلمه عبور باید حداقل ۶ کاراکتر باشد').required('کلمه عبور الزامی است')
});

function MyForm() {
  const emailRef = useRef();
  const passwordRef = useRef();
  const [errors, setErrors] = useState({});

  const handleSubmit = () => {
    const formData = {
      email: emailRef.current.value,
      password: passwordRef.current.value
    };

    validationSchema.validate(formData, { abortEarly: false })
      .then(() => {
        // ارسال فرم موفقیت‌آمیز
        console.log('فرم ارسال شد');
      })
      .catch(err => {
        const newErrors = err.inner.reduce((acc, current) => {
          acc[current.path] = current.message;
          return acc;
        }, {});
        setErrors(newErrors); // نمایش خطاها
      });
  };

  return (
    <div>
      <input ref={emailRef} type="email" />
      {errors.email && <p>{errors.email}</p>}

      <input ref={passwordRef} type="password" />
      {errors.password && <p>{errors.password}</p>}

      <button onClick={handleSubmit}>ارسال</button>
    </div>
  );
}

3. استفاده از Yup در روش‌ مدیریت فرم با کتابخانه Formik

Formik یکی از کتابخانه‌های محبوب برای مدیریت فرم‌ها در ری‌ اکت است که پشتیبانی کامل از اعتبارسنجی داده‌ها با استفاده از Yup را فراهم می‌کند. در Formik، می‌توان به راحتی از Yup برای اعتبارسنجی ورودی‌ها استفاده کرد.

مثال کد:

import React from 'react';
import { Formik, Field, Form } from 'formik';
import * as Yup from 'yup';

const validationSchema = Yup.object({
  email: Yup.string().email('ایمیل معتبر نیست').required('ایمیل الزامی است'),
  password: Yup.string().min(6, 'کلمه عبور باید حداقل ۶ کاراکتر باشد').required('کلمه عبور الزامی است')
});

function MyForm() {
  return (
    <Formik
      initialValues={{ email: '', password: '' }}
      validationSchema={validationSchema} // اتصال به Yup برای اعتبارسنجی
      onSubmit={values => {
        console.log(values);
      }}
    >
      <Form>
        <Field name="email" type="email" />
        <Field name="password" type="password" />
        <button type="submit">ارسال</button>
      </Form>
    </Formik>
  );
}

4. استفاده از Yup در روش‌ مدیریت فرم با کتابخانه React Hook Form

React Hook Form نیز امکان استفاده از Yup برای اعتبارسنجی داده‌ها را فراهم می‌کند و اینکار را به روشی ساده و مؤثر انجام می‌دهد. این کتابخانه با کاهش رندرهای اضافی و ارائه عملکرد بهینه، یکی از انتخاب‌های محبوب برای مدیریت فرم‌ها در ری‌ اکت است.

مثال کد:

import React from 'react';
import { useForm } from 'react-hook-form';
import * as Yup from 'yup';
import { yupResolver } from '@hookform/resolvers/yup';

const validationSchema = Yup.object({
  email: Yup.string().email('ایمیل معتبر نیست').required('ایمیل الزامی است'),
  password: Yup.string().min(6, 'کلمه عبور باید حداقل ۶ کاراکتر باشد').required('کلمه عبور الزامی است')
});

function MyForm() {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: yupResolver(validationSchema) // اتصال به Yup
  });

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

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("email")} />
      {errors.email && <p>{errors.email.message}</p>}

      <input {...register("password")} />
      {errors.password && <p>{errors.password.message}</p>}

      <button type="submit">ارسال</button>
    </form>
  );
}

در مدیریت فرم‌ها در ری‌ اکت، اعتبارسنجی یکی از جنبه‌های کلیدی است که باید به آن توجه کرد. استفاده از Yup برای اعتبارسنجی داده‌ها به شما این امکان را می‌دهد که قواعد اعتبارسنجی پیچیده را به راحتی پیاده‌سازی کنید. علاوه بر این، با استفاده از ابزارهای مختلف مانند Formik و React Hook Form می‌توانید فرآیند مدیریت فرم‌ها را ساده و مؤثر کنید.

 

فرم‌ های پیچیده و چند مرحله‌ای در ری‌ اکت

در برخی اپلیکیشن‌های وب، فرم‌ها نیاز به ورود اطلاعات از مراحل مختلف و پیچیده دارند. این نوع فرم‌ها می‌توانند شامل فیلدهای متعدد، انتخاب‌های متغیر، و تاییدیه‌های مختلف باشند. فرم‌های چندمرحله‌ای علاوه بر چالش‌های معمول در مدیریت فرم‌ها، نیاز به مدیریت وضعیت (State Management) پیچیده‌تری دارند. در ری‌ اکت، چندین رویکرد و ابزار برای مدیریت این فرم‌ها وجود دارد که می‌توانند فرایند ورود اطلاعات را ساده‌تر و ساختارمندتر کنند.

چالش‌های فرم‌ های پیچیده

فرم‌های پیچیده و چندمرحله‌ای معمولاً دارای ویژگی‌های زیر هستند:

  • تعاملات پویا: نیاز به ورود داده‌ها در چند مرحله که هر کدام ممکن است با فیلدهای مختلف و اعتبارسنجی‌های متفاوتی همراه باشند.
  • مدیریت وضعیت فرم: وضعیت فرم در هر مرحله باید به درستی حفظ شده و پس از تکمیل مراحل مختلف، به یکدیگر متصل شوند.
  • مدیریت فیلدهای پنهان و نمایش داینامیک: برخی از فیلدها ممکن است در مراحل بعدی فرم ظاهر شوند یا با توجه به پاسخ‌های قبلی تغییر کنند.
  • اعتبارسنجی در مراحل مختلف: اعتبارسنجی باید در هر مرحله از فرم به‌صورت جداگانه انجام شود.

رویکردها و ابزارهای مدیریت فرم‌ های پیچیده

برای پیاده‌سازی فرم‌های پیچیده، چند روش و ابزار در ری‌ اکت وجود دارد که می‌توانند به‌طور مؤثر مدیریت وضعیت و اعتبارسنجی فرم را ساده‌تر کنند:

  1. استفاده از State برای مدیریت وضعیت فرم

یکی از رویکردهای ساده برای مدیریت فرم‌های پیچیده، استفاده از state در ری‌ اکت است. در این روش، وضعیت هر فیلد از فرم به‌طور مجزا در state نگهداری می‌شود و می‌توان به راحتی مقادیر ورودی را در هر مرحله ذخیره کرد. برای مدیریت فرم‌های چندمرحله‌ای، می‌توان از state برای ذخیره اطلاعات هر مرحله استفاده کرده و سپس آن‌ها را به مرحله بعدی انتقال داد.

مزایا:

  • سادگی پیاده‌سازی برای فرم‌های کوچک و متوسط.
  • انعطاف‌پذیری در پیاده‌سازی رفتارهای داینامیک.

معایب:

  • پیچیدگی در فرم‌های بزرگ با تعداد فیلد زیاد.
  • مدیریت وضعیت به صورت دستی ممکن است زمان‌بر و خطاپذیر باشد.
  1. استفاده از کتابخانه‌های مدیریت فرم (Formik، React Hook Form)

کتابخانه‌هایی مانند Formik و React Hook Form ابزارهایی قدرتمند برای مدیریت فرم‌ها در ری‌ اکت هستند که به طور خاص برای فرم‌های پیچیده طراحی شده‌اند. این کتابخانه‌ها به شما کمک می‌کنند تا وضعیت فرم، اعتبارسنجی و ارسال فرم را به صورت مؤثر مدیریت کنید.

  • Formik: Formik برای فرم‌های پیچیده با مراحل متعدد و فیلدهای داینامیک مناسب است. این کتابخانه دارای ویژگی‌های پیشرفته‌ای است که به شما اجازه می‌دهد وضعیت فرم را به صورت مرکزی مدیریت کنید. با استفاده از Formik، شما می‌توانید مراحل مختلف فرم را در یک کامپوننت ترکیب کنید و در عین حال، از عملکردهای مربوط به اعتبارسنجی و ارسال خودکار فرم بهره‌مند شوید.
  • React Hook Form: React Hook Form برای مدیریت فرم‌های پیچیده بسیار بهینه است و به دلیل سبک بودن و کم کردن رندرهای اضافی، برای پروژه‌های بزرگ‌تر بسیار مناسب است. این کتابخانه همچنین پشتیبانی از Yup را برای اعتبارسنجی آسان داده‌ها فراهم می‌کند.
  1. استفاده از Context API برای مدیریت وضعیت فرم

در پروژه‌های بزرگ، استفاده از Context API برای مدیریت وضعیت فرم می‌تواند مفید باشد. با استفاده از Context API، می‌توانید وضعیت فرم‌ها را در سطح اپلیکیشن مدیریت کرده و به راحتی آن‌ها را در بین کامپوننت‌های مختلف به اشتراک بگذارید. این روش به خصوص برای فرم‌های پیچیده و چندمرحله‌ای مناسب است که نیاز به اشتراک‌گذاری داده‌ها بین مراحل مختلف دارند.

  1. اعتبارسنجی در هر مرحله

در فرم‌های چندمرحله‌ای، ممکن است نیاز به اعتبارسنجی داشته باشید که در هر مرحله انجام شود. برای این کار، می‌توانید از Yup به‌عنوان کتابخانه اعتبارسنجی و از Formik یا React Hook Form برای انجام اعتبارسنجی به‌طور خودکار استفاده کنید. در هر مرحله از فرم، اعتبارسنجی می‌تواند اجرا شده و در صورت نیاز، کاربر را به مرحله قبلی بازگرداند.

نکات مهم در طراحی فرم‌ های چند مرحله‌ای

  • حفظ وضعیت بین مراحل: اطمینان حاصل کنید که داده‌های واردشده در مراحل قبلی فرم هنگام حرکت به مرحله بعدی حفظ شوند.
  • اعتبارسنجی در مراحل مختلف: اعتبارسنجی هر مرحله را جداگانه انجام دهید و از پیام‌های خطای واضح استفاده کنید.
  • دسترس‌پذیری: اطمینان حاصل کنید که فرم‌های چندمرحله‌ای برای همه کاربران، از جمله کاربران با ناتوانی‌های جسمی و حسی، قابل استفاده هستند.

ساخت و مدیریت فرم‌های پیچیده و چندمرحله‌ای در ری‌ اکت چالش‌های خاص خود را دارد، اما با استفاده از ابزارهای مختلف مانند Formik، React Hook Form، Context API و Yup می‌توان این چالش‌ها را به‌طور مؤثر مدیریت کرد. این ابزارها علاوه بر ساده‌سازی فرآیند مدیریت وضعیت و اعتبارسنجی فرم‌ها، به توسعه‌دهندگان کمک می‌کنند تا تجربه کاربری بهتری را در اپلیکیشن‌های پیچیده فراهم کنند.

 

ارتباط با API ها در فرم‌ های ری اکت

ارتباط با APIها یکی از اجزای مهم در بسیاری از اپلیکیشن‌های وب است، به ویژه در فرم‌ها که معمولاً برای ارسال یا دریافت داده‌ها به سمت سرور استفاده می‌شوند. این فرآیند معمولاً شامل ارسال داده‌های فرم به یک API (مثل REST یا GraphQL) و دریافت پاسخ از آن است. در ری‌ اکت، چندین روش برای برقراری ارتباط با APIها وجود دارد که معمولاً از fetch، axios یا کتابخانه‌های مشابه برای انجام درخواست‌ها استفاده می‌شود.

  1. ارسال درخواست به API با استفاده از Fetch

fetch یکی از روش‌های اصلی در JavaScript برای ارسال درخواست HTTP است. این متد به صورت پیش‌فرض از Promise‌ها پشتیبانی می‌کند و می‌توان از آن در کامپوننت‌های ری‌ اکت برای ارسال داده‌های فرم به سرور استفاده کرد.

نمونه کد ارسال داده با استفاده از Fetch:

const handleSubmit = async (event) => {
  event.preventDefault();
  
  const formData = {
    name: name,
    email: email,
  };

  try {
    const response = await fetch('https://api.example.com/submit', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(formData),
    });

    if (!response.ok) {
      throw new Error('Network response was not ok');
    }

    const data = await response.json();
    console.log('Success:', data);
  } catch (error) {
    console.error('Error:', error);
  }
};

در این کد، هنگام ارسال داده‌ها به API، از fetch برای ارسال درخواست POST به سرور استفاده می‌شود. در صورتی که پاسخ موفقیت‌آمیز دریافت نشود، خطا به کاربر اطلاع داده می‌شود.

  1. استفاده از Axios برای درخواست‌های API

axios یکی دیگر از کتابخانه‌های محبوب برای ارسال درخواست‌های HTTP است که برخی ویژگی‌های اضافه مانند پشتیبانی از درخواست‌های همزمان، قابلیت تنظیم درخواست‌ها و پاسخ‌ها، و مدیریت خطا را ارائه می‌دهد. axios نسبت به fetch بیشتر مورد توجه است به ویژه برای پروژه‌های بزرگ‌تر که نیاز به مدیریت بهتر خطاها و درخواست‌ها دارند.

نمونه کد ارسال داده با استفاده از Axios:

import axios from 'axios';

const handleSubmit = async (event) => {
  event.preventDefault();
  
  const formData = {
    name: name,
    email: email,
  };

  try {
    const response = await axios.post('https://api.example.com/submit', formData);
    console.log('Success:', response.data);
  } catch (error) {
    console.error('Error:', error);
  }
};

در این مثال، axios به راحتی داده‌های فرم را به صورت JSON ارسال می‌کند و می‌توان به‌طور موثر پاسخ‌ها و خطاها را مدیریت کرد.

  1. مدیریت درخواست‌ها در زمان ارسال فرم

یکی از چالش‌های معمول در هنگام ارسال فرم‌ها به API، مدیریت وضعیت فرم و درخواست‌ها است. برای این منظور، می‌توان از state‌ها برای ذخیره وضعیت درخواست‌ها (مانند در حال ارسال، موفق، یا خطا) استفاده کرد. این روش نه تنها تجربه کاربری بهتری می‌دهد، بلکه به شما کمک می‌کند تا در زمان ارسال درخواست‌ها، پیام‌های مناسب به کاربر نشان دهید.

نمونه کد مدیریت درخواست با وضعیت ارسال:

const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);

const handleSubmit = async (event) => {
  event.preventDefault();
  setLoading(true);

  const formData = { name, email };

  try {
    const response = await axios.post('https://api.example.com/submit', formData);
    console.log('Form submitted successfully', response.data);
  } catch (error) {
    setError('There was an error submitting the form');
    console.error(error);
  } finally {
    setLoading(false);
  }
};

در اینجا از loading برای نمایش یک اندیکاتور بارگذاری و error برای مدیریت خطاها استفاده می‌شود. این کمک می‌کند تا کاربر بداند درخواست در حال پردازش است یا مشکلی در ارسال داده‌ها پیش آمده است.

  1. ارسال داده‌ها در پس‌زمینه با استفاده از React Query یا SWR

کتابخانه‌هایی مانند React Query و SWR برای مدیریت داده‌ها و کشینگ در اپلیکیشن‌های ری‌ اکت بسیار محبوب هستند. این ابزارها علاوه بر ارسال داده‌ها به API، می‌توانند به شما در مدیریت و کشینگ داده‌ها، هماهنگ‌سازی و اعتبارسنجی آن‌ها کمک کنند.

نمونه کد استفاده از React Query برای ارسال داده‌ها به API:

import { useMutation } from 'react-query';

const mutation = useMutation((newFormData) => {
  return axios.post('https://api.example.com/submit', newFormData);
});

const handleSubmit = async (event) => {
  event.preventDefault();
  mutation.mutate({ name, email });
};

با استفاده از React Query، می‌توانید وضعیت ارسال درخواست را به راحتی مدیریت کنید و همچنین از ویژگی‌های کشینگ و بهینه‌سازی درخواست‌ها بهره‌مند شوید.

  1. مدیریت وضعیت با فرم‌ های پیچیده

برای ارسال داده‌ها از فرم‌های پیچیده که ممکن است شامل ورودی‌های داینامیک یا فرم‌های چندمرحله‌ای باشند، می‌توان از Formik یا React Hook Form استفاده کرد. این کتابخانه‌ها به‌طور مؤثر مدیریت وضعیت و ارسال داده‌ها به API را تسهیل می‌کنند و همچنین از اعتبارسنجی خودکار داده‌ها نیز پشتیبانی می‌کنند.

ارتباط با APIها بخش اساسی از ساخت فرم‌ها در ری‌ اکت است، به ویژه در فرم‌هایی که نیاز به ارسال داده‌ها به سرور دارند. روش‌هایی مانند استفاده از fetch یا axios، و کتابخانه‌های مدیریتی مانند React Query، SWR، Formik، و React Hook Form به شما کمک می‌کنند تا درخواست‌ها را به‌طور مؤثر مدیریت کرده و تجربه کاربری بهتری ارائه دهید. توجه به جزئیات در مدیریت وضعیت، اعتبارسنجی، و نمایش وضعیت درخواست‌ها می‌تواند تأثیر زیادی در موفقیت فرم‌ها و تعاملات API داشته باشد.

 

بهینه‌سازی عملکرد فرم‌ها در ری‌ اکت

عملکرد مناسب فرم‌ها در اپلیکیشن‌های ری‌ اکت می‌تواند تأثیر زیادی بر تجربه کاربری داشته باشد، به‌ویژه زمانی که فرم‌ها پیچیده یا داینامیک هستند. بارگذاری سریع و تعاملات روان با فرم‌ها نه تنها به رضایت کاربران کمک می‌کند بلکه از نظر بهینه‌سازی مصرف منابع و کاهش زمان پاسخگویی نیز بسیار مهم است. در این بخش به چندین روش برای بهینه‌سازی عملکرد فرم‌ها در ری‌ اکت پرداخته می‌شود.

  1. استفاده از React.memo برای جلوگیری از رندر مجدد غیرضروری

ری‌ اکت به طور پیش‌فرض، کامپوننت‌ها را هر زمان که state یا props آن‌ها تغییر کند، دوباره رندر می‌کند. این می‌تواند در فرم‌های پیچیده‌ای که شامل تعداد زیادی فیلد و state است، به کاهش عملکرد منجر شود. یکی از راه‌های بهینه‌سازی این است که از React.memo برای جلوگیری از رندر مجدد غیرضروری استفاده کنید.

React.memo باعث می‌شود که تنها زمانی کامپوننت دوباره رندر شود که props آن تغییر کرده باشد. این موضوع می‌تواند به‌ویژه در فرم‌های بزرگ و پیچیده که تغییرات کوچک در فیلدها اتفاق می‌افتد، مفید باشد.

مثال:

const FormInput = React.memo(({ value, onChange, name }) => {
  return <input value={value} onChange={onChange} name={name} />;
});
  1. استفاده از lazy loading برای بارگذاری داینامیک فرم‌ها

در صورت داشتن فرم‌های داینامیک یا فرم‌هایی که تنها در برخی شرایط نمایش داده می‌شوند، می‌توان از قابلیت lazy loading در ری‌ اکت استفاده کرد. این کار باعث می‌شود که فرم‌ها تنها زمانی که کاربر نیاز دارد، بارگذاری شوند. این روش به ویژه در فرم‌های طولانی یا صفحات با تعداد زیاد فرم‌ها مؤثر است.

در ری‌ اکت، می‌توان از React.lazy() و Suspense برای انجام این کار استفاده کرد.

مثال:

const DynamicForm = React.lazy(() => import('./DynamicForm'));

const MyComponent = () => (
  <Suspense fallback={<div>Loading...</div>}>
    <DynamicForm />
  </Suspense>
);
  1. استفاده از Debouncing برای ورودی‌های کاربر

یکی از چالش‌های رایج در فرم‌ها، ارسال درخواست‌های پی در پی به API در حین تایپ کردن کاربر است. برای جلوگیری از ارسال درخواست‌های بیش از حد، می‌توان از debouncing استفاده کرد. Debouncing باعث می‌شود که تنها پس از مدتی بی‌عملی از کاربر، درخواست ارسال شود.

این کار معمولاً در فرم‌هایی با فیلدهای جستجو یا ورودی‌های عددی استفاده می‌شود. در ری‌ اکت می‌توان از کتابخانه‌هایی مثل lodash.debounce برای این کار بهره برد.

مثال:

import { useState } from 'react';
import debounce from 'lodash.debounce';

const SearchInput = () => {
  const [query, setQuery] = useState('');

  const handleChange = debounce((event) => {
    setQuery(event.target.value);
  }, 500);

  return <input type="text" onChange={handleChange} />;
};
  1. استفاده از Formik یا React Hook Form برای مدیریت وضعیت فرم

کتابخانه‌هایی مانند Formik و React Hook Form به‌طور خاص برای مدیریت وضعیت فرم‌ها طراحی شده‌اند و از نظر عملکردی بهینه‌تر از استفاده مستقیم از useState یا ref در ری‌ اکت هستند. این ابزارها مدیریت وضعیت فرم‌ها را ساده‌تر کرده و همچنین از رندر مجدد غیرضروری جلوگیری می‌کنند.

Formik و React Hook Form در پس‌زمینه به‌طور مؤثر از useEffect و useCallback برای مدیریت تغییرات ورودی‌ها استفاده می‌کنند و این بهینه‌سازی‌ها را خودشان انجام می‌دهند.

مثال با React Hook Form:

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

const MyForm = () => {
  const { register, handleSubmit } = useForm();

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

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('name')} />
      <button type="submit">Submit</button>
    </form>
  );
};
  1. استفاده از Virtualization برای فرم‌های طولانی

در فرم‌های بسیار طولانی که ممکن است شامل صدها فیلد باشد، بارگذاری تمام این فیلدها به طور همزمان می‌تواند عملکرد را تحت تأثیر قرار دهد. یکی از راه‌حل‌های مؤثر در این زمینه استفاده از virtualization است. با این کار، تنها بخش‌هایی از فرم که در حال نمایش هستند رندر می‌شوند و مابقی به‌صورت لازی بارگذاری می‌شود.

کتابخانه‌هایی مانند react-window و react-virtualized می‌توانند به این کار کمک کنند.

مثال:

import { FixedSizeList as List } from 'react-window';

const MyLongForm = () => {
  const fields = new Array(1000).fill(null);

  return (
    <List height={400} itemCount={fields.length} itemSize={35}>
      {({ index, style }) => <input style={style} key={index} />}
    </List>
  );
};
  1. بهینه‌سازی رندر با استفاده از useMemo و useCallback

در فرم‌های پیچیده، می‌توان از useMemo و useCallback برای جلوگیری از رندرهای غیرضروری استفاده کرد. useMemo به شما این امکان را می‌دهد که محاسبات گران‌قیمت را ذخیره کرده و تنها زمانی که ورودی‌ها تغییر کنند، دوباره محاسبه شوند. همچنین useCallback به شما کمک می‌کند تا توابعی که به فرزند کامپوننت‌ها پاس داده می‌شوند تنها زمانی که لازم است دوباره ایجاد شوند.

مثال:

const MyForm = () => {
  const handleSubmit = useCallback((data) => {
    console.log(data);
  }, []);

  return <form onSubmit={handleSubmit}>/* form fields */</form>;
};

بهینه‌سازی عملکرد فرم‌ها در ری‌ اکت، به ویژه زمانی که فرم‌ها پیچیده یا داینامیک هستند، می‌تواند تأثیر زیادی در بهبود تجربه کاربری داشته باشد. استفاده از تکنیک‌هایی مانند React.memo، lazy loading، debouncing، کتابخانه‌های مدیریت فرم مانند Formik و React Hook Form، و virtualization می‌تواند عملکرد را به‌طور چشمگیری بهبود دهد. همچنین، استفاده از useMemo و useCallback برای به حداقل رساندن رندرهای غیرضروری نیز از اهمیت ویژه‌ای برخوردار است. با پیاده‌سازی این تکنیک‌ها می‌توان تجربه کاربری بهتری ایجاد کرد و از منابع به شکل مؤثری استفاده نمود.

 

مقایسه کتابخانه‌ها و ابزارهای مدیریت فرم‌ها در ری‌ اکت

مدیریت فرم‌ها در ری‌ اکت می‌تواند با توجه به نیازهای پروژه متفاوت باشد. برای این کار، ابزارها و کتابخانه‌های مختلفی وجود دارند که هر کدام ویژگی‌ها و مزایای خاص خود را دارند. در این بخش، کتابخانه‌های محبوب مانند Formik، React Hook Form، Yup و Redux Form را مقایسه خواهیم کرد تا به شما کمک کنیم بهترین ابزار را برای پروژه خود انتخاب کنید.

  1. Formik

Formik یکی از پرکاربردترین کتابخانه‌ها برای مدیریت فرم‌ها در ری‌ اکت است که امکانات بسیاری برای مدیریت وضعیت فرم، اعتبارسنجی، و ارسال داده‌ها فراهم می‌کند. این کتابخانه با تمرکز بر کارایی و آسانی استفاده طراحی شده است و قابلیت مدیریت state داخلی را دارد. Formik به‌طور پیش‌فرض از “render props” استفاده می‌کند و قابلیت‌هایی مانند validations و form submission را به راحتی در اختیار شما قرار می‌دهد.

ویژگی‌ها:

  • مدیریت وضعیت فرم به‌صورت ساده و موثر
  • پشتیبانی از اعتبارسنجی سینکرون و آسنکرون
  • ارسال داده‌ها به APIها با امکانات پیشرفته
  • مدیریت خطاها و وضعیت‌های loading به سادگی
  1. React Hook Form

React Hook Form به‌طور خاص برای کاهش تعداد رندرها و بهبود کارایی طراحی شده است. این کتابخانه به صورت استفاده از “hooks” در ری‌ اکت با استفاده از useForm مدیریت وضعیت فرم‌ها را تسهیل می‌کند. این کتابخانه به صورت پیش‌فرض کمترین تعداد رندر را انجام می‌دهد و به‌ویژه برای پروژه‌های بزرگ که به عملکرد بالا نیاز دارند، مناسب است.

ویژگی‌ها:

  • عملکرد بسیار سریع و بهینه
  • حجم کم و سبک
  • پشتیبانی از اعتبارسنجی سینکرون و آسنکرون
  • پشتیبانی از تایپ‌های مختلف ورودی (مثل چک‌باکس، رادیوباتن، و غیره)
  • پشتیبانی از استفاده همزمان از فرم‌های پیچیده
  1. Yup

Yup یک کتابخانه معتبر برای اعتبارسنجی داده‌ها است که معمولاً با Formik یا React Hook Form برای انجام اعتبارسنجی فرم‌ها استفاده می‌شود. Yup از syntax مشابه JSON Schema استفاده می‌کند و به شما این امکان را می‌دهد که قوانین اعتبارسنجی پیچیده را با ترکیب متدهای مختلف اعمال کنید.

ویژگی‌ها:

  • اعتبارسنجی داده‌ها به‌صورت سینکرون و آسنکرون
  • قابلیت تعریف قوانین پیچیده و پیوند آن‌ها
  • پشتیبانی از اعتبارسنجی رشته‌ها، اعداد، و تاریخ‌ها
  • کارایی بالا و سازگاری با دیگر کتابخانه‌ها
  1. Redux Form

Redux Form یکی دیگر از کتابخانه‌های محبوب برای مدیریت فرم‌ها است که از Redux برای مدیریت state فرم‌ها استفاده می‌کند. این کتابخانه بیشتر در پروژه‌هایی که از Redux استفاده می‌کنند، مناسب است. اما یکی از معایب آن این است که می‌تواند منجر به رندرهای غیرضروری شود و از نظر کارایی کمی سنگین‌تر از React Hook Form و Formik است.

ویژگی‌ها:

  • استفاده از Redux برای مدیریت وضعیت
  • مناسب برای پروژه‌های بزرگ با نیاز به مدیریت state در سطح جهانی
  • پشتیبانی از اعتبارسنجی و مدیریت خطا
  • پشتیبانی از فرم‌های پیچیده و multi-step

جدول مقایسه کتابخانه‌ها و ابزارهای مدیریت فرم ری اکت

ویژگی‌ها

Formik React Hook Form Yup

Redux Form

کارایی

خوب عالی متوسط

سادگی استفاده

متوسط ساده متوسط

پشتیبانی از اعتبارسنجی

سینکرون و آسنکرون سینکرون و آسنکرون سینکرون و آسنکرون سینکرون و آسنکرون

حجم بسته

سنگین‌تر از React Hook Form سبک و کم حجم سنگین

مناسب برای پروژه‌های بزرگ

متوسط عالی عالی

پشتیبانی از تایپ‌های مختلف ورودی

بله بله بله

پشتیبانی از رندرهای غیرضروری

بله بله خیر

انتخاب کتابخانه مناسب برای مدیریت فرم‌ها بستگی به نیازهای خاص پروژه شما دارد. اگر به کارایی بالا و رندرهای بهینه نیاز دارید، React Hook Form انتخاب مناسبی است. اگر پروژه شما نیاز به مدیریت state پیچیده و اعتبارسنجی دارد، Formik یا Redux Form مناسب‌تر خواهند بود. در صورتی که فقط به اعتبارسنجی نیاز دارید، Yup را می‌توانید با هر یک از این کتابخانه‌ها ترکیب کنید تا فرآیند اعتبارسنجی را ساده‌تر و مؤثرتر کنید.

 

جمع بندی:

مدیریت فرم‌ها در ری‌ اکت می‌تواند چالش‌برانگیز باشد، به ویژه وقتی که با فرم‌های پیچیده و نیاز به اعتبارسنجی دقیق مواجه می‌شوید. خوشبختانه ابزارهایی مانند Formik، React Hook Form و Yup امکانات فراوانی برای ساده‌سازی این فرآیند فراهم کرده‌اند. از طرفی، برای پروژه‌های ساده‌تر می‌توان از روش‌های داخلی مانند state و ref بهره برد، که علاوه بر کارایی خوب، پیچیدگی کمتری دارند. استفاده از این ابزارها به توسعه‌دهندگان ری‌ اکت این امکان را می‌دهد که فرم‌های پیچیده را به‌راحتی مدیریت کرده و تجربه کاربری بهتری را برای کاربران ایجاد کنند. در نهایت، انتخاب بهترین روش یا کتابخانه بستگی به نیازهای پروژه شما دارد، اما ابزارهایی که در این مقاله معرفی شدند، بدون شک راه‌حل‌های قدرتمند و کاربردی برای هر پروژه‌ای خواهند بود.

 

مطالعه بیشتر در رفرنس های خارجی:

React Form (react.dev)

React Forms (reactjs.org)

React Forms (w3schools.com)

React Hook Form (react-hook-form.com)

Formik (formik.org)

Yup (npmjs.com)

لیست کامل مقالات ” ری اکت ” ویکس سِوِن در لینک زیر :

ری اکت چیست؟