برنامه نویسی

نکات مهم React برای Writing Cleaner، کد کارآمد برای مبتدیان

Summarize this content to 400 words in Persian Lang
به عنوان یک مبتدی در React، ممکن است احساس هیجان و همچنین غرق شدن کنید. React بسیار قدرتمند و یکی از محبوب ترین کتابخانه ها برای ساخت برنامه های وب پویا است. اما، اگر می‌خواهید از مزایای کامل React استفاده کنید، باید از بهترین روش‌ها پیروی کنید که کد شما را پاک‌تر، قابل نگهداری و بهینه‌تر می‌کند.

در این پست قصد داریم با برخی از مهم ترین نکات و ترفندهای واکنشی آشنا شویم که به شما کمک می کند تا از همان ابتدا کد بهینه سازی شده را بنویسید. با پیروی از این نکات می توانید از بسیاری از اشتباهات احمقانه ای که هنگام نوشتن کد مرتکب می شویم جلوگیری کنید و همچنین عادات کدنویسی خوبی ایجاد کنید که خوانایی، قابلیت نگهداری، قابلیت استفاده مجدد و همچنین مقیاس پذیری کد شما را بهبود می بخشد. بنابراین چه در حال طراحی اولین اپلیکیشن خود باشید و چه در react متخصص باشید، این نکات برای همه ارزشمند خواهد بود.

برای خوانایی بهتر اجزا را تجزیه کنید

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

به یک جزء بزرگ فکر کنید که نمایش داده های کاربر و ارسال فرم را مدیریت می کند. در عوض، اجزای جداگانه مانند UserInfo و UserForm. شما می توانید هر یک از آنها را بسیار ساده تر آزمایش / اشکال زدایی / استفاده مجدد کنید.

از useEffect هوشمندانه استفاده کنید

را useEffect hook یکی از قدرتمندترین ابزارهای React است، اما می‌تواند کمی مشکل نیز باشد. یکی از اشتباهاتی که مبتدیان مرتکب می شوند، ایجاد آن است رندرهای ناخواسته با مدیریت نکردن وابستگی های useEffectبه درستی از آرایه وابستگی برای اطلاع از زمان اجرای افکت استفاده کنید و با انتخاب وابستگی های مناسب به حلقه های بی پایان توجه کنید.

مثال:

تصور کنید در حال کار بر روی یک برنامه هواشناسی هستید که هر بار که مکان کاربر تغییر می کند، داده ها را واکشی می کند. با useEffect، می‌توانید یک آرایه وابستگی را ارسال کنید تا افکت فقط در صورت تغییر مکان، به جای اجرا شدن بعد از هر رندر، دوباره اجرا شود.

مدیریت useEffect وابستگی ها عملکرد را بهبود می بخشد و از برخی رفتارهای عجیب و غریب جلوگیری می کند.

آموزش استفاده از React DevTools

React DevTools یک ابزار عالی برای اشکال زدایی و بازرسی اجزا است. شما می توانید درخت کامپوننت را ببینید، پایه ها و حالت ها را بررسی کنید و بفهمید که چگونه اجزای خود به روز می شوند. اگر هنوز از آن استفاده نمی کنید، همین الان شروع کنید.

فرض کنید برنامه‌ای دارید که دارای سبد خرید است و متوجه می‌شوید که هر بار که چیزی را اضافه می‌کنید، کل جزء سبد خرید دوباره رندر می‌شود و همه چیز را کندتر می‌کند. من قصد دارم به شما بگویم که چگونه استفاده از React DevTools می تواند به شما در این زمینه کمک کند.

نحوه استفاده:

افزونه React DevTools را در مرورگر خود نصب کنید. این به شما امکان می‌دهد برگه Components را باز کنید و درخت مؤلفه یا تب Profiler را ببینید تا عملکرد رندر خود را ردیابی کنید. خوب بودن با این ابزار باعث صرفه جویی در وقت شما برای رفع اشکال برنامه می شود.

با DevTools اجزاء را مرور کنید و به ویژگی‌ها، وضعیت‌ها یا حتی چرخه عمر آنها نگاه کنید، اگر یک مؤلفه بیشتر از آنچه باید رندر شود، می‌توانیم از مواردی مانند React.memo، useCallback.

بهینه سازی با React.memo و از Callback استفاده کنید

برای دستیابی به عملکرد بهتر، React ابزارهایی مانند React.memoو useCallback برای جلوگیری از رندرهای غیر ضروری شما اجزای خود را با React.memo اگر کامپوننت نیازی به رندر مجدد نداشته باشد مگر اینکه اجزای ارسال شده به آن تغییر کنند یا توابع بسته بندی شده از مؤلفه والد با useCallback

مثال :

اگر در حال ساخت یک داشبورد با چندین نمودار و جدول داده هستید. هر زمان که داده‌های جدیدی وارد می‌شود، React ممکن است همه مؤلفه‌ها، از جمله مؤلفه‌هایی را که قرار نیست از داده‌های جدید استفاده کنند، دوباره رندر کند. می توانید هر جزء نمودار را با آن بپیچید React.memo و از رندرهای غیر ضروری خودداری کنید.

این بهینه‌سازی‌ها کمک می‌کنند تا اطمینان حاصل شود که برنامه شما واکنش‌گرا باقی می‌ماند، به‌ویژه در برنامه‌هایی با یک پایگاه کد بزرگ و یک رابط کاربری پیچیده (UI).

با استفاده از React.memo اینجا تضمین می کند که Chart فقط زمانی دوباره رندر می شود که data تغییرات پایه، پاسخگو نگه داشتن داشبورد.

پاکسازی افترافکت

هر زمان که از useEffect برای شنوندگان رویداد یا اشتراک‌ها استفاده می‌کنید، باید این کار را انجام دهید پاک کردن در اثر جلوگیری از نشت حافظه. React نه تنها شنوندگان/اشتراک را در هنگام رندر شدن کامپوننت اضافه می کند، بلکه در صورت جدا شدن کامپوننت، آنها را حذف می کند.

مثال:

تصور کنید در حال ساخت یک برنامه پیام رسانی هستید که در آن باید از طریق WebSocket به پیام های جدید گوش دهید. اگر شنونده WebSocket را پاکسازی نکنید، چندین نمونه به انباشته شدن ادامه می‌دهند که بر عملکرد برنامه و همچنین حافظه شما تأثیر می‌گذارد.

این برنامه شما را سریع نگه می دارد و مشکلات شنوندگان رویدادهای انباشته را کاهش می دهد.

از Destructuring برای Props استفاده کنید

تخریب اجزای سازنده در امضای تابع یا در داخل بدنه جزء روشی تمیز برای مدیریت قطعات است که کد شما را کوتاه‌تر و خواندن را بسیار آسان‌تر می‌کند.

تصور کنید که در حال ساخت یک صفحه پروفایل با یک UserProfile مؤلفه ای که چندین پروپوزال را دریافت می کند (مانند name، age، location). تخریب ساختار این ابزارها درست در امضای تابع، کد را مختصرتر و خواناتر می کند.

تخریب ساختار، خواندن و مدیریت اجزای شما را آسان‌تر می‌کند، به‌ویژه زمانی که از چندین قطعه استفاده می‌کنند.

از اجزای کنترل شده در فرم ها استفاده کنید

اجزای کنترل شده آنهایی هستند که داده های فرم توسط React (وضعیت جزء) مدیریت می شود. به عبارت ساده تر، ورودی کاربر را خودتان از کامپوننت کنترل می کنید. قابل پیش بینی تر است و اشکال زدایی آن آسان است.

مثال:

شما یک فرم برای ایجاد یک حساب کاربری جدید دارید که در آن فیلدهای نام کاربری و رمز عبور دارید. اگر از اجزای کنترل‌شده استفاده می‌کنید، اعتبارسنجی ورودی‌ها یا پیگیری تغییرات آسان‌تر می‌شود.

استفاده از کامپوننت‌های کنترل‌شده حالت فرم شما را واضح می‌سازد، که به ویژه در فرم‌های بزرگ یا رابط‌های کاربری پیچیده مفید است.

مدیریت حالت با Context API به جای Prop Drilling

حفاری پایه زمانی است که شما پایه ها را از چندین لایه اجزا عبور می دهید، که واقعا می تواند پایه کد شما را به هم بریزد. می توانید از آن استفاده کنید Context API برای ارائه حالت به کامپوننت ها بدون نیاز به گذر از هر سطح.

مثال:

فرض کنید در حال ساختن یک درخت مولفه چند سطحی با تنظیمات تم (روشن یا تاریک) هستید. به‌جای اینکه پایه تم را به هر سطح از کامپوننت منتقل کنید، می‌توانید از React Context API استفاده کنید تا موضوع مورد نظر را مستقیماً به هر مؤلفه‌ای که به آن نیاز دارد ارائه دهید.

با Context، دیگر مجبور نخواهید بود با حفاری پایه سر و کار داشته باشید، بنابراین کد شما تمیزتر و نگهداری آسان‌تر خواهد بود.

برای تجربه کاربری بهتر، مرزهای خطا را فراموش نکنید

Error Boundaries کامپوننت‌های React هستند که خطاها را در هر نقطه از درخت کامپوننت می‌گیرند و یک UI بازگشتی را بدون خراب کردن کل برنامه نمایش می‌دهند. این به ایجاد تجربه کاربری بهتر کمک می کند، به خصوص در برنامه های بزرگ که در غیر این صورت ممکن است خطاهای غیرمنتظره رخ دهد.

مثال: بیایید در نظر بگیریم که در حال ساختن یک گالری تصاویر برای خود هستید که برخی از تصاویر از منبع غیرقابل اعتمادی هستند. شما نمی توانید بپذیرید که یک خطا در بارگذاری یک تصویر کل گالری را خراب کند. جزء گالری را با Error Boundary بپیچید تا برای هر گونه خطای بارگذاری، یک رابط کاربری جایگزین نمایش داده شود.

استفاده از Error Boundaries با رسیدگی به مسائل غیرمنتظره با ظرافت، تجربه روان تری را فراهم می کند.

قسمت‌هایی از برنامه خود را با مرزهای خطا بپیچید تا کاربر به دلیل یک خطای کوچک، رابط کاربری خراب را نبیند.

از Linter و Formatter استفاده کنید

از یک لینتر مانند استفاده کنید ESLint و فرمت کننده ای مانند زیباتر تا مطمئن شوید که کد شما به سبک ثابت نوشته شده است و به شما کمک می کند تا اشکالات را زودتر تشخیص دهید.

مثال:

هنگامی که روی یک پروژه تیمی کار می کنید، چندین بار افراد مختلف سبک کدنویسی متفاوتی دارند که منجر به کد متناقض و همچنین خواندن آن دشوار می شود. بنابراین با راه‌اندازی ESLint و Prettier به این معنی است که همه از یک قانون پیروی می‌کنند، بنابراین کد تمیز و اشکال‌زدایی آسان خواهد بود.

تنظیم مثال:

ESLint و Prettier را نصب کنید و آنها را به پروژه خود اضافه کنید:

Linter و Formatter یکپارچگی کد را به صورت خودکار تضمین می‌کند، که باعث می‌شود کد خواناتر و راحت‌تر اشکال‌زدایی شود، مخصوصاً هنگام کار با یک تیم.

نتیجه گیری

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

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

کد نویسی مبارک و React خود را ادامه دهید!

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

در این پست قصد داریم با برخی از مهم ترین نکات و ترفندهای واکنشی آشنا شویم که به شما کمک می کند تا از همان ابتدا کد بهینه سازی شده را بنویسید. با پیروی از این نکات می توانید از بسیاری از اشتباهات احمقانه ای که هنگام نوشتن کد مرتکب می شویم جلوگیری کنید و همچنین عادات کدنویسی خوبی ایجاد کنید که خوانایی، قابلیت نگهداری، قابلیت استفاده مجدد و همچنین مقیاس پذیری کد شما را بهبود می بخشد. بنابراین چه در حال طراحی اولین اپلیکیشن خود باشید و چه در react متخصص باشید، این نکات برای همه ارزشمند خواهد بود.


برای خوانایی بهتر اجزا را تجزیه کنید

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

به یک جزء بزرگ فکر کنید که نمایش داده های کاربر و ارسال فرم را مدیریت می کند. در عوض، اجزای جداگانه مانند UserInfo و UserForm. شما می توانید هر یک از آنها را بسیار ساده تر آزمایش / اشکال زدایی / استفاده مجدد کنید.


از useEffect هوشمندانه استفاده کنید

را useEffect hook یکی از قدرتمندترین ابزارهای React است، اما می‌تواند کمی مشکل نیز باشد. یکی از اشتباهاتی که مبتدیان مرتکب می شوند، ایجاد آن است رندرهای ناخواسته با مدیریت نکردن وابستگی های useEffectبه درستی از آرایه وابستگی برای اطلاع از زمان اجرای افکت استفاده کنید و با انتخاب وابستگی های مناسب به حلقه های بی پایان توجه کنید.

مثال:

تصور کنید در حال کار بر روی یک برنامه هواشناسی هستید که هر بار که مکان کاربر تغییر می کند، داده ها را واکشی می کند. با useEffect، می‌توانید یک آرایه وابستگی را ارسال کنید تا افکت فقط در صورت تغییر مکان، به جای اجرا شدن بعد از هر رندر، دوباره اجرا شود.

توضیحات تصویر

مدیریت useEffect وابستگی ها عملکرد را بهبود می بخشد و از برخی رفتارهای عجیب و غریب جلوگیری می کند.


آموزش استفاده از React DevTools

React DevTools یک ابزار عالی برای اشکال زدایی و بازرسی اجزا است. شما می توانید درخت کامپوننت را ببینید، پایه ها و حالت ها را بررسی کنید و بفهمید که چگونه اجزای خود به روز می شوند. اگر هنوز از آن استفاده نمی کنید، همین الان شروع کنید.

فرض کنید برنامه‌ای دارید که دارای سبد خرید است و متوجه می‌شوید که هر بار که چیزی را اضافه می‌کنید، کل جزء سبد خرید دوباره رندر می‌شود و همه چیز را کندتر می‌کند. من قصد دارم به شما بگویم که چگونه استفاده از React DevTools می تواند به شما در این زمینه کمک کند.

نحوه استفاده:

افزونه React DevTools را در مرورگر خود نصب کنید. این به شما امکان می‌دهد برگه Components را باز کنید و درخت مؤلفه یا تب Profiler را ببینید تا عملکرد رندر خود را ردیابی کنید. خوب بودن با این ابزار باعث صرفه جویی در وقت شما برای رفع اشکال برنامه می شود.

با DevTools اجزاء را مرور کنید و به ویژگی‌ها، وضعیت‌ها یا حتی چرخه عمر آنها نگاه کنید، اگر یک مؤلفه بیشتر از آنچه باید رندر شود، می‌توانیم از مواردی مانند React.memo، useCallback.


بهینه سازی با React.memo و از Callback استفاده کنید

برای دستیابی به عملکرد بهتر، React ابزارهایی مانند React.memoو useCallback برای جلوگیری از رندرهای غیر ضروری شما اجزای خود را با React.memo اگر کامپوننت نیازی به رندر مجدد نداشته باشد مگر اینکه اجزای ارسال شده به آن تغییر کنند یا توابع بسته بندی شده از مؤلفه والد با useCallback

مثال :

اگر در حال ساخت یک داشبورد با چندین نمودار و جدول داده هستید. هر زمان که داده‌های جدیدی وارد می‌شود، React ممکن است همه مؤلفه‌ها، از جمله مؤلفه‌هایی را که قرار نیست از داده‌های جدید استفاده کنند، دوباره رندر کند. می توانید هر جزء نمودار را با آن بپیچید React.memo و از رندرهای غیر ضروری خودداری کنید.

توضیحات تصویر

این بهینه‌سازی‌ها کمک می‌کنند تا اطمینان حاصل شود که برنامه شما واکنش‌گرا باقی می‌ماند، به‌ویژه در برنامه‌هایی با یک پایگاه کد بزرگ و یک رابط کاربری پیچیده (UI).

با استفاده از React.memo اینجا تضمین می کند که Chart فقط زمانی دوباره رندر می شود که data تغییرات پایه، پاسخگو نگه داشتن داشبورد.


پاکسازی افترافکت

هر زمان که از useEffect برای شنوندگان رویداد یا اشتراک‌ها استفاده می‌کنید، باید این کار را انجام دهید پاک کردن در اثر جلوگیری از نشت حافظه. React نه تنها شنوندگان/اشتراک را در هنگام رندر شدن کامپوننت اضافه می کند، بلکه در صورت جدا شدن کامپوننت، آنها را حذف می کند.

مثال:

تصور کنید در حال ساخت یک برنامه پیام رسانی هستید که در آن باید از طریق WebSocket به پیام های جدید گوش دهید. اگر شنونده WebSocket را پاکسازی نکنید، چندین نمونه به انباشته شدن ادامه می‌دهند که بر عملکرد برنامه و همچنین حافظه شما تأثیر می‌گذارد.

توضیحات تصویر

این برنامه شما را سریع نگه می دارد و مشکلات شنوندگان رویدادهای انباشته را کاهش می دهد.


از Destructuring برای Props استفاده کنید

تخریب اجزای سازنده در امضای تابع یا در داخل بدنه جزء روشی تمیز برای مدیریت قطعات است که کد شما را کوتاه‌تر و خواندن را بسیار آسان‌تر می‌کند.

تصور کنید که در حال ساخت یک صفحه پروفایل با یک UserProfile مؤلفه ای که چندین پروپوزال را دریافت می کند (مانند name، age، location). تخریب ساختار این ابزارها درست در امضای تابع، کد را مختصرتر و خواناتر می کند.

توضیحات تصویر

تخریب ساختار، خواندن و مدیریت اجزای شما را آسان‌تر می‌کند، به‌ویژه زمانی که از چندین قطعه استفاده می‌کنند.


از اجزای کنترل شده در فرم ها استفاده کنید

اجزای کنترل شده آنهایی هستند که داده های فرم توسط React (وضعیت جزء) مدیریت می شود. به عبارت ساده تر، ورودی کاربر را خودتان از کامپوننت کنترل می کنید. قابل پیش بینی تر است و اشکال زدایی آن آسان است.

مثال:

شما یک فرم برای ایجاد یک حساب کاربری جدید دارید که در آن فیلدهای نام کاربری و رمز عبور دارید. اگر از اجزای کنترل‌شده استفاده می‌کنید، اعتبارسنجی ورودی‌ها یا پیگیری تغییرات آسان‌تر می‌شود.

توضیحات تصویر

استفاده از کامپوننت‌های کنترل‌شده حالت فرم شما را واضح می‌سازد، که به ویژه در فرم‌های بزرگ یا رابط‌های کاربری پیچیده مفید است.


مدیریت حالت با Context API به جای Prop Drilling

حفاری پایه زمانی است که شما پایه ها را از چندین لایه اجزا عبور می دهید، که واقعا می تواند پایه کد شما را به هم بریزد. می توانید از آن استفاده کنید Context API برای ارائه حالت به کامپوننت ها بدون نیاز به گذر از هر سطح.

مثال:

فرض کنید در حال ساختن یک درخت مولفه چند سطحی با تنظیمات تم (روشن یا تاریک) هستید. به‌جای اینکه پایه تم را به هر سطح از کامپوننت منتقل کنید، می‌توانید از React Context API استفاده کنید تا موضوع مورد نظر را مستقیماً به هر مؤلفه‌ای که به آن نیاز دارد ارائه دهید.

توضیحات تصویر

با Context، دیگر مجبور نخواهید بود با حفاری پایه سر و کار داشته باشید، بنابراین کد شما تمیزتر و نگهداری آسان‌تر خواهد بود.


برای تجربه کاربری بهتر، مرزهای خطا را فراموش نکنید

Error Boundaries کامپوننت‌های React هستند که خطاها را در هر نقطه از درخت کامپوننت می‌گیرند و یک UI بازگشتی را بدون خراب کردن کل برنامه نمایش می‌دهند. این به ایجاد تجربه کاربری بهتر کمک می کند، به خصوص در برنامه های بزرگ که در غیر این صورت ممکن است خطاهای غیرمنتظره رخ دهد.

مثال:
بیایید در نظر بگیریم که در حال ساختن یک گالری تصاویر برای خود هستید که برخی از تصاویر از منبع غیرقابل اعتمادی هستند. شما نمی توانید بپذیرید که یک خطا در بارگذاری یک تصویر کل گالری را خراب کند. جزء گالری را با Error Boundary بپیچید تا برای هر گونه خطای بارگذاری، یک رابط کاربری جایگزین نمایش داده شود.

توضیحات تصویر

استفاده از Error Boundaries با رسیدگی به مسائل غیرمنتظره با ظرافت، تجربه روان تری را فراهم می کند.

قسمت‌هایی از برنامه خود را با مرزهای خطا بپیچید تا کاربر به دلیل یک خطای کوچک، رابط کاربری خراب را نبیند.


از Linter و Formatter استفاده کنید

از یک لینتر مانند استفاده کنید ESLint و فرمت کننده ای مانند زیباتر تا مطمئن شوید که کد شما به سبک ثابت نوشته شده است و به شما کمک می کند تا اشکالات را زودتر تشخیص دهید.

مثال:

هنگامی که روی یک پروژه تیمی کار می کنید، چندین بار افراد مختلف سبک کدنویسی متفاوتی دارند که منجر به کد متناقض و همچنین خواندن آن دشوار می شود. بنابراین با راه‌اندازی ESLint و Prettier به این معنی است که همه از یک قانون پیروی می‌کنند، بنابراین کد تمیز و اشکال‌زدایی آسان خواهد بود.

تنظیم مثال:

ESLint و Prettier را نصب کنید و آنها را به پروژه خود اضافه کنید:

توضیحات تصویر

Linter و Formatter یکپارچگی کد را به صورت خودکار تضمین می‌کند، که باعث می‌شود کد خواناتر و راحت‌تر اشکال‌زدایی شود، مخصوصاً هنگام کار با یک تیم.


نتیجه گیری

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

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

کد نویسی مبارک و React خود را ادامه دهید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا