فهرست سرفصل‌های React
خانه (Home) مقدمه (Intro) شروع کار (Get Started) اولین اپ (First App) رندر HTML (Render HTML) ارتقا (Upgrade) آشنایی با ES6 (ES6) کلاس ها در ES6 (ES6 Classes) توابع پیکانی ES6 (ES6 Arrow Functions) متغیرها در ES6 (ES6 Variables) متد map روی آرایه ها (ES6 Array map()) دیس ترکچرینگ (تقسیم ساختاری) (ES6 Destructuring) عملگر پخش (Spread) (ES6 Spread Operator) ماژول ها در ES6 (ES6 Modules) عملگر سه تایی (Ternary) (ES6 Ternary Operator) رشته های قالبی (Template Strings) (ES6 Template Strings) مقدمه JSX (JSX Intro) عبارت ها در JSX (JSX Expressions) خصیصه ها در JSX (JSX Attributes) شرط ها در JSX (JSX If Statements) کامپوننت ها (Components) کلاس ها (Class) پراپس ها (Props) (Props) دیس ترکچرینگ پراپس ها (Props Destructuring) پراپس children (Props Children) رویدادها (Events) رندر شرطی (Conditionals) لیست ها (Lists) فرم ها (Forms) ارسال فرم (Forms Submit) فیلد Textarea (Textarea) فیلد Select (Select) چند ورودی در فرم (Multiple Inputs) چک باکس (Checkbox) دکمه های رادیویی (Radio) پورتال ها (Portals) Suspense (Suspense) استایل دهی با CSS (CSS Styling) CSS Modules (CSS Modules) CSS-in-JS (CSS-in-JS) مسیریابی (Router) (Router) ترنزیشن ها (Transitions) (Transitions) Forward Ref (Forward Ref) کامپوننت های مرتبه بالاتر (HOC) (HOC) استایل دهی با Sass (Sass) هوکس چیست؟ (What is Hooks?) هوک useState (useState) هوک useEffect (useEffect) هوک useContext (useContext) هوک useRef (useRef) هوک useReducer (useReducer) هوک useCallback (useCallback) هوک useMemo (useMemo) هوک های سفارشی (Custom Hooks) کامپایلر (Compiler) کوئیز (آزمون کوتاه) (Quiz) تمرین ها (Exercises) سیلابس (سرفصل دوره) (Syllabus) برنامه مطالعه (Study Plan) سرور (Server) آمادگی مصاحبه (Interview Prep) گواهینامه (Certificate)
نتیجه‌ای برای جستجو یافت نشد.
React

React — چند ورودی در فرم (Multiple Inputs)

آخرین بروزرسانی: 1404/08/24

چند ورودی در فرم (Multiple Inputs)

گاهی فرم ما فقط یک ورودی نیست؛ چند ورودی در فرم داریم؛ مثل نام، نام خانوادگی، شماره دانش آموزی. در React بهتر است همه این ورودی ها را مرتب و کنترل شده مدیریت کنیم تا فرم مثل یک بازی منظم رفتار کند.

مدیریت چند ورودی در فرم با یک state

در فرم های React، هر ورودی یک input کنترل شده است؛ یعنی مقدار input را state نگه می دارد. برای چند ورودی در فرم دو راه داریم: چند useState جدا یا یک useState که یک شیء از همه فیلدها نگه دارد.

روش معمول تر برای فرم های جدی، استفاده از یک state شیء است. کافی است برای هر input یک name یکتا بگذاری و مقدارش را بر اساس همان name داخل شیء ذخیره کنی.

اگر مفهوم فرم کنترل شده را یادت رفته، پیشنهاد می کنم یک نگاه به صفحه فرم ها در React بیندازی تا روند کلی کار فرم ها برایت تازه شود.

نمونه کامل چند ورودی در فرم

در این مثال، فرم دو ورودی دارد: firstname و lastname. هر دو در یک state به نام inputs نگه داشته می شوند و با یک تابع handleChange مدیریت می شوند.

import { useState } from 'react';
import { createRoot } from 'react-dom/client';

function MyForm() {
  const [inputs, setInputs] = useState({});

  function handleChange(e) {
    const name = e.target.name;
    const value = e.target.value;
    setInputs((values) => ({
      ...values,
      [name]: value
    }));
  }

  return (
    <form>
      <label>
        First name:
        <input
          type="text"
          name="firstname"
          value={inputs.firstname}
          onChange={handleChange}
        />
      </label>
      <label>
        Last name:
        <input
          type="text"
          name="lastname"
          value={inputs.lastname}
          onChange={handleChange}
        />
      </label>
      <p>
        Current values: {inputs.firstname} {inputs.lastname}
      </p>
    </form>
  );
}

createRoot(document.getElementById('root')).render(
  <MyForm />
);

مشاهده در ادیتور

در اینجا هر input با name خودش شناخته می شود. تابع handleChange تشخیص می دهد کدام فیلد عوض شده و فقط همان کلید را در شیء inputs به روز می کند.

ساخت state شیء برای چند ورودی در فرم

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

const [inputs, setInputs] = useState({});

مشاهده در ادیتور

اینجا inputs یک شیء است که بعداً کلیدهایی مثل firstname و lastname روی آن اضافه می شود. setInputs هم همان تابعی است که این شیء را تغییر می دهد.

تابع handleChange و به روزرسانی چند ورودی

در رویداد onChange هر input، تابع handleChange صدا زده می شود. این تابع از روی e.target.name می فهمد کدام فیلد بوده و از e.target.value مقدار جدید را می گیرد.

function handleChange(e) {
  const name = e.target.name;
  const value = e.target.value;
  setInputs((values) => ({
    ...values,
    [name]: value
  }));
}

مشاهده در ادیتور

عملگر ... یا Spread Operator یعنی «همه کلیدهای قبلی را نگه دار». سپس با [name]: value همان فیلد تغییر کرده را روی شیء inputs به روز می کنیم.

بایند کردن ورودی ها به شیء inputs

برای اینکه ورودی ها واقعاً کنترل شده باشند، value آن ها را از شیء inputs می خوانیم و onChange را به handleChange وصل می کنیم.

<input
  type="text"
  name="firstname"
  value={inputs.firstname}
  onChange={handleChange}
/>
<input
  type="text"
  name="lastname"
  value={inputs.lastname}
  onChange={handleChange}
/>
<p>
  Current values: {inputs.firstname} {inputs.lastname}
</p>

مشاهده در ادیتور

الان هر تغییری در input ها مستقیم وارد state می شود و React همیشه آخرین مقدار هر فیلد را می داند؛ مثل لیست حضور و غیاب که همیشه به روز است.

مقداردهی اولیه برای چند ورودی در فرم

گاهی می خواهی فرم با داده های اولیه پر شود؛ مثلاً فرم ویرایش پروفایل. در این حالت به جای شیء خالی، شیء inputs را با کلیدها و مقدارهای پیش فرض می سازیم.

function MyForm() {
  const [inputs, setInputs] = useState({
    firstname: 'John',
    lastname: 'Doe'
  });

  ...
}

مشاهده در ادیتور

با این کار، وقتی فرم برای اولین بار رندر می شود، مقدار input ها همان firstname و lastname پیش فرض است. بقیه منطق handleChange دقیقاً مثل قبل کار می کند.

اگر فرم تو فیلد Select یا Textarea هم دارد، می توانی از الگوهای فیلد Select در React و فیلد Textarea در React استفاده کنی و آن ها را هم داخل همین شیء inputs مدیریت کنی.

هر وقت خواستی دوباره مبحث چند ورودی در فرم را مرور کنی، به همین صفحه برگرد؛ اینجا الگوی اصلی فرم های چندفیلدی را داری.

جمع بندی سریع چند ورودی در فرم

  • برای چند ورودی در فرم از یک useState شیء استفاده کن.
  • هر input باید name یکتای خودش را داشته باشد.
  • تابع handleChange با name تشخیص می دهد کدام فیلد تغییر کرده است.
  • با Spread Operator بقیه فیلدها را دست نخورده نگه دار.
  • برای مقدار اولیه، همان کلیدها را در شیء useState تنظیم کن.