ترکیب کامپوننت‌ها و دسترسی امری در React – استفاده از children و کنترل فوکوس با useRef

در React می‌توان کامپوننت‌ها را مانند عناصر HTML با تگ باز و بسته استفاده کرد. این مقاله نحوهٔ استفاده از پراپ children برای ترکیب کامپوننت‌ها، و نحوهٔ دسترسی امری به عناصر DOM با استفاده از useRef و useEffect را بررسی می‌کند. همچنین کامپوننت ورودی قابل استفاده مجدد را طوری بازطراحی می‌کنیم که هم به‌صورت declarative و هم imperative قابل کنترل باشد.

component compositionchildren propimperative focususeRef and useEffect

~2 min read · Updated Oct 22, 2025

مقدمه


اپلیکیشن‌های React از مجموعه‌ای از کامپوننت‌ها تشکیل شده‌اند که به‌صورت درختی سازمان‌دهی می‌شوند. اگرچه معمولاً کامپوننت‌ها را به‌صورت تگ بسته استفاده می‌کنیم، React اجازه می‌دهد از تگ باز و بسته استفاده کنیم — قابلیتی که به آن ترکیب کامپوننت‌ها گفته می‌شود.


استفاده از children برای ترکیب


به‌جای ارسال پراپ label، می‌توان محتوا را بین تگ‌های کامپوننت قرار داد:


<InputWithLabel ...>
  Search:
</InputWithLabel>

درون کامپوننت، این محتوا از طریق پراپ children قابل دسترسی است:


const InputWithLabel = ({ id, value, onInputChange, children }) => (
  <>
    <label htmlFor={id}>{children}</label>
     
    <input id={id} value={value} onChange={onInputChange} />
  
);

این روش امکان تزریق رشته، عناصر HTML یا حتی کامپوننت‌های React را فراهم می‌کند.


فوکوس declarative با autoFocus


برای فوکوس خودکار روی فیلد ورودی، می‌توان از ویژگی autoFocus استفاده کرد:


<input autoFocus />

برای کنترل این رفتار از بیرون، پراپ isFocused را تعریف می‌کنیم:


<InputWithLabel isFocused />

و درون کامپوننت از آن استفاده می‌کنیم:


<input autoFocus={isFocused} />

فوکوس امری با useRef


برای کنترل دقیق‌تر، می‌توان فوکوس را به‌صورت امری با useRef و useEffect انجام داد:


const inputRef = React.useRef();

React.useEffect(() => {
  if (isFocused && inputRef.current) {
    inputRef.current.focus();
  }
}, [isFocused]);

سپس ref را به عنصر ورودی متصل می‌کنیم:


<input ref={inputRef} ... />

مراحل گام‌به‌گام


  • (A) ایجاد ref با useRef
  • (B) اتصال ref به ویژگی ref عنصر ورودی
  • (C) استفاده از useEffect برای اجرای فوکوس هنگام تغییر isFocused
  • (D) دسترسی به عنصر DOM از طریق ref.current و اجرای focus()

جمع‌بندی


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


Written & researched by Dr. Shahin Siami

Related Articles

فرم‌ها در React – ارسال داده با onSubmit و action در فرم‌های جستجو

فرم‌ها بخش جدایی‌ناپذیر هر اپلیکیشن مدرن هستند. در این مقاله، نحوهٔ ساخت فرم جستجو در React را بررسی می‌کنیم. ابتدا از onSubmit برای مدیریت ارسال فرم استفاده می‌کنیم و سپس با معرفی ویژگی action، فرم را به رفتار بومی HTML نزدیک‌تر می‌کنیم. این ساختار باعث افزایش خوانایی، قابلیت استفاده با صفحه‌کلید، و آمادگی برای نسخه‌های آیندهٔ React می‌شود.

Continue

کتابخانه‌های شخص ثالث در React – استفاده از axios و async/await برای دریافت داده‌ها

در این مقاله، نحوهٔ جایگزینی fetch با کتابخانهٔ axios برای دریافت داده‌ها از API در React را بررسی می‌کنیم. سپس با استفاده از async/await و بلوک try/catch، کد دریافت داده‌ها را خواناتر و قابل مدیریت‌تر می‌کنیم. این روش‌ها باعث افزایش سازگاری با مرورگرهای قدیمی، بهبود تست‌پذیری، و کاهش پیچیدگی کد می‌شوند.

Continue

دریافت صریح داده‌ها در React – کنترل درخواست‌های API با دکمه تأیید

در پیاده‌سازی اولیه، هر بار که کاربر در فیلد جستجو تایپ می‌کرد، درخواست جدیدی به API ارسال می‌شد. این مقاله نحوهٔ تغییر این رفتار به دریافت صریح داده‌ها را آموزش می‌دهد؛ به‌طوری‌که فقط با کلیک روی دکمهٔ تأیید، درخواست به API ارسال شود. با تعریف دو وضعیت مجزا برای searchTerm و url، و استفاده از useCallback و useEffect، کنترل کامل بر زمان ارسال درخواست فراهم می‌شود.

Continue

وضعیت‌های غیرممکن در React – مدیریت پیش‌بینی‌پذیر وضعیت با useReducer

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

Continue

مدیریت پیشرفته وضعیت در React – استفاده از useReducer برای انتقال‌های پیچیده

در حالی که useState برای مدیریت وضعیت‌های ساده مناسب است، هوک useReducer در React راه‌حلی مقیاس‌پذیر برای مدیریت وضعیت‌های پیچیده و وابسته ارائه می‌دهد. این مقاله نحوهٔ مهاجرت وضعیت لیست داستان‌ها از useState به useReducer را بررسی می‌کند، و نشان می‌دهد چگونه با تعریف اکشن‌هایی مانند SET_STORIES و REMOVE_STORY می‌توان منطق وضعیت را به‌صورت متمرکز و خوانا مدیریت کرد.

Continue

رندر شرطی در React – نمایش وضعیت بارگذاری و خطا هنگام دریافت داده‌های غیرهمزمان

در React، رندر شرطی ابزاری قدرتمند برای کنترل نمایش رابط کاربری بر اساس وضعیت‌های مختلف است. این مقاله نحوهٔ نمایش پیام «در حال بارگذاری…» هنگام دریافت داده‌های غیرهمزمان، و پیام خطا در صورت شکست دریافت داده را بررسی می‌کند. با استفاده از useState و useEffect، وضعیت‌های isLoading و isError را مدیریت کرده و با استفاده از عملگرهای منطقی و ternary، رندر شرطی را پیاده‌سازی می‌کنیم.

Continue