{"componentChunkName":"component---src-templates-docs-js","path":"/docs/forwarding-refs.html","result":{"data":{"markdownRemark":{"html":"<p>ref فوروارد کردن یک تکنیک برای ارسال خودکار یک  <a href=\"/docs/refs-and-the-dom.html\">ref</a> از طریق یک کامپوننت به فرزندانش می‌باشد. این کار معمولا برای بسیاری از کامپوننت‌ها در اپلیکیشن لازم نیست. به هر حال، در بعضی از کامپوننت‌ها، به خصوص در کامپوننت‌های کتابخانه‌ای با قابلیت استفاده مجدد می‌تواند مفید باشد. رایج‌ترین حالات ممکن در ادامه شرح داده شده‌اند.</p>\n<h2 id=\"forwarding-refs-to-dom-components\"><a href=\"#forwarding-refs-to-dom-components\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>فوروارد کردن ref ها به کامپوننت‌های DOM </h2>\n<p>یک کامپوننت <code class=\"gatsby-code-text\">FancyButton</code> که المنت محلی <code class=\"gatsby-code-text\">button</code> در DOM را رندر می‌کند در نظر بگیرید:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">function</span> <span class=\"token function\">FancyButton</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>FancyButton<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n        </div></p>\n<p>کامپوننت‌های ری‌اکت جزئیات پیاده سازی، شامل خروجی رندر شده خود را پنهان می‌کنند. کامپوننت‌های دیگر که از <code class=\"gatsby-code-text\">FancyButton</code> استفاده می‌کنند، معمولا به <a href=\"/docs/refs-and-the-dom.html\">بدست آوردن یک ref</a> به المنت DOM <code class=\"gatsby-code-text\">button</code> داخلی <strong>نیازی نخواهند داشت</strong> و این به علت جلوگیری از تکیه بیش از اندازه کامپوننت‌ها به ساختار DOM یک‌دیگر خوب است.</p>\n<p>اگرچه چنین کپسوله‌سازی برای کامپوننت‌هایی در سطح اپ مانند <code class=\"gatsby-code-text\">FeedStory</code> یا <code class=\"gatsby-code-text\">Comment</code> مطلوب است، برای کامپوننت‌های کوچک که قابلیت استفاده مجدد بسیار زیادی دارند مانند <code class=\"gatsby-code-text\">FancyButton</code> یا <code class=\"gatsby-code-text\">MyTextInput</code> نامناسب می‌باشد. این کامپوننت‌ها میل به استفاده شدن در اپ به یک شیوه مشابه به عنوان یک <code class=\"gatsby-code-text\">button</code> و <code class=\"gatsby-code-text\">input</code> معمولی DOM دارند و دسترسی به نودهای DOM آن ها برای مدیریت انیمیشن‌ها، focus و selection ممکن است اجتناب ناپذیر باشد.</p>\n<p><strong>فوروارد کردن ref یک قابلیت انتخابی است که به بعضی کامپوننت ها اجازه گرفتن یک <code class=\"gatsby-code-text\">ref</code> و انتقال آن به فرزندان (به عبارت دیگر, “فوروارد کردن” آن) را می‌دهد.</strong></p>\n<p>در مثال زیر، <code class=\"gatsby-code-text\">FancyButton</code> از <code class=\"gatsby-code-text\">React.forwardRef</code> برای گرفتن <code class=\"gatsby-code-text\">ref</code> که به آن منتقل شده استفاده می‌کند، و سپس آن را به <code class=\"gatsby-code-text\">button</code> DOM که رندر می‌کند فوروارد می‌کند.</p>\n<p><div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> FancyButton <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">forwardRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props<span class=\"token punctuation\">,</span> ref</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">ref</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>FancyButton<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">    </span><span class=\"token punctuation\">{</span>props<span class=\"token punctuation\">.</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// You can now get a ref directly to the DOM button:</span>\n<span class=\"token keyword\">const</span> ref <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">FancyButton</span></span> <span class=\"token attr-name\">ref</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Click me!</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">FancyButton</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span></code></pre>\n        </div></p>\n<p>با این روش، کامپوننت‌هایی که از <code class=\"gatsby-code-text\">FancyButton</code> استفاده می‌کنند، می‌توانند یک ref به نود <code class=\"gatsby-code-text\">button</code> در DOM بگیرند و در صورت نیاز، به همان شکلی که از یک <code class=\"gatsby-code-text\">button</code> در DOM مستقیما استفاده می کنند، از این کامپوننت نیز بهره ببرند.</p>\n<p>در زیر، یک توضیح مرحله به مرحله از آن‌چه در مثال بالا اتفاق افتاده است را مشاهده می‌نمایید:</p>\n<ol>\n<li>ما با فراخوانی <code class=\"gatsby-code-text\">React.createRef</code> و اختصاص آن به متغیر <code class=\"gatsby-code-text\">ref</code> یک <a href=\"/docs/refs-and-the-dom.html\">ref ری‌اکت</a> ایجاد می‌کنیم.</li>\n<li>با مشخص کردن <code class=\"gatsby-code-text\">ref</code> به عنوان یک خصوصیت JSX، آن را به <code class=\"gatsby-code-text\">&lt;FancyButton ref={ref}&gt;</code> منتقل می‌کنیم.</li>\n<li>ری‌اکت آن <code class=\"gatsby-code-text\">ref</code> را به عنوان آرگومان دوم تابع <code class=\"gatsby-code-text\">(props, ref) =&gt; ...</code> درون <code class=\"gatsby-code-text\">forwardRef</code> پاس می‌دهد.</li>\n<li>ما این آرگومان <code class=\"gatsby-code-text\">ref</code> را با تعیین کردن آن به عنوان یک خصوصیت JSX به <code class=\"gatsby-code-text\">&lt;button ref={ref}&gt;</code> فوروارد می‌کنیم.</li>\n<li>وقتی که ref متصل شده‌است، <code class=\"gatsby-code-text\">ref.current</code> به نود <code class=\"gatsby-code-text\">&lt;button&gt;</code> در DOM اشاره می‌کند.</li>\n</ol>\n<blockquote>\n<p>نکته</p>\n<p>آرگومان دوم <code class=\"gatsby-code-text\">ref</code> فقط زمانی که یک کامپوننت را با <code class=\"gatsby-code-text\">React.forwardRef</code> فراخوانی کنید موجود است. کامپوننت‌های تابعی و بر پایه کلاس معمولی،  آرگومان <code class=\"gatsby-code-text\">ref</code> را دریافت نمی‌کنند و ref در props نیز در دسترس نمی‌باشد.</p>\n<p>فوروارد کردن ref محدود به کامپوننت‌های DOM نیست. شما می‌توانید ref ها را به instance های کامپوننت‌های بر پایه کلاس نیز فوروارد کنید.</p>\n</blockquote>\n<h2 id=\"note-for-component-library-maintainers\"><a href=\"#note-for-component-library-maintainers\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>نکته برای نگهدارندگان کتابخانه کامپوننت‌ها </h2>\n<p><strong>زمانی که شما شروع به استفاده از <code class=\"gatsby-code-text\">forwardRef</code> در کامپوننت یک کتابخانه می‌کنید، باید به عنوان یک تغییر مخرب با آن رفتار کنید و یک ورژن major جدید از کتابخانه خود منتشر نمایید.</strong> به این علت که کتابخانه شما، یک رفتار متفاوت قابل توجه (مانند چیزی که ref به آن تخصیص داده شده و چه type هایی export شده‌اند) خواهد داشت و باعث تخریب برنامه‌ها و کتابخانه‌های دیگر که به رفتار قدیمی وابسته هستند می‌شود.</p>\n<p>استفاده از <code class=\"gatsby-code-text\">React.forwardRef</code> مشروط به این‌که وجود داشته‌باشد نیز به دلیل یکسان پیشنهاد نمی‌شود: چرا که چگونگی رفتار کتابخانه شما را تغییر می دهد و برنامه کاربرانتان را زمانی که ری‌اکت خود را ارتقا می‌دهد خراب می‌کند.</p>\n<h2 id=\"forwarding-refs-in-higher-order-components\"><a href=\"#forwarding-refs-in-higher-order-components\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>فوروارد کردن ref ها در کامپوننت‌های مرتبه بالاتر </h2>\n<p>این تکنیک در <a href=\"/docs/higher-order-components.html\">کامپوننت های مرتبه بالاتر</a> (شناخته شده به نام HOC ها) نیز، می تواند مفید باشد. بیایید با یک مثال از HOC که prop های کامپوننت را در کنسول، نمایش می‌دهد شروع کنیم:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">function</span> <span class=\"token function\">logProps</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">WrappedComponent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span>  <span class=\"token keyword\">class</span> <span class=\"token class-name\">LogProps</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">componentDidUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">prevProps</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'old props:'</span><span class=\"token punctuation\">,</span> prevProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'new props:'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">WrappedComponent</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">this</span><span class=\"token punctuation\">.</span><span class=\"token attr-value\">props</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span></span>    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> LogProps<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n        </div></p>\n<p>کامپوننت مرتبه بالاتر “logProps” کل <code class=\"gatsby-code-text\">props</code> را به کامپوننتی که پوشش داده‌است منتقل می‌کند، بنابراین خروجی رندر شده یکسان خواهد بود. برای مثال، می‌توانیم از این HOC برای مشاهده تمامی prop هایی که به کامپوننت “fancy button” ما منتقل شده‌است استفاده کنیم:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">class</span> <span class=\"token class-name\">FancyButton</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">focus</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// ...</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Rather than exporting FancyButton, we export LogProps.</span>\n<span class=\"token comment\">// It will render a FancyButton though.</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token function\">logProps</span><span class=\"token punctuation\">(</span>FancyButton<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre>\n        </div></p>\n<p>فقط یک اخطار در مورد مثال بالا وجود دارد: ref ها منتقل نمی‌شوند. به علت اینکه <code class=\"gatsby-code-text\">ref</code> یک prop نیست. مانند <code class=\"gatsby-code-text\">key</code>، توسط ری‌اکت به شکل متفاوتی کنترل می‌شود. اگر شما یک ref به HOC اضافه کنید، ref به جای کامپوننت دربر گیرنده، به بیرونی ترین کامپوننت پوشاننده (container) اشاره می کند.\nاین به این معناست که ref تعیین شده برای <code class=\"gatsby-code-text\">FancyButton</code>، در اصل به کامپوننت <code class=\"gatsby-code-text\">LogProps</code> متصل خواهد شد:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">import</span> FancyButton <span class=\"token keyword\">from</span> <span class=\"token string\">'./FancyButton'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> ref <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token comment\">// The FancyButton component we imported is the LogProps HOC.</span>\n<span class=\"token comment\">// Even though the rendered output will be the same,</span>\n<span class=\"token comment\">// Our ref will point to LogProps instead of the inner FancyButton component!</span>\n<span class=\"token comment\">// This means we can't call e.g. ref.current.focus()</span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">FancyButton</span></span>\n  <span class=\"token attr-name\">label</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Click Me<span class=\"token punctuation\">\"</span></span>\n  <span class=\"token attr-name\">handleClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>handleClick<span class=\"token punctuation\">}</span></span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token attr-name\">ref</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span></span><span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span></code></pre>\n        </div></p>\n<p>خوشبختانه، با استفاده از API های <code class=\"gatsby-code-text\">React.forwardRef</code>، می توانیم به طور صریح ref ها را به کامپوننت داخلی <code class=\"gatsby-code-text\">FancyButton</code> فوروارد کنیم. <code class=\"gatsby-code-text\">React.forwardRef</code> یک تابع رندر که پارامترهای  <code class=\"gatsby-code-text\">props</code> و <code class=\"gatsby-code-text\">ref</code> را دریافت می‌کند و یک نود ری‌اکت را به عنوان خروجی می‌دهد را می‌پذیرد. برای مثال:\n<div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">function</span> <span class=\"token function\">logProps</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">Component</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">class</span> <span class=\"token class-name\">LogProps</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">componentDidUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">prevProps</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'old props:'</span><span class=\"token punctuation\">,</span> prevProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'new props:'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span>forwardedRef<span class=\"token punctuation\">,</span> <span class=\"token operator\">...</span>rest<span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span></span>\n      <span class=\"token comment\">// Assign the custom prop \"forwardedRef\" as a ref</span>\n<span class=\"gatsby-highlight-code-line\">      <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Component</span></span> <span class=\"token attr-name\">ref</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>forwardedRef<span class=\"token punctuation\">}</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">rest</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span></span>    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// Note the second param \"ref\" provided by React.forwardRef.</span>\n  <span class=\"token comment\">// We can pass it along to LogProps as a regular prop, e.g. \"forwardedRef\"</span>\n  <span class=\"token comment\">// And it can then be attached to the Component.</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">return</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">forwardRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props<span class=\"token punctuation\">,</span> ref</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">LogProps</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">props</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">forwardedRef</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span><span class=\"token punctuation\">}</span></code></pre>\n        </div></p>\n<h2 id=\"displaying-a-custom-name-in-devtools\"><a href=\"#displaying-a-custom-name-in-devtools\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>نمایش یک نام سفارشی در DevTools </h2>\n<p><code class=\"gatsby-code-text\">React.forwardRef</code> یک تابع رندر می‌پذیرد. React DevTools از این تابع برای بررسی اینکه چه چیزی را برای کامپوننت ref forwarding نمایش دهد استفاده می‌کند.</p>\n<p>برای مثال، کامپوننت زیر به عنوان ”<em>ForwardRef</em>” در DevTools ظاهر می‌شود:</p>\n<p><div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">const</span> WrappedComponent <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">forwardRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props<span class=\"token punctuation\">,</span> ref</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">LogProps</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">props</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">forwardedRef</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n        </div></p>\n<p>اگر شما تابع رندر را نامگذاری کنید، DevTools نام آن‌را نیز به‌کار می‌برد. (برای مثال  ”<em>ForwardRef(myFunction)</em>”):</p>\n<p><div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">const</span> WrappedComponent <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">forwardRef</span><span class=\"token punctuation\">(</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">myFunction</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props<span class=\"token punctuation\">,</span> ref</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">LogProps</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">props</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">forwardedRef</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre>\n        </div></p>\n<p>شما حتی می‌توانید ویژگی <code class=\"gatsby-code-text\">displayName</code> تابع را تنظیم کنید تا کامپوننتی که پوشش می‌دهید را شامل شود:</p>\n<p><div class=\"gatsby-highlight\">\n        <pre class=\"gatsby-code-jsx\"><code><span class=\"token keyword\">function</span> <span class=\"token function\">logProps</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">Component</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">class</span> <span class=\"token class-name\">LogProps</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">React<span class=\"token punctuation\">.</span>Component</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">function</span> <span class=\"token function\">forwardRef</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props<span class=\"token punctuation\">,</span> ref</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">LogProps</span></span> <span class=\"token spread\"><span class=\"token punctuation\">{</span><span class=\"token punctuation\">...</span><span class=\"token attr-value\">props</span><span class=\"token punctuation\">}</span></span> <span class=\"token attr-name\">forwardedRef</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// Give this component a more helpful display name in DevTools.</span>\n  <span class=\"token comment\">// e.g. \"ForwardRef(logProps(MyComponent))\"</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> name <span class=\"token operator\">=</span> Component<span class=\"token punctuation\">.</span>displayName <span class=\"token operator\">||</span> Component<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">  forwardRef<span class=\"token punctuation\">.</span>displayName <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">logProps(</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">)</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span></span>\n  <span class=\"token keyword\">return</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">forwardRef</span><span class=\"token punctuation\">(</span>forwardRef<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre>\n        </div></p>","frontmatter":{"title":"فوروارد کردن ref ها","next":null,"prev":null},"fields":{"path":"content/docs/forwarding-refs.md","slug":"docs/forwarding-refs.html"}}},"pageContext":{"slug":"docs/forwarding-refs.html"}},"staticQueryHashes":[]}