سلام دوستان 👋 توی این قسمت می‌خوایم موضوعی رو بررسی کنیم که هم توی ری‌اکت کاربرد زیادی داره و هم پای ثابت بیشتر سوالات مصاحبه‌ای هست. می‌خوایم ببینیم که کامپوننت‌های Controlled و Uncontrolled چی هستن و چه کاربردهایی دارن. این پست از مجموعه پست‌های ری‌اکت ۱۰۱ هست.

 

کامپوننت‌های Controlled و Uncontrolled یعنی چی؟ 🤔

این دو مفهوم توی مبحث فرم‌ها و نحوهٔ مدیریت کردن اطلاعات یک فرم توی یک کامپوننت ری‌اکتی مطرح میشه. در واقع یک فرم توی ری‌اکت به دو شکل می‌تونه مدیریت بشه: Controlled و Uncontrolled. که توی ادامه می‌خوایم با این روش‌ها آشنا بشیم و مزایا و معایب هر کدوم رو بررسی کنیم.

 

کامپوننت Controlled

به یک کامپوننت می‌گیم Controlled زمانی که خود ری‌اکت مسئول کنترل و مدیریت اطلاعات فرم باشه. که این کار توسط هوک useState اتفاق می‌افته. یعنی مقدار یک <input> توی useState نگهداری میشه. و هر تغییری که توی <input> رخ میده، یک کال‌بک فانکشن رو فراخونی می‌کنه:

import React, { useState } from 'react';

function ControlledForm() {
  const [value, setValue] = useState('');

  const handleChange = (event) => {
    setValue(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log('Submitted value:', value);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" value={value} onChange={handleChange} />
      <button type="submit">Submit</button>
    </form>
  );
}

توی کد بالا مقدار المنت <input> داره مستقیماً از useState خونده میشه. و با تغییر این ورودی، setValue خط ۷ صدا زده میشه تا مقدار استـیت بروزرسانی بشه. اگه کد خط ۷ رو ننویسیم، مقدار استیت بروزرسانی نمیشه و در نتیجه مقدار ورودی تغییر نمی‌کنه. به این روش مدیریت فرم گفته میشه Controlled. توی این روش، فقط ری‌اکت مسئول کنترل اتفاقات فرم به حساب میاد. این روش مزایا و معایبی داره که توی ادامه اونها رو بررسی می‌کنیم.

 

کامپوننت Uncontrolled

توی این روش اطلاعات یک فرم دیگه توسط ری‌اکت و هوک useState مدیریت نمیشه. بلکه ما اون‌ها رو بصورت دستی و با استفاده از روش‌هایی که توی DOM داریم مدیریت می‌کنیم. توی این روش معمولاً از هوک useRef استفاده میشه برای کار با DOM:

import React, { useRef } from 'react';

function UncontrolledForm() {
  const inputRef = useRef(null);

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log('Submitted value:', inputRef.current.value);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" ref={inputRef} />
      <button type="submit">Submit</button>
    </form>
  );
}

توی کد بالا، ورودی خط ۱۳ مثل یک المنت معمولی هست که ری‌اکت هیچ دخالتی توی مقدار و نحوهٔ بروزرسانی اون نداره. برای اینکه به این المنت دسترسی داشته باشیم، می‌تونیم از استفاده کنیم (گرچه می‌شد از هم استفاده کنیم. اما این روشی ساده‌تر به حساب میاد.) و به شکل خط ۸ می‌تونیم به مقدار ورودی دسترسی داشته باشیم.