در این سؤال قرار است که یک زمانسنج ساده با React طراحی کنید.
به این صورت که از لحظه load شدن زمان شروع به افزایش کند
و با فشردن دکمهی Reset Timer
این زمان مجدداً صفر شود.
پروژه اولیه را از اینجا دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
برای اجرای پروژه، باید NodeJS
و npm
(یا pnpm
) را از قبل نصب کرده باشید.
simple-timer
، دستور npm install
را برای نصب نیازمندیها اجرا کنید.pnpm install
استفاده کنید.npm start
را برای راهاندازی پروژه اجرا کنید.http://localhost:3000/
میتوانید نتیجه را ببینید.شما باید مؤلفهی Timer
را به صورت زیر تکمیل کنید:
load
شدن، ابتدا عدد صفر را نمایش دهد و شروع به شمردن کند (هر یک ثانیه).Reset Timer
زمان مجدداً از صفر آغاز شود.clearInterval
).timer
نمایش داده شود (نام کلاس در داوری تاثیر دارد).Date
استفاده کنید).
عدد زمانسنج نباید با تغییر ساعت به هم بریزد.Timer.js
را ارسال کنید.احتمالاً نام ویژگی جدید React یعنی hook را شنیدهاید. با این ویژگی میتوان از state و امکانات دیگر React در مؤلفههای مبتنی بر تابع استفاده کرد.
جملهای از مستندات React:
In the longer term, we expect Hooks to be the primary way people write React components.
در این سؤال از شما میخواهیم دو قلاب سفارشی! (custom hook) ساده را پیادهسازی کنید.
پروژه اولیه را از اینجا دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
برای اجرای پروژه، باید NodeJS
و npm
(یا pnpm
) را از قبل نصب کرده باشید.
simple-hooks
، دستور npm install
را برای نصب نیازمندیها اجرا کنید.pnpm install
استفاده کنید.npm start
را برای راهاندازی پروژه اجرا کنید.http://localhost:3000/
میتوانید نتیجه را ببینید.موارد زیر را در فایل hooks.js
پیادهسازی کنید.
این قلاب مقدار شروع و پایان شمارنده را به عنوان ورودی میگیرد و یک آرایه شامل مقدار شمارنده و تابعی برای شمردن برمیگرداند. تابع count
باید مقدار شمارنده را یک واحد اضافه کند. در صورتی که مقدار شمارنده برابر با finish
باشد با شمارش بعدی مقدار به start
تغییر میکند.
مثالی از نحوهی استفاده که در پروژهی اولیه نیز آمده است:
این قلاب یک پشته را پیادهسازی میکند و در خروجی یک شیء شامل مقادیر پشته (آرایهی stack
)، تابع push
برای افزودن عنصر به پشته و تابع pop
برای حذف آخرین عنصر را برمیگرداند.
مثالی از نحوهی استفاده که در پروژهی اولیه نیز آمده است:
نحوهی عملکرد مثالهای بالا را در شکل زیر میبینید.
hooks.js
را ارسال کنید.حسنی در دوران تنبلیاش، همهی فیلمهای برتر سینمای جهان را مشاهده کرد و علاقهی او به سینما از همانجا آغاز شد.
بعد از سالها، او به تازگی یک توسعهدهندهی Front-end شده است و به او پیشنهاد شده که سایت سینما شلمرود را پیادهسازی کند. اون نیز به دلیل علاقهی زیادی که به سینما دارد این پروژه را به سرعت قبول کرد.
این پروژه یک وبسایت ساده برای نمایش اطلاعات فیلمهای در حال اکران است. در صفحهی اصلی، لیست فیلمها به صورت تعدادی کارت به نمایش در میآید.
و با کلیک روی نام هر فیلم به صفحهی جزئیات آن فیلم هدایت میشویم.
از آنجایی که حسنی کار با React را یاد گرفته، پروژه را با این کتابخانه آغاز میکند
اما در میانهی کار متوجه میشود که این کتابخانه به تنهایی کافی نیست
و باید راهی برای مدیریت مسیر (Route
) های مختلف پیدا کند.
پیشنهاد ما به او استفاده ازreact-router-dom
است اما حسنی هیچ دانشی از این کتابخانه ندارد، او را در این مسیر کمک کنید.
پروژه اولیه را از اینجا دانلود کنید.
برای اجرای پروژه، باید NodeJS
و npm
(یا pnpm
) را از قبل نصب کرده باشید.
cinema
، دستور npm install
را برای نصب نیازمندیها اجرا کنید.pnpm install
استفاده کنید.npm run server
را برای راهاندازی سرور اجرا کنید.npm start
را برای راهاندازی کلاینت اجرا کنید.http://localhost:3000/
میتوانید نتیجه را ببینید.هدف این سؤال، سنجش مهارت شما در استفاده از کتابخانهی react-router-dom
است.
کارهایی که باید انجام دهید در ادامه آمده است.
Route
) های صحیح در مؤلفهی App
به طوری که با دسترسی به هر مسیر مؤلفهی مشخصشده نمایش داده شود./
: مؤلفهی Movies
/movies/{movie_id}
: مؤلفهی MovieDetail
NotFound
MovieCard
باید لینک به صفحهی جزئیات همان فیلم باشد.MovieDetail
یکی از متدهای lifecycle
مناسب را override
کنید
به طوری که بلافاصله پس از load
شدن مؤلفه اطلاعات مربوط به فیلم را از سرور دریافت
و state
مولفه را بروز کنید.دریافت اطلاعات جزئی یک فیلم از سرور:
localhost:9000/movies/{movie_id}
GET
App.js
، MovieCard.js
و MovieDetail.js
هستید.node_modules
در فایل ارسالی نباشد.مهارتهای لازم:
ReactJS
Redux
سینا سعیدی و سعید سینایی برای یادگرفتن redux از نمونههای سایت آن استفاده میکنند. در یکی از این نمونهها سبد خرید سادهای توضیح داده شده است. آنها میخواهد امکانات جدید به سبد خرید اضافه کند که شبیه سایت اسنپ فود شود! ظاهر کلی برنامه بدین صورت است:
پروژه اولیه را از اینجا دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
برای اجرای پروژه، باید NodeJS
و npm
را از قبل نصب کرده باشید.
like-snappfood
، دستور npm install
را برای نصب نیازمندیها اجرا کنید.npm start
را برای راهاندازی پروژه اجرا کنید.http://localhost:3000/
میتوانید نتیجه را ببینید.طراحی state برنامه بدین صورت است:
cart.addedIds
: آرایهای از id
محصولات که خریداری شدهاند.cart.money
: موجودی شخص برای خرید محصولcart.quantityById
: به ازای هر محصول تعداد خریداری شده را مشخص میکند.products.byId
: به ازای هر id
تعریف محصول را مشخص میکند.در این پروژه دو قسمت کلی وجود دارد وجود دارد:
ProductsContainer
: قسمتی که کاربر میتواند از آن یک محصول را به سبد خرید خود اضافه کند و به ازای هر محصول یک کارت در آن وجود دارد.CartContainer
: سبد خرید و محصولات موجود در سبد را مشخص میکند. همچنین دارای قسمتی برای نهایی کردن پرداخت میباشد.داخل فایل actions/index.js
اطلاعات مربوط به action های شما قرار خواهند گرفت.
در این پروژه پنج نوع action (عملیات) وجود دارد:
ADD_TO_CART
: با گرفتن id
یک محصول تنها در صورتی که از این محصول موجودی داشته باشیم و مقدار پول ما برای سبد خرید با محصول جدید مناسب باشد آن را به سبد محصول اضافه میکند.
این action در صورت کلیک بر روی Add to cart
و یا دکمه +
(سبد خرید) فراخوانی خواهد شد. باید یکی از تعداد موجودی محصول کاسته و به تعداد خریداری اضافه شود.TOGGLE_LIKE
: محصولی که در سبد خرید قرار دارد امکان ثبت به عنوان مورد علاقه را دارد. محصولی که ابتدا مورد علاقه شده باشد و از سبد خرید خارج شود پس از اضافه شدن مجدد بایستی مورد علاقه بماند.
این action با کلیک بر روی علامت ♥
در سبد محصول فعال میشود و درنهایت باید پس از مورد علاقه شدن کلاس is-active
به like-btn
اضافه شود.REMOVE_FROM_CART
: با گرفتن id
یک محصول آن را از سبد محصول حذف میکند..
این action با کلیک بر روی دکمه -
(در سبد خرید) بایستی اجرا شود و یکی از تعداد خریداری (درصورت وجود) کسر شود و به موجودی اضافه شود.REMOVE_ALL_FROM_CART
: تمام محصولات خریداری شده از یک id
را حذف میکند.
در صورت کلیک بر روی دکمه ×
تمام محصولات از یک id
حذف شود و به موجودی اضافه شود.CHECKOUT_REQUEST
: سبد خرید خالی شود و قیمت از موجودی کاسته شود.components/*
، containers/CartContainer.js
، reducers/cart.js
،reducers/product.js
و actions/index.js
هستید.node_modules
در فایل ارسالی نباشد.سالها پیش حسنی که دست از تنبلی برداشته بود تصمیم گرفت در کار مزرعه به پدرش کمک کند.
اکنون که حسنی به توسعهی Front-end علاقهمند شده، تصمیم گرفته به یاد گذشته و مزرعهی پدری یک بازی با React طراحی کند. او در میانهی کار به شلمرود رفته و پروژهی نیمهکاره را به شما سپرده تا آن را کامل کنید.
در این بازی، مزرعه به شکل یک جدول از نهرهاست و هدف رساندن آب به همهی نهرهای مزرعه است. یکی از نهرها منبع آب است. با کلیک روی هر نهر، آن نهر ۹۰ درجه در جهت ساعتگرد میچرخد. بازی تعدادی مرحله دارد و با حل یک مرحله، (در صورتی که در آخرین مرحله نباشیم) دکمهی رفتن به مرحلهی بعد فعال میشود.
برای حل یک مرحله باید نهرها در وضعیتی قرار بگیرند که:
مثلاً در شکل زیر هنوز بازی حل نشده است و برای حل آن باید ۳ بار روی نهر وسط کلیک کنیم.
مثالی از بازی را در شکل زیر میبینید. در این مثال بازی تنها ۲ مرحله دارد.
پروژه اولیه را از اینجا دانلود کنید.
برای اجرای پروژه، باید NodeJS
و npm
(یا pnpm
) را از قبل نصب کرده باشید.
shalamrood
، دستور npm install
را برای نصب نیازمندیها اجرا کنید.pnpm install
استفاده کنید.npm start
را برای راهاندازی پروژه اجرا کنید.http://localhost:3000/
میتوانید نتیجه را ببینید.npm test
را اجرا کنید.حسنی برای پروژه تعدادی مؤلفه تعریف کرده که در جدول زیر مشاهده میکنید.
او با خواندن مقالهی
Lifting State Up
تصمیم گرفته حالت بازی را در بالاترین مؤلفه یعنی App
قرار دهد.
مؤلفه | توضیحات |
---|---|
App |
مؤلفهی اصلی بازی است و حالت بازی در آن قرار دارد. |
Menu |
مؤلفهی بدون حالت برای نمایش عدد مرحله و دکمههای «مرحله بعد» و «شروع مجدد» |
Board |
مؤلفهی بدون حالت برای نمایش نهرها |
Cell |
مؤلفهی بدون حالت برای نمایش یک نهر |
نهرها انواع زیر را دارند:
حالت بازی (حالت مؤلفهی App
) به صورت زیر است.
همانطور که مشخص است، تعداد سطرها و ستونها، شمارهی نهر منبع آب (source
)،
شمارهی مرحلهای که در آن قرار داریم و وضعیت نهرها در حالت قرار میگیرد.
state
از صفر شروع میشود اما هنگام نمایش از یک شروع میشود.cells
قرار میگیرد.rotate
برای هر نهر عددی بین ۰ تا ۳ است و
نشان میدهد نسبت به وضعیت اصلی نهر که در شکل بالا میبینید چند بار چرخیده است.active
برای هر نهر نشان میدهد که آب به آن نهر رسیده یا خیر.
بنابراین مقدار active
برای منبع آب باید همواره true
باشد.مواردی که باید پیادهسازی کنید:
در نمایش اولیهی مرحلهی اول بازی، باید منبع آب و همهی نهرهایی که آب به آنها میرسد فعال باشند (active: true
).
دکمهی رفتن به مرحلهی بعد باید غیرفعال باشد
(با صفت disabled
).
با کلیک روی هر نهر، باید حالت به نحوی مناسب تغییر کند تا آن نهر ۹۰ درجه بچرخد و آب نیز بر اساس وضعیت جدید نهرها به آنها برسد.
App.js
، Menu.js
، Board.js
و Cell.js
هستید.node_modules
در فایل ارسالی نباشد.