diff --git a/content/docs/hooks-intro.md b/content/docs/hooks-intro.md index b4cefcfbe..f35324f4d 100644 --- a/content/docs/hooks-intro.md +++ b/content/docs/hooks-intro.md @@ -1,11 +1,11 @@ --- id: hooks-intro -title: Introducing Hooks +title: معرفی هوکها permalink: docs/hooks-intro.html next: hooks-overview.html --- -*Hooks* are a new addition in React 16.8. They let you use state and other React features without writing a class. +
Hookها قابلیتی جدید در React 16.8 هستند. آنها امکان استفاده از state و دیگر قابلیتهای react را بدون نیاز به نوشتن کلاس به شما میدهند.
```js{4,5} import React, { useState } from 'react'; @@ -25,88 +25,102 @@ function Example() { } ``` -This new function `useState` is the first "Hook" we'll learn about, but this example is just a teaser. Don't worry if it doesn't make sense yet! +تابع جدید useState اولین «Hook»ای است که یاد میگیریم، البته این مثال تنها یک نمایش اجمالی است. در صورتی که آن را در نیافتید نگران نباشید!
شما میتوانید برای شروع یادگیری Hookها از صفحهی بعد شروع کنید. +در این صفحه، ما به ذکر دلایلمان برای افزودن هوکها به react و اینکه آنها چگونه میتوانند به شما کمک کنند تا برنامههای خوبی بنویسید، میپردازیم.
-## Video Introduction {#video-introduction} -At React Conf 2018, Sophie Alpert and Dan Abramov introduced Hooks, followed by Ryan Florence demonstrating how to refactor an application to use them. Watch the video here: ++-نکته
+ریاکت ۱۶.۸.۰ اولین نسخه منتشر شده است که از هوکها پشتیبانی میکند. هنگام ارتقاع، فراموش نکنید همهی پکیجها شامل React DOM را آپدیت نمایید. React Native در نسخهی بعدی پایدار از هوکها پشتیبانی خواهد کرد.
+
در کنفرانس ۲۰۱۸ react، سوفیا آلپرت(Sophie Alpert) و دن آبرامف(Dan Abramov) هوکها را معرفی کردند. بعد از آن رایان فلورنس (Ryan Florence) نشان داد که چگونه میتوان به منظور استفاده از آنها[هوکها] یک اپلیکیشن را بازنویسی(refactor) کرد. ویدیوی زیر را ببینید:
-Before we continue, note that Hooks are: - -* **Completely opt-in.** You can try Hooks in a few components without rewriting any existing code. But you don't have to learn or use Hooks right now if you don't want to. -* **100% backwards-compatible.** Hooks don't contain any breaking changes. -* **Available now.** Hooks are now available with the release of v16.8.0. +قبل از اینکه ادامه دهیم، توجه کنید که هوکها:
-## Motivation {#motivation} +هیچ برنامهای برای حذف کلاسها از ریاکت وجود ندارد. شما میتوانید برای مطالعهی بیشتر در رابطه با راهکارهای تطبیق تدریجی با هوکها از بخش پایین همین صفحه استفاده کنید.
-### It's hard to reuse stateful logic between components {#its-hard-to-reuse-stateful-logic-between-components} +هوکها جایگزینی برای دانش و فهم شما از ریاکت نیستند. در عوض، هوکها یک رابط برنامهی کاربردی (API) صریحتر برای مفاهیم ریاکتی که از قبل میدانید فراهم میکنند: props ،state ،context ،ref و lifecycle. همانطور که بعدا نشان خواهیم داد، هوکها روشی جدید و قدرتمند برای تلفیق آنها ارائه میکنند.
-React doesn't offer a way to "attach" reusable behavior to a component (for example, connecting it to a store). If you've worked with React for a while, you may be familiar with patterns like [render props](/docs/render-props.html) and [higher-order components](/docs/higher-order-components.html) that try to solve this. But these patterns require you to restructure your components when you use them, which can be cumbersome and make code harder to follow. If you look at a typical React application in React DevTools, you will likely find a "wrapper hell" of components surrounded by layers of providers, consumers, higher-order components, render props, and other abstractions. While we could [filter them out in DevTools](https://github.com/facebook/react-devtools/pull/503), this points to a deeper underlying problem: React needs a better primitive for sharing stateful logic. +اگر هماکنون میخواهید یادگیری هوکها را شروع کنید، مستقیم به صفحهی بعد بروید! البته میتوانید مطالعهی این صفحه را ادامه دهید و با دلایلی که هوکها را به ریاکت اضافه کردیم و اینکه چگونه بدون بازنویسی اپلیکیشنهای قبلی از آنها استفاده خواهیم کرد، آشنا شوید.
-With Hooks, you can extract stateful logic from a component so it can be tested independently and reused. **Hooks allow you to reuse stateful logic without changing your component hierarchy.** This makes it easy to share Hooks among many components or with the community. +ریاکت راهی برای «اضافهکردن» یک رفتار قابل استفادهی مجدد یه یک کامپوننت را فراهم نمیکند (برای مثال اتصال به یک store). اگر شما مدتی با ریاکت کار کرده باشید، ممکن است با الگوهایی مانند render props و higher-order components آشنا باشید که سعی در حل این مسیله دارند. اما این الگوها شما را مجبور به تغییر ساختار مجدد کامپوننتتان هنگام استفاده از آنها میکنند، که این مسیله میتواند مایهی زحمت و سختتر شدن فهم کد باشد. اگر به یک اپلیکیشن ریاکت نوعی در React DevTools نگاه کنید، احتمالا با «wrapper hell»ای از کامپوننتها مواجه میشوید. کامپوننتهایی که با لایههایی از providerها، consumerها، HOCها، render props و دیگر کامپوننتهایی که به تجرید کمک میکنند، احاطه شدهاند. در حالی که ما میتوانیم آنها را در DevTools فیلتر کنیم، این [مشکل] به یک مسیلهی بنیادین اشاره دارد: ریاکت باید عناصری ابتدایی برای به اشتراک گذاری منطق دارای state فراهم کند.
-We've often had to maintain components that started out simple but grew into an unmanageable mess of stateful logic and side effects. Each lifecycle method often contains a mix of unrelated logic. For example, components might perform some data fetching in `componentDidMount` and `componentDidUpdate`. However, the same `componentDidMount` method might also contain some unrelated logic that sets up event listeners, with cleanup performed in `componentWillUnmount`. Mutually related code that changes together gets split apart, but completely unrelated code ends up combined in a single method. This makes it too easy to introduce bugs and inconsistencies. +با استفاده از هوکها، شما میتوانید بخش منطق دارای state را از یک کامپوننت استخراج کنید، بطوری که بطور مستقل بتواند مورد آزمایش و استفادهی مجدد قرار گیرد. هوک ها به شما اجازه میدهند که بدون ایجاد تغییر در سلسله مراتب کامپوننتهایتان، از منطق دارای state مجددا استفاده نمایید. این کار باعث تسهیل در به اشتراکگذاری هوکها بین کامپوننتهای مختلف یا بین جامعه[ی ریاکت] میشود.
-In many cases it's not possible to break these components into smaller ones because the stateful logic is all over the place. It's also difficult to test them. This is one of the reasons many people prefer to combine React with a separate state management library. However, that often introduces too much abstraction, requires you to jump between different files, and makes reusing components more difficult. +ما در این رابطه بیشتر در هوک مخصوص خود را بسازید بحث خواهیم کرد.
-To solve this, **Hooks let you split one component into smaller functions based on what pieces are related (such as setting up a subscription or fetching data)**, rather than forcing a split based on lifecycle methods. You may also opt into managing the component's local state with a reducer to make it more predictable. +ما معمولا مجبور به نگهداری از کامپوننتهایی بودیم که در بدو شروع ساده بودند اما تبدیل به یک وضع آشفتهی غیرقابل مهار از منطقهای دارای state و side effectها شدند. هر lifecycle متشکل از مخلوطی از منطقهای غیر مرتبط است. برای مثال، یک کامپوننت ممکن است درcomponentDidMount و componentDidUpdate به دریافت داده بپردازد. درحالیکه همان تابع میتواند دارای منطقی غیر مرتبط باشد که به اضافه کردن event listenerها میپردازد، و در متد componentWillUnmount آنها [event listenerها] را پاکسازی (cleanup) میکند. کدهایی که متقابلا به هم مرتبط هستند [مثل اضافه و پاکسازی event listener] از یکدیگر جدا هستند، ولی کدهایی که کاملا غیر مرتبطاند [اضافه کردنevent listener و دریافت داده] در یک متد نوشته میشوند. که این احتمال خطا و باگ و ناسازگاری را بیشتر میکند.
در بسیاری از موارد امکان این وجود ندارد که بتوانیم این کامپوننتها را به اجزای کوچکتر تقسیم کنیم، زیرا منطق دارای state در همه جا وجود دارد. همچنین تست کردن آنها دشوار است. این یکی از دلایلی است که بسیاری از افراد ترجیح میدهند تا ریاکت را با یک کتابخانهی مدیریت state دیگری ترکیب کنند. اگرچه، معمولا باعث اضافهشدن مقدار زیادی تجرید میشود و شما را مجبور میکند بین تعداد زیادی از فایلها جابهجا شوید که خود باعث مشکلتر شدن استفادهی مجدد از کامپوننتها میگردد.
-In addition to making code reuse and code organization more difficult, we've found that classes can be a large barrier to learning React. You have to understand how `this` works in JavaScript, which is very different from how it works in most languages. You have to remember to bind the event handlers. Without unstable [syntax proposals](https://babeljs.io/docs/en/babel-plugin-transform-class-properties/), the code is very verbose. People can understand props, state, and top-down data flow perfectly well but still struggle with classes. The distinction between function and class components in React and when to use each one leads to disagreements even between experienced React developers. +برای حل این مسیله، هوکها به شما اجازه میدهند یک کامپوننت را به توابع کوچکتری تقسیم کنید که مبنای آن ارتباط اجزایشان است (مثلا اضافه کردن یک اشتراک (subscription) یا دریافت داده)، نه تقسیم بر اساس متدهای lifecycle. همچنین میتوانید برای مدیریت state محلی از یک reducer کمک بگیرید تا بیشتر مطابق با پیشبینی شما باشد.
-Additionally, React has been out for about five years, and we want to make sure it stays relevant in the next five years. As [Svelte](https://svelte.technology/), [Angular](https://angular.io/), [Glimmer](https://glimmerjs.com/), and others show, [ahead-of-time compilation](https://en.wikipedia.org/wiki/Ahead-of-time_compilation) of components has a lot of future potential. Especially if it's not limited to templates. Recently, we've been experimenting with [component folding](https://github.com/facebook/react/issues/7323) using [Prepack](https://prepack.io/), and we've seen promising early results. However, we found that class components can encourage unintentional patterns that make these optimizations fall back to a slower path. Classes present issues for today's tools, too. For example, classes don't minify very well, and they make hot reloading flaky and unreliable. We want to present an API that makes it more likely for code to stay on the optimizable path. +در این باره در +استفاده از Effect Hookبیشتر بحث خواهیم کرد.
-To solve these problems, **Hooks let you use more of React's features without classes.** Conceptually, React components have always been closer to functions. Hooks embrace functions, but without sacrificing the practical spirit of React. Hooks provide access to imperative escape hatches and don't require you to learn complex functional or reactive programming techniques. +علاوه بر دشوار کردن قابلیت استفاده مجدد از کد و نظم آن، دریافتیم که کلاسها میتوانند مانع بزرگی در یادگیری ریاکت باشند. شما باید یادبگیرید که this چگونه در جاوااسکریپت کار میکند، که با نحوهی کار کردش در اکثر زبانها بسیار متفاوت است. شما باید به یاد داشته باشید تا event handlerها را bind کنید. بدون syntax proposals، کد بسیار طولانی خواهد بود. آدمها میتوانند props، state، و جریان بالا به پایین داده را کاملا دریابند ولی هنوز با کلاسها کلنجار بروند. برتری کامپوننت از جنس تابع یا کلاس در ریاکت و موارد استفاده از آنها باعث اختلاف نظر است، حتی در میان دولوپرهای با تجربهی ریاکت.
بعلاوه، ریاکت ۵ سال است که عرضه شده است، و ما میخواهیم در ۵ سال آینده مطرح باشد. همانطور که Svelte، Angular،Glimmerو دیگران نشان میدهند، کامپایل پیش از موعد کامپوننتها، پتانسیل قابلیتهای زیادی را دارد. بالاخص اگر به تمپلتها مححدود نباشد. ما اخیرا با +component folding بوسیلهی Prepack آزمایشاتی را انجام دادیم که شاهد نتایج سریع و امیدوارکننده بودهایم. اگرچه دریافتیم که کامپوننتهای کلاسی میتوانند ناخواسته باعث افزایش الگوهایی شوند که چنین بهینهسازیهایی را بدتر میکنند. کلاسها برای ابزارهای امروزی نیز مشکلاتی ایجاد میکنند. برای مثال، کلاسها به خوبی کمحجم(minify) نمیشوند، آنها باعث میشوند تا hot reloading شکننده و نامطمئن شود. ما میخواهیم APIای را ارائه دهیم که به کد امکان بهینهسازی بیشتری بدهد.
->**TLDR: There are no plans to remove classes from React.** +برای حل این مشکلات، هوکها به شما اجازه میدهند تا از بیشتر قابلیتهای ریاکت بدون کلاسها بهره ببرید. مفهوما، همیشه کامپوننتهای ریاکت بیشتر به توابع نزدیکتر بودهاند. هوکها بدون آنکه روح کاربردی ریاکت را فداکند، توابع را شامل میشوند. هوکها امکان دسترسی به راههای فرار دستوری میدهند و شما را مجبور به یادگیری تکنیکهای پیچیدهی توابع یا برنامهنویسی ریاکتیو نمیکند.
-We know that React developers are focused on shipping products and don't have time to look into every new API that's being released. Hooks are very new, and it might be better to wait for more examples and tutorials before considering learning or adopting them. ++-We also understand that the bar for adding a new primitive to React is extremely high. For curious readers, we have prepared a [detailed RFC](https://github.com/reactjs/rfcs/pull/68) that dives into motivation with more details, and provides extra perspective on the specific design decisions and related prior art. +مثالها
+نگاه اجمالی به هوک نقطهی شروع مناسبی برای یادگیری Hookهاست.
+
+-Finally, there is no rush to migrate to Hooks. We recommend avoiding any "big rewrites", especially for existing, complex class components. It takes a bit of a mindshift to start "thinking in Hooks". In our experience, it's best to practice using Hooks in new and non-critical components first, and ensure that everybody on your team feels comfortable with them. After you give Hooks a try, please feel free to [send us feedback](https://github.com/facebook/react/issues/new), positive or negative. +خلاصه: هیچ برنامهای برای حذف کلاس ها از ریاکت وجود ندارد.
+
ما میدانیم که دولوپرهای ریاکت بر روی عرضهی محصولات تمرکز دارند و وقتی برای نگاه کردن و مطالعهی هر API جدیدی را که منتشر میشود، ندارند. هوکها بسیار جدید هستند، و شاید برای یادگیری و بهرهگیری از آنها بهتر باشد تا برای مثالها و آموزشهای بیشتر صبر کنید.
-We intend for Hooks to cover all existing use cases for classes, but **we will keep supporting class components for the foreseeable future.** At Facebook, we have tens of thousands of components written as classes, and we have absolutely no plans to rewrite them. Instead, we are starting to use Hooks in the new code side by side with classes. +همچنین اطلاع داریم که انتظارات برای اضافه کردن دستورات پایهی جدید به ریاکت بسیار بالاست. ما برای خوانندههای کنجکاو یک RFC با جزییات آماده کردهایم که با عمق بیشتری به انگیزهها میپردازد، و دید بیشتری بر تصصمیمات جزیی تصمیمگیریها و تصمیمات مرتبط قبلی فراهم میکند.
-## Frequently Asked Questions {#frequently-asked-questions} +اساسا، هوک ها در کنار کدهای نوشتهشده از قبل کار خواهند کرد، پس شما میتوانید بصورت تدریجی از آنها بهره گیرید. ما این API آزمایشی را برای این به اشتراک میگذاریم تا بتوانیم از بازخوردهای سریع افراد در جامعه که برای شکل دادن به آیندهی ریاکت مشتاق هستند بهره گیریم. — and we will iterate on Hooks in the open.
-We've prepared a [Hooks FAQ page](/docs/hooks-faq.html) that answers the most common questions about Hooks. +در انتها، هیچ عجلهای برای مهاجرت به هوکها وجود ندارد. ما پیشنهاد میکنیم از هرگونه «بازنویسی بزرگ» بپرهیزید، مخصوصا برای کامپوننتهای کلاسی موجود و پیچیده. برای «تفکر مبتنی بر هوکها» مقداری نیازمند تامل است. تجربهی ما این است که بهترین کار برای شروع، تمرین و کار با هوکها در کامپوننتهای جدید و غیرحیاتی است، و حصول اطمینان از اینکه همهی افراد تیم شما با آنها ارتباط برقرار کردهاند. بعد از اینکه هوکها را امتحان کردید، لطفا بازخوردهای خود را برای ما بفرستید ، چه مثبت و چه منفی.
-## Next Steps {#next-steps} +ما یک صفحه پرسش و پاسخ متداول از hookها فراهم کرده ایم که اکثر سوالات رایج در مورد هوکها را پاسخ میدهد.
\ No newline at end of file