MakeFirstStep· Frontend + зеҳни сунъӣ

Дарси 22 · React Lite (бонус)

React: барои чӣ лозим аст. Vite, JSX ва компоненти аввал

Дар дарси 11 Шумо render(state)-ро навиштед, ки экранро аз рӯи маълумот аз нав мекашад. Ин ғояи дуруст аст, аммо кодҳои гирду атрофи он бисёранд: унсурро ёфтан, эҷод кардан, пур кардан, ҷойгир кардан, нав карданро фаромӯш накардан. React ин корро ба зимма мегирад: Шумо тавсиф мекунед, ки дар экран чӣ бояд бошад, ва он чӣ тавр расидан ба инро худаш ҳал мекунад. Имрӯз Шумо мебинед, ки чаро сайтҳои калон ин тавр мекунанд, лоиҳаро дар Vite месозед ва саҳифаро аз компонентҳо ҷамъ мекунед.

  • Номбар кардан, ки DOM-и дастӣ чӣ тавр ба рушди барнома халал мерасонад, ва як интерфейси ҳамонро бо JS-и тоза ва бо React муқоиса кардан
  • Саҳифаро ба компонентҳо тақсим кардан ва ба онҳо номҳои дуруст додан
  • Лоиҳаро бо фармони npm create vite@latest -- --template react сохтан ва сохтори онро хондан
  • JSX навиштан ва донистан, ки он аз HTML чӣ фарқ дорад: className, htmlFor, тегҳои пӯшида, як реша, {…}, style={{…}}
  • Компонентҳоро эълон кардан, содир (export) кардан ва дар App.jsx ворид (import) кардан
  • Аз ЗС хостан, ки блоки шиноси JS-ро ба React аз нав нависад, ва ҷавобро сатр ба сатр таҳлил кардан
Бо ин саҳифа чӣ тавр кор кардан лозим аст

Мисолҳои React дар қуттии регӣ бо пешнамоиш кушода мешаванд: ҷадвали App.jsx бо код, дар зери он — саҳифаи тайёр ва консол. Кодро тағйир диҳед ва ▶ Иҷро кардан (ё Ctrl + Enter)-ро пахш кунед. React аз интернет бор мешавад, бинобар ин дастрасӣ ба шабака лозим аст. Дар қуттии регӣ як файл ҳаст — компонентҳо дар паҳлуи якдигар ҷойгиранд; дар лоиҳаи воқеии Vite ҳар кадом дар файли алоҳида мешавад. Сатри setTimeout(() => console.log(…), 100) дар поёни мисолҳо — санҷиши худкори хидматӣ аст: он HTML-ро, ки React сохтааст, ба консол чоп мекунад, то вазифаро санҷидан мумкин бошад. Дар вазифаҳо онро нест накунед; дар лоиҳаи оддӣ он лозим нест. Блокҳо бо сарлавҳаи «Терминал» ва номи файл — ин фармонҳо ва файлҳо барои компютери Шумо ҳастанд, онҳо тугмаи оғоз надоранд.

01 Барои чӣ React: DOM-и дастӣ аз куҷо халал мерасонад

Ҳар чизе, ки Шумо то ҳол бо экран мекардед, — ин равиши императивӣ аст: Шумо ба браузер қадам ба қадам фармон медиҳед. «Ин унсурро ёб. Нав эҷод кун. Матнро ба он сабт кун. Ин ҷо ҷойгир кун». Барои корт бо сарлавҳа ин чунин менамояд:

Корти курс: JS-и тоза · Ctrl + Enter
<div id="app"></div>
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Ҳамин натиҷа бо React. Муқоиса кунед: инҷо на як createElement ва на як querySelector ҳаст. Шумо он чиро менависед, ки мехоҳед бинед, — функсия танҳо аломатгузориро «бармегардонад».

Корти курс: React · Ctrl + Enter
export default function App() {
  return (
    <div className="card">
      <h2>JavaScript с нуля</h2>
      <p>24 урока · 8 недель</p>
      <button>Записаться</button>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Дар консоли ҳарду қуттии регӣ — як аломатгузории ҳамонанд. Фарқ дар он аст, ки Шумо ба он чӣ тавр расидед: дар ҳолати аввал 12 сатри фармон, дар дуюм — «тасвир»-и он чӣ лозим аст.

Монанд аз ҳаёт

Чойхона. DOM-и дастӣ — ин вақте аст, ки Шумо худатон ба ошхона меравед ва ба ошпаз мегӯед: «Қазонро гир. Равғанро резон. Пиёзро андоз. Пас аз панҷ дақиқа сабзиро илова кун…» Барои ҳар палав — тамоми дастур аз нав. React — ин вақте аст, ки Шумо ба пешхизмат мегӯед: «Палав ва чой барои ду нафар». Дар ошхона чӣ ва бо кадом тартиб кардан — ташвиши муассиса аст. Шумо натиҷа-ро тавсиф мекунед (ин чунин номида мешавад — равиши декларативӣ), на қадамҳоро.

Чор дарди DOM-и дастӣ

1. Аломатгузорӣ намоён нест
Сохтори саҳифа дар паси даҳҳо createElement ва append пинҳон аст. Барои фаҳмидани он ки чӣ мешавад, бояд кодро дар зеҳн «иҷро» кард.
2. Нав кардан осон фаромӯш мешавад
Як маълумот дар якчанд ҷой нишон дода мешавад. Дар як ҷо тағйир додед — дар ҷои дигар кӯҳна монд, ва экран дурӯғ мегӯяд.
3. «Тегҳои худӣ» нестанд
Корти курс дар даҳ ҷо лозим аст — функсияҳои корхона навиштан ва бо даст пайваст кардан лозим мешавад. Роҳи ягона барои гуфтан «ин блоки ман аст, онро мисли теги оддӣ истифода бар» нест.
4. Ҳолат ва экран аз ҳам мераванд
Дар дарси 11 Шумо инро бо функсияи render() ҳал кардед, ки экранро пурра аз нав месозад. Кор мекунад, аммо ҳангоми ҳар тағйирот браузер ҳама чизро аз нав эҷод мекунад — ва фокус дар майдони воридот, прокрутка ва интихоб гум мешаванд.

Дарди дуюмро зинда бинед. Нархи курс дар ду ҷой нишон дода шудааст, аммо танҳо дар як ҷо нав шудааст:

Экран дурӯғ мегӯяд: ҷои дуюмро нав кардан фаромӯш шуд · Ctrl + Enter
document.body.innerHTML = `
  <p>Курс: <b id="price-top">500</b> сомони</p>
  <p>Итого: <b id="price-total">500</b> сомони</p>`;

let price = 500;
price = 450; // тахфиф кардем

document.querySelector("#price-top").textContent = price;
// дар бораи #price-total фаромӯш кардем

console.log(document.querySelector("#price-top").textContent);
console.log(document.querySelector("#price-total").textContent);

Дар боло 450, дар «Итого» ҳанӯз 500. Дар саҳифаи хурд ин фавран намоён аст, дар барномаи калон бо сад экран — не. React чунин сохта шудааст, ки экран ҳамеша аз маълумот ҳисоб карда мешавад, ва «фаромӯш кардан»-и нав кардани ҷой чизе надорад.

React чист

React — китобхонаи сохтани интерфейсҳо аст, онро ширкати Meta (Facebook-и пешина) офаридааст, ва ҳоло он шояд маъмултарин дар ҷаҳон барои сайтҳо ва барномаҳо бошад. Ғояи асосӣ: интерфейс — функсия аз маълумот аст. Маълумот тағйир ёфт — React худаш «буд» ва «шуд»-ро муқоиса мекунад ва дар DOM танҳо он чизеро, ки лозим аст, иваз мекунад. Ҳама чизи дигар (масиррӯбиҳо, рендери серверӣ) алоҳида пайваст мешавад: дар сатҳи оянда Шумо бо Next.js вомехӯред — ин фреймворк дар асоси React аст.

React на ҳамеша лозим аст

Лендинг аз панҷ блок ва ду тугма бо HTML, CSS ва JS-и тоза хуб зиндагӣ мекунад — ва зудтар бор мешавад. React дар ҷое сарфа мекунад, ки экранҳои интерактивии зиёд ҳастанд, блокҳои якхела такрор мешаванд, ва маълумот зуд тағйир меёбад: кабинетҳои шахсӣ, мағозаҳо, дашбордҳо, чатҳо. Мо React-ро на ба ҷои JS, балки болои он меомӯзем: ҳар чизе, ки Шумо дар бораи функсияҳо, массивҳо ва объектҳо медонед, дар ҳар сатр муфид мешавад.

Амалиёт: мустаҳкам мекунем

Аввал DOM-и дастиро мехонем, баъд экрани «дурӯғгӯй»-ро ислоҳ мекунем ва дар охир кодро ба JSX мегузаронем.

ВАЗИФАИ 1.1

Пешбинӣ кунед: код чӣ сохт

осон

Аввал се сатри чопро пешбинӣ кунед, баъд оғоз намоед. Диққат диҳед, ки барои як рӯйхати се бандӣ чӣ қадар код лозим аст.

Таҳрир кардан мумкин аст · Ctrl + Enter
const list = document.createElement("ul");

for (const dish of ["Оши палав", "Самбуса", "Курутоб"]) {
  const li = document.createElement("li");
  li.textContent = dish;
  list.append(li);
}

console.log(list.children.length);
console.log(list.firstElementChild.textContent);
console.log(list.outerHTML);
Натиҷаи интизоршаванда
3
Оши палав
<ul><li>Оши палав</li><li>Самбуса</li><li>Курутоб</li></ul>
Ишора 1

list.children — ин унсурҳои фарзанди рӯйхат аст. Давра барои ҳар хӯрок як li эҷод мекунад.

Ишора 2

outerHTML унсурро якҷоя бо тегҳои худаш нишон медиҳад — ҳамчун сатр, бе фосила байни li.

ВАЗИФАИ 1.2

Экрани «дурӯғгӯй»-ро ислоҳ кунед

миёна

Нарх дар се ҷой нишон дода шудааст: «Курс», «Итого» ва «Взнос в месяц» (нарх ба 4 тақсим шуда). render()-ро ба итмом расонед, то он ҳар се ҷойро аз state.price нав кунад. Сатрҳои поёнро тағйир додан лозим нест: онҳо нархро иваз мекунанд, render()-ро даъват менамоянд ва натиҷаро чоп мекунанд. Ин айнан ҳамон корест, ки Шумо дар React намениависед.

Таҳрир кардан мумкин аст · Ctrl + Enter
document.body.innerHTML = `
  <p>Курс: <b id="price-top">500</b> сомони</p>
  <p>Итого: <b id="price-total">500</b> сомони</p>
  <p>Взнос в месяц: <b id="price-month">125</b> сомони</p>`;

const state = { price: 500 };

function render() {
  // TODO: ҳар се ҷойро аз рӯи state.price нав кунед
}

state.price = 480;
render();

console.log(document.querySelector("#price-top").textContent);
console.log(document.querySelector("#price-total").textContent);
console.log(document.querySelector("#price-month").textContent);
Натиҷаи интизоршаванда
480
480
120
Ишора 1

Барои ҳар ҷой: document.querySelector("#id").textContent = …. Се унсур — се сатр дар дохили render.

Ишора 2

Саҳм — ин state.price / 4 аст. Рақам худаш ҳамчун сатр ба textContent сабт мешавад.

ВАЗИФАИ 1.3

Аз createElement ба JSX

миёна

Дар поён — коди дастӣ, ки блоки тарифро месозад. Аз App ҳамон аломатгузориро бо JSX баргардонед. Ҳамаи тегҳо ва матн бояд мувофиқат кунанд. Класс дар JSX ҳамчун className навишта мешавад.

JavaScript
const plan = document.createElement("section");
plan.className = "plan";

const h = document.createElement("h3");
h.textContent = "Тариф «Старт»";

const ul = document.createElement("ul");
const li1 = document.createElement("li");
li1.textContent = "24 урока";
const li2 = document.createElement("li");
li2.textContent = "Проект в портфолио";
ul.append(li1, li2);

plan.append(h, ul);
Тарифи «Старт» · Ctrl + Enter
export default function App() {
  return (
    // TODO: аломатгузории тарифро баргардонед
    <div></div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<section class="plan">
<h3>Тариф «Старт»</h3>
<ul>
<li>24 урока</li>
<li>Проект в портфолио</li>
</ul>
</section>
Ишора 1

Унсури реша — <section className="plan">, дар дохили он h3 ва ul бо ду li. Дарунгузории JSX — мисли HTML.

Ишора 2

Ҷойгиркунандаи <div></div>-ро пурра, бо шарҳ якҷоя иваз кунед: шарҳи дохили return (…) пеш аз тегро танҳо нест кардан мумкин аст.

Муфассал хонед: react.dev — Quick Start · learn.javascript.ru — дарахти DOM

02 Бо компонентҳо фикр мекунем

Ҳар сайтеро кушоед ва дар зеҳн «хиштҳо»-ро бо чорчӯба иҳота кунед: сарлавҳа, меню, корти мол, тугма, поёнӣ. Ин худи компонентҳо ҳастанд. Компонент — функсияест, ки порчаи интерфейсро бармегардонад. Азбаски ин функсия аст, Шумо аллакай бо он муомила карда метавонед: як маротиба эълон кунед, ба қадри лозим даъват намоед.

Монанд аз ҳаёт

Конструктор ё маҷмӯи қолабҳо барои самбӯса. Як қолабро як маротиба сохтед — ва бо он ҳатто сад дона шаклдиҳӣ мекунед. Саҳифаи сайт як нони калон нест, балки маҷмӯи қисмҳои тайёр аст: сарлавҳа, рӯйхати курсҳо, поёнӣ. Лозим шуд, ки поёниро тағйир диҳед — дар як ҷо тағйир медиҳед, ва он дар ҳамаи саҳифаҳо нав мешавад.

Саҳифа — дарахт аст

Компонентҳо дар якдигар мисли қуттиҳои дарунгузашта ҷойгир мешаванд. Берунитарин — App, компоненти асосии барнома. Дар дохили он боқӣ ҷойгиранд:

App
Header
Logo
Nav
Courses
Footer
Як саҳифа — як дарахти компонентҳо. Дар код он аз боло ба поён мисли HTML-и дарунгузашта хонда мешавад
App ├─ Header │ ├─ Logo │ └─ Nav ├─ Courses └─ Footer

Ҳудуди компонентҳоро чӣ тавр ёфтан

  • Блок такрор мешавад (корти курс, банди меню) — қариб ҳамеша ин компоненти алоҳида аст.
  • Блок вазифаи худро дорад («сарлавҳаро нишон деҳ», «поёниро нишон деҳ») — компоненти алоҳида, мисли функсияи алоҳида дар дарси 5.
  • Файл калон шуд, ва дар он чизи лозимиро ёфтан мушкил аст — ба қисмҳо мебурем.
  • То заррачаҳо бурида накунед. Теги <h2>-ро компонент кардан лозим нест. Қоидаи хуб: агар барои блок номи фаҳмо ихтироъ кардан мумкин бошад, он барои компонент ҳам мебарояд.

Компоненти аввал

Компонент мисли функсияи дарси 5 менамояд, танҳо он на рақам, балки аломатгузориро бармегардонад. Ду қоида: ном бо ҳарфи калон оғоз мешавад ва онро мисли теги истифода бурдан лозим аст:

Се компонент дар як саҳифа · Ctrl + Enter
function Header() {
  return (
    <header className="top">
      <h1>MakeFirstStep</h1>
    </header>
  );
}

function Footer() {
  return <footer>© MakeFirstStep, Душанбе</footer>;
}

export default function App() {
  return (
    <div className="page">
      <Header />
      <main>Здесь будут курсы</main>
      <Footer />
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Ба се чиз диққат диҳед. <Header /> бо ҳарфи калон — ин компоненти мо аст: React функсияи Header-ро даъват мекунад ва натиҷаро ҷойгир менамояд. <main> бо ҳарфи хурд — теги оддии HTML. App ҳам компонент аст, танҳо аз ҳама асосӣ. Онро мо ҳамчун export default function App() менависем: маҳз онро қуттии регӣ (ва лоиҳаи Vite) дар саҳифа нишон медиҳад.

Хатои маъмул: ном бо ҳарфи хурд

React тегҳо ва компонентҳоро аз рӯи ҳарфи аввал фарқ мекунад. <header /> — ин теги HTML аст, ва <Header /> — функсияи Шумо. Агар компонентро header ё menu ном дода бошед, React функсияро намеёбад ва тегҳои холиро мекашад (ва <menu> умуман теги ҳақиқии HTML аст). Хато нест — танҳо холигӣ дар экран, ва ин аз ҳама нохушоянд аст.

Амалиёт: мустаҳкам мекунем

ВАЗИФАИ 2.1

Оё ин номи компонент аст?

осон

Функсияи isComponentName(name)-ро нависед: он true-ро бармегардонад, агар ном бо ҳарфи калони лотинӣ оғоз шавад, ва false — агар не.

Таҳрир кардан мумкин аст · Ctrl + Enter
function isComponentName(name) {
  // TODO: true ё false баргардонед
  return false;
}

for (const name of ["Header", "footer", "CourseCard", "nav", "App"]) {
  console.log(name + ": " + isComponentName(name));
}
Натиҷаи интизоршаванда
Header: true
footer: false
CourseCard: true
nav: false
App: true
Ишора 1

Ҳарфи аввали сатр: name[0]. Бояд санҷид, ки он калон аст.

Ишора 2

Ҳарфро бо варианти регистри боло муқоиса кунед: name[0] === name[0].toUpperCase(). Ё ифодаи тартибии /^[A-Z]/.test(name).

ВАЗИФАИ 2.2

Поёниро ба итмом расонед

миёна

Дар App аллакай <Footer /> гузошта шудааст, аммо худи компонент нест — саҳифа бо хато меафтад. Footer-ро эълон кунед: он теги <footer>-ро бо матни © MakeFirstStep, Душанбе бармегардонад.

Поёни саҳифа · Ctrl + Enter
function Header() {
  return (
    <header>
      <h1>MakeFirstStep</h1>
    </header>
  );
}

// TODO: компоненти Footer-ро эълон кунед

export default function App() {
  return (
    <div>
      <Header />
      <main>
        <p>Курсы скоро</p>
      </main>
      <Footer />
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div>
<header>
<h1>MakeFirstStep</h1>
</header>
<main>
<p>Курсы скоро</p>
</main>
<footer>© MakeFirstStep, Душанбе</footer>
</div>
Ишора 1

Намуна — Header-и боло. Функсия Footer ном дорад (бо ҳарфи калон) ва як тегро бармегардонад.

Ишора 2

function Footer() { return <footer>© MakeFirstStep, Душанбе</footer>; }

ВАЗИФАИ 2.3

Хаторо ёбед: менюи холӣ

миёна

Меню бояд ду хӯрокро нишон диҳад, аммо дар саҳифа холӣ аст, ва дар консол хато нест. Сабабро ёбед ва ислоҳ кунед.

Менюи холӣ · Ctrl + Enter
function menu() {
  return (
    <ul>
      <li>Оши палав</li>
      <li>Самбуса</li>
    </ul>
  );
}

export default function App() {
  return (
    <div>
      <h2>Меню</h2>
      <menu />
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div>
<h2>Меню</h2>
<ul>
<li>Оши палав</li>
<li>Самбуса</li>
</ul>
</div>
Ишора 1

Оғоз кунед ва ба консол нигаред: ба ҷои <ul> он ҷо теги холии <menu></menu> аст. React <menu />-ро ба теги оддии HTML гирифт.

Ишора 2

Номи компонент бояд бо ҳарфи калон оғоз шавад — ҳам дар эълони функсия ва ҳам дар ҷои истифода.

Муфассал хонед: react.dev — Your First Component · react.dev — Thinking in React

03 Лоиҳа месозем: Vite + React

Дар дарси 17 Шумо лоиҳаро дар Vite бо қолаби vanilla сохта будед. Барои React як параметр — қолаб — иваз мешавад. Ҳама чизи дигар ба Шумо шинос аст: npm, package.json, сервери dev.

Монанд аз ҳаёт

Қолаби лоиҳа — мисли банақшагирии намунавии хона. Метавон худатон хишт гузошт ва симкашӣ кард (ҷамъкунандаро бо даст танзим кард), ва метавон хонаи «калидӣ» гирифт бо симкашӣ ва оби тайёр ва фавран ҷойгир шуд — мебели худро илова кард. Vite маҳз чунин «хонаи калидӣ» барои React медиҳад.

Дастури қадам ба қадам

  1. Терминалро дар папкаи лоиҳаҳо кушоед (бе кирилликаю фосила дар роҳ; на дар OneDrive/iCloud). Node.js аллакай аз дарси 17 насб шудааст — санҷед: node -v.
  2. Лоиҳаро созед. Қисми -- --template react ба Vite мегӯяд: «қолаби React-ро гир». ---и дукарата опсияро минбаъд ба create-vite мегузаронад (мо инро дар дарси 17 дида будем).
  3. Ба папка гузаред ва вобастагиҳоро насб кунед — npm install React ва Vite-ро ба node_modules мекашад.
  4. Серверро барои таҳия оғоз кунед ва суроғаи терминалро кушоед.
Терминал
npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
npm run dev

Агар npm create vite@latest-ро бе опсияҳо оғоз кунед, ёвар саволҳо медиҳад: номи лоиҳа, фреймворк (React-ро интихоб кунед), вариант (JavaScript). Вобаста аз версия он метавонад боз пешниҳод кунад, ки фавран вобастагиҳоро насб кунад ва серверро оғоз намояд — метавон розӣ шуд, ва метавон «не» гуфт ва фармонҳоро мисли боло бо даст иҷро кард. Пас аз npm run dev Шумо мебинед:

Терминал — натиҷа
&gt; my-react-app@0.0.0 dev
&gt; vite

  VITE v8.3.4  ready in 210 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose

http://localhost:5173/-ро кушоед: Шумо саҳифаи оғозии React-ро бо ҳисобкунак мебинед. Дар src/App.jsx чизеро иваз кунед ва нигоҳ доред — саҳифа худаш нав мешавад, бе аз нав боркунӣ (HMR аз дарси 17).

Агар чизе хато рафт

«npm: command not found» — Node.js насб нашудааст ё терминалро бояд аз нав оғоз кард. Хато дар бораи версияи Node — Node.js-ро то LTS нав кунед. Саҳифа холӣ аст — DevTools (F12) → Console-ро кушоед: он ҷо навишта шудааст, ки хато дар кадом файл аст (аксар вақт ғалат дар JSX). Порт банд аст — Vite худаш 5174-ро интихоб мекунад ва дар ин бора менависад.

Vite чӣ сохт

my-react-app/ ├─ index.html ягона саҳифаи HTML; дар дохил — <div id="root">-и холӣ ├─ package.json react ва react-dom дар dependencies; скриптҳои dev / build / preview ├─ vite.config.js плагини React-ро пайваст мекунад: он JSX-ро хонда метавонад ├─ .gitignore аллакай node_modules ва dist-ро дорад ├─ public/ файлҳо «чӣ ҳастанд» (нишони сайт) └─ src/ ├─ main.jsx нуқтаи вуруд: React-ро ба саҳифа «шинондан» ├─ App.jsx компоненти асосӣ — коди худро инҷо менависем ├─ App.css услубҳои App ├─ index.css услубҳои умумии саҳифа └─ assets/ тасвирҳое, ки аз JS ворид мешаванд

Маҷмӯи дақиқи файлҳо аз версияи қолаб вобаста аст (масалан, он ҷо танзимоти линтер буда метавонад), аммо се файл ҳамеша якхелаанд: index.html, src/main.jsx ва src/App.jsx. Онҳоро аз рӯи занҷира дида мебароем.

Занҷираи оғоз: index.html → main.jsx → App.jsx

index.html (порча)
<body>
  <div id="root"></div>
  <script type="module" src="/src/main.jsx"></script>
</body>

Саҳифа холӣ аст: танҳо контейнери #root ва модули пайвастшудаи main.jsx. Ҳама чизи дигарро React мекашад.

src/main.jsx
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <App />
  </StrictMode>,
)
  1. import … from 'react-dom/client' — қисми React-ро пайваст мекунем, ки бо DOM-и браузер кор карда метавонад. Ном бе ./ — ин бастаест аз node_modules (дарси 17).
  2. import App from './App.jsx' — компоненти асосиро аз файли ҳамсоя мегирем. Он тавассути export default содир шудааст, бинобар ин дар воридот қавсҳои фигурӣ нестанд.
  3. document.getElementById('root') — шиноси кӯҳна: контейнерро аз index.html меёбем. Ин охирин маротибаест, ки Шумо унсурро дар DOM бо даст меҷӯед.
  4. createRoot(…).render(…) — «компоненти <App />-ро дар дохили ин контейнер бикаш». Минбаъд React аз паси тамоми DOM мебарояд.
  5. StrictMode — реҷаи ишораҳо барои таҳия: он қасдан компонентҳоро ду маротиба даъват мекунад, то хатоҳоро зудтар ошкор кунад. Дар сайти ҷамъшуда (npm run build) ин нест.
Чаро console.log дар компонент ду маротиба чоп мешавад

Агар дар лоиҳаи Vite console.log("render Header")-ро дар дохили компонент нависед, ду сатри якхеларо мебинед. Ин хато нест: StrictMode дар реҷаи таҳия ин тавр кор мекунад. Дар қуттии регии курс он нест, бинобар ин инҷо ҳар сатр як маротиба чоп мешавад. Дар ин бора муфассалтар дар дарси 24 сӯҳбат мекунем.

src/App.jsx (он чӣ дар қолаб мебинед — мухтасар)
import { useState } from 'react'
import './App.css'

function App() {
  const [count, setCount] = useState(0)

  return (
    <>
      <h1>Get started</h1>
      <button onClick={() => setCount((count) => count + 1)}>
        Count is {count}
      </button>
    </>
  )
}

export default App

Дар қолаб аллакай ҳисобкунак бо useState ҳаст — ин мавзӯи дарси 23 аст, имрӯз он ба мо лозим нест. Аввалин коре, ки бо лоиҳаи нав мекунанд, — қолабро тоза кардан аст.

Қолабро тоза мекунем

  1. Тасвирҳоро аз src/assets/ нест кунед (ва воридотҳои онҳоро дар App.jsx).
  2. src/App.css-ро тоза кунед (холӣ гузоред) — услубҳои худро баъдтар менависем.
  3. Мундариҷаи src/App.jsx-ро ба компоненти ҳадди ақал иваз кунед:
src/App.jsx — оғози тоза
function App() {
  return (
    <div>
      <h1>Привет, MakeFirstStep!</h1>
    </div>
  )
}

export default App

Нигоҳ доред: дар браузер сарлавҳаи Шумо пайдо мешавад. Мо function App() ва бо сатри алоҳида export default App менависем — қолаби Vite маҳз ҳамин тавр мекунад, ва қуттии регӣ дар саҳифа варианти кӯтоҳи export default function App()-ро иҷозат медиҳад. Ҳарду вариант як чизро мекунанд.

Амалиёт: мустаҳкам мекунем

ВАЗИФАИ 3.1

package.json-ро бихонед

осон

Дар поён — package.json-и лоиҳаи нав, ки бо сатр навишта шудааст. Онро тавассути JSON.parse таҳлил кунед ва се сатр чоп кунед: номи лоиҳа, фармони скрипти dev ва рӯйхати вобастагиҳо (dependencies) бо вергул.

Таҳрир кардан мумкин аст · Ctrl + Enter
const raw = `{
  "name": "my-react-app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" },
  "dependencies": { "react": "^19.2.8", "react-dom": "^19.2.8" },
  "devDependencies": { "@vitejs/plugin-react": "^6.1.1", "vite": "^8.3.0" }
}`;

const pkg = JSON.parse(raw);

// TODO: номи лоиҳа
// TODO: фармони dev
// TODO: номҳои вобастагиҳо бо вергул
Натиҷаи интизоршаванда
my-react-app
vite
react, react-dom
Ишора 1

Ном — pkg.name, фармон — pkg.scripts.dev. Ҳар кадомро тавассути console.log чоп кунед.

Ишора 2

Номҳои вобастагиҳо — ин калидҳои объект аст: Object.keys(pkg.dependencies).join(", ").

ВАЗИФАИ 3.2

Тартиби фармонҳо

миёна

Омӯзгор фармонҳоро омехта диктант кард. Массиви typed-ро бо тартиби дурусти оғози лоиҳа ҷудо кунед, ба массиви order такя карда: фармон ба ҷои он оғозе аз order меистад, ки аз он сар мешавад. Фармонҳоро яке-яке дар як сатр чоп кунед.

Таҳрир кардан мумкин аст · Ctrl + Enter
const order = ["npm create", "cd", "npm install", "npm run dev"];

const typed = [
  "npm run dev",
  "cd my-react-app",
  "npm create vite@latest my-react-app -- --template react",
  "npm install",
];

// TODO: typed-ро аз рӯи тартиби order ҷудо кунед ва чоп кунед
Натиҷаи интизоршаванда
npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
npm run dev
Ишора 1

Функсия лозим аст, ки аз рӯи фармон мавқеи онро меёбад: order.findIndex((start) => cmd.startsWith(start)). Аз рӯи ҳамин мавқеъ ҷудо мекунем.

Ишора 2

Эҳтиёт шавед: "npm install" ва "npm run dev" ҳарду бо "npm " оғоз мешаванд, аммо дар order оғозҳои дарозтар меистанд — онҳо фарқ мекунанд. typed.sort((a, b) => pos(a) - pos(b))-ро истифода баред, ки дар он pos — функсияи мавқеи Шумо.

Муфассал хонед: vite.dev — Scaffolding Your First Vite Project · react.dev — Build a React app from Scratch

04 JSX: ба HTML монанд, аммо HTML нест

JSX — ин роҳи навиштани аломатгузорӣ бевосита дар дохили JavaScript аст. Браузер JSX-ро намефаҳмад: Vite (ва дар қуттии регии мо — компилятори дарунсохт) ҳар тегро ба даъвати функсия табдил медиҳад. Барои Шумо ин маънои яктоиро дорад: JSX — ин JavaScript аст, пас қоидаҳояш аз HTML сахттаранд.

Шумо чӣ менависед ва он ба чӣ табдил меёбад (содда)
// Шумо менависед:
const title = <h1 className="big">Салом</h1>;

// ҷамъкунанда ба JS-и оддӣ табдил медиҳад:
const title = jsx("h1", { className: "big", children: "Салом" });
Монанд аз ҳаёт

HTML — ин нутқи гуфтугӯӣ: калимаро партофтан, вергулро ҳар ҷо гузоштан мумкин аст, ва ба ҳар ҳол мефаҳманд. JSX — аризаи расмӣ: ҳар таг пӯшида, ҳуҷҷат як сарлавҳа дорад, ҳамаи калимаҳо дар шакли лозимӣ. Аммо ариза худкор санҷида мешавад. Бинобар ин JSX дар бораи ғалатии имло фавран шикоят мекунад, ва браузер хомӯшона «тахмин мекунад».

Шаш фарқи JSX аз HTML

HTMLJSXЧаро
class="card"className="card"class — калимаи захирашудаи JS
for="name"htmlFor="name"for — ин дар JS давра аст
<br>, <img …>, <input …><br />, <img … />, <input … />Дар JSX ҳар таг ҳатман бояд пӯшида шавад
Якчанд унсур пай дар пайЯк унсури реша ё <>…</>Функсия як қимат бармегардонад
Матн ва рақамҳо «чӣ ҳастанд»{ифода} дар қавсҳои фигурӣИн тавр қиматҳои JS ба аломатгузорӣ меафтанд
style="color: red"style={{ color: "red" }}Услуб — ин объект аст, хосиятҳо дар camelCase

1–3. className, htmlFor ва тегҳои пӯшида

Шакл дар JSX · Ctrl + Enter
export default function App() {
  return (
    <form className="signup">
      <label htmlFor="name">Ваше имя</label>
      <input id="name" type="text" placeholder="Мадина" />
      <br />
      <button type="button">Записаться</button>
    </form>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Дар консол намоён аст, ки дар аломатгузории ниҳоӣ ҳама чиз HTML-и оддӣ шуд: class, for. className-ро ба class иваз кунед ва оғоз намоед: дар React 19 саҳифа ҳанӯз кор мекунад, аммо ин хатои услуб ҳисоб мешавад — дар JSX-и дуруст className менависем.

Хатои маъмул: таги пӯшиданашуда

Дар HTML <input> ва <br>-ро пӯшидан лозим нест. Дар JSX — лозим аст, вагарна компилятор бо хато мемонад.

Ин хато аст: Unexpected token / Unterminated JSX contents
<div>
  <input type="text">     {/* ✖ таг пӯшида нашудааст */}
  <br>                    {/* ✖ ва ин ҳам */}
</div>

<div>
  <input type="text" />   {/* ✓ */}
  <br />                  {/* ✓ */}
</div>

4. Як унсури реша

Компонент — ин функсия аст, ва функсия як қимат бармегардонад. Бинобар ин ду тегро паҳлӯ ба паҳлӯ баргардондан мумкин нест: онҳоро печондан лозим аст. Агар <div>-и зиёдатӣ лозим набошад, фрагмент — тегҳои холии <>…</>-ро истифода мебаранд. Он кӯдаконро гурӯҳбандӣ мекунад, аммо дар HTML-и ниҳоӣ чизе илова намекунад.

Ду версия: бо div ва бо фрагмент
// ✖ хато: "Adjacent JSX elements must be wrapped in an enclosing tag"
return (
  <h2>Расписание</h2>
  <p>Пн, Ср, Пт — 18:00</p>
);

// ✓ бо печонанда
return (
  <div>
    <h2>Расписание</h2>
    <p>Пн, Ср, Пт — 18:00</p>
  </div>
);

// ✓ бо фрагмент: div-и зиёдатӣ дар HTML нахоҳад буд
return (
  <>
    <h2>Расписание</h2>
    <p>Пн, Ср, Пт — 18:00</p>
  </>
);

Қавсҳои мудаввар пас аз return на барои React, балки барои JavaScript лозиманд: агар пас аз return бе қавсҳо ба сатри нав гузаред, JS мепиндорад, ки баргардондан чизе нест (return;), ва undefined-ро бармегардонад. Қавсҳо — суғурта барои аломатгузории бисёрсатра.

5. Қавсҳои фигурӣ: JavaScript дар дохили аломатгузорӣ

Ҳар чизе, ки дар дохили { } аст, — ифодаи JS-и оддӣ мебошад: тағйирёбанда, арифметика, даъвати функсия, оператори сегона ? :. Натиҷа ба аломатгузорӣ гузошта мешавад. Қавсҳоро ҳам дар матн ва ҳам дар қимати атрибут гузоштан мумкин аст.

Ифодаҳо дар {…} · Ctrl + Enter
export default function App() {
  const student = "Мадина";
  const lessons = 24;
  const hour = 19;

  return (
    <div className="box" title={"Студент " + student}>
      <h2>Салом, {student}!</h2>
      <p>Осталось уроков: {lessons - 22}</p>
      <p>Имя в верхнем регистре: {student.toUpperCase()}</p>
      <p>{hour < 20 ? "Занятия ещё идут" : "Занятия закончились"}</p>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Дар {…} мумкин аст
Тағйирёбандаҳо, рақамҳо, сатрҳо, арифметика, даъватҳои функсияҳо, ? :, &&, ||, методҳои сатрҳо ва массивҳо.
Дар {…} мумкин нест
Дастурҳо: if, for, const x = …. Ин ифодаҳо нестанд. Шартро дар дохили аломатгузорӣ тавассути ? : ё && менависем; ва if ва тағйирёбандаҳо — боло, пеш аз return.
Шарҳ дар JSX
{/* ин тавр */} — ин ифодаи холӣ бо шарҳ дар дохил аст. // …-и оддӣ дар дохили аломатгузорӣ ба матн дар саҳифа табдил меёбад.

React чиро мекашад ва чиро не

Қиматҳои true, false, null ва undefined-ро React умуман нишон намедиҳад — намоиши шартӣ ба ҳамин асос ёфтааст. Аммо рақами 0 нишон дода мешавад, ва дар ин бора аксар фаромӯш мекунанд.

Чӣ нест мешавад ва чӣ не · Ctrl + Enter
export default function App() {
  const isOpen = true;
  const messages = 0;

  return (
    <div>
      <p>true: [{true}]</p>
      <p>null: [{null}]</p>
      <p>0: [{0}]</p>
      <p>{isOpen && "Мы открыты"}</p>
      <p>Новых сообщений: {messages && <b>есть</b>}</p>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Дар сатри охирин Шумо холигиро интизор будед, ва 0 гирифтед: ифодаи 0 && … ба 0 баробар аст, ва сифрро React мекашад. Варианти бехатар — шартро булии ҳақиқӣ кардан: messages > 0 && … ё оператори сегона.

6. style — ин объект аст

Дар HTML услуб — сатр аст. Дар JSX style объект мегирад, яъне қавсҳои фигурӣ дукарата мешаванд: берунӣ — «инҷо JS», дарунӣ — худи объект. Хосиятҳо дар camelCase навишта мешаванд (backgroundColor), рақамҳо бе воҳид ҳамчун пиксел ҳисоб мешаванд.

style ҳамчун объект · Ctrl + Enter
export default function App() {
  const badge = {
    backgroundColor: "gold",
    padding: 8,
    borderRadius: 8,
    fontWeight: "bold",
  };

  return (
    <div>
      <p style={badge}>Новинка</p>
      <p style={{ color: "crimson", fontSize: 20 }}>Скидка 10%</p>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Барои тарроҳии асосӣ ба ҳар ҳол классҳои CSS-ро истифода баред (className + style.css): style вақте муфид мешавад, ки қимат аз маълумот ҳисоб карда мешавад (бари пешрафт, ранг аз рӯи шарт).

Ишораи ЗС

HTML-и аз интернет нусхашуда — сарчашмаи асосии хатоҳои JSX мебошад. Агар аломатгузории тайёрро часпонда бошед ва саҳифа кушода нашавад, аз ЗС бипурсед: «Ин HTML-ро ба JSX табдил деҳ: class ва for-ро иваз кун, тегҳои танҳоро пӯш, услубҳои сатриро ба объектҳо табдил деҳ, ба як реша печон. Номбар кун, ки чиро тағйир додӣ». Рӯйхати тағйиротро бо ҷадвали боло муқоиса кунед — ин тавр қоидаҳоро фавран ба ёд мегиред.

Амалиёт: мустаҳкам мекунем

ВАЗИФАИ 4.1

HTML-ро ба JSX табдил диҳед

осон

Дар поён — аломатгузории тайёри HTML. Онро ба JSX дар дохили <div className="form"> табдил диҳед: class ва for-ро иваз кунед, тегҳои танҳоро пӯшед.

JavaScript
<label for="name">Ваше имя</label>
<input id="name" type="text" placeholder="Мадина">
<br>
<p class="hint">Мы перезвоним</p>
HTML → JSX · Ctrl + Enter
export default function App() {
  return (
    <div className="form">
      {/* TODO: аломатгузориро инҷо ба намуди JSX гузоред */}
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div class="form">
<label for="name">Ваше имя</label>
<input id="name" placeholder="Мадина" type="text">
<br>
<p class="hint">Мы перезвоним</p>
</div>
Ишора 1

Чор ивазкунӣ: for → htmlFor, class → className, <input …> → <input … />, <br> → <br />.

Ишора 2

Ҷойгиркунандаи шарҳи {/* … */}-ро бо чор сатри аломатгузорӣ иваз кунед. Тартиби атрибутҳоро мисли дар HTML гузоред.

ВАЗИФАИ 4.2

Қиматҳоро ҷойгир кунед

осон

Ба ҷои аломатҳои ??? ифодаҳоро дар қавсҳои фигурӣ ҷойгир кунед: номи донишҷӯ, нархи курс ва нархи як дарс (нарх ба шумораи дарсҳо тақсим шуда). Рақамҳоро бо даст навиштан мумкин нест — танҳо тағйирёбандаҳо ва арифметика.

Ифодаҳо дар JSX · Ctrl + Enter
export default function App() {
  const student = "Мадина";
  const price = 480;
  const lessons = 24;

  return (
    <div>
      <h2>Добро пожаловать, ???!</h2>
      <p>Курс стоит ??? сомони, это ??? сомони за урок.</p>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div>
<h2>Добро пожаловать, Мадина!</h2>
<p>Курс стоит 480 сомони, это 20 сомони за урок.</p>
</div>
Ишора 1

Ҳар як ??? ба {student}, {price} ва ғайра иваз мешавад. Матни гирду атроф чӣ ҳаст, ҳамон мемонад.

Ишора 2

Нархи як дарс — ифода бевосита дар қавсҳо: {price / lessons}.

ВАЗИФАИ 4.3

Хаторо ёбед: сатри style

миёна

Корти аксия бо хато нишон дода мешавад. Тавре ислоҳ кунед, ки услуб татбиқ шавад: онро ба объект табдил диҳед (хосиятҳо дар camelCase, рақами 12 — пиксел).

Аксияи ҳафта · Ctrl + Enter
export default function App() {
  return (
    <div style="background-color: gold; padding: 12px; border-radius: 8px;">
      Акция недели
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div style="background-color: gold; padding: 12px; border-radius: 8px;">Акция недели</div>
Ишора 1

Дар консол «Minified React error #62» мешавад — ин маҳз дар бораи style аст: React объект интизор буд, ва сатр гирифт. Қавсҳои фигурии дукарата лозиманд: style={{ … }}.

Ишора 2

style={{ backgroundColor: "gold", padding: 12, borderRadius: 8 }} — тартиби хосиятҳоро ҳамон тавр гузоред, ки дар сатр аст.

ВАЗИФАИ 4.4

Хаторо ёбед: ду реша

миёна

Компонент ду унсурро пай дар пай бармегардонад, ва саҳифа оғоз намешавад. Бе div-и зиёдатӣ ислоҳ кунед — дар HTML-и ниҳоӣ бояд танҳо h2 ва p монад.

Ҷадвали дарсҳо · Ctrl + Enter
export default function App() {
  return (
    <h2>Расписание</h2>
    <p>Пн, Ср, Пт — 18:00</p>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<h2>Расписание</h2>
<p>Пн, Ср, Пт — 18:00</p>
Ишора 1

Печонанда лозим аст, ки ба HTML намеафтад. Чунин печонандаи «номаълум» чӣ ном дорад?

Ишора 2

Фрагмент: <>-ро пеш аз h2 кушоед ва </>-ро пас аз p пӯшед.

ВАЗИФАИ 4.5

Пешбинӣ кунед: React чиро мекашад

осон

Пешбинӣ кунед, ки React дар сархат чиро нишон медиҳад: дар prediction тамоми матни сархатро чунон нависед, ки дар саҳифа пайдо мешавад (қавсҳои холии [] маънои «чизе кашида нашуд»-ро доранд). Баъд оғоз кунед — код худаш ҷавоби Шуморо бо ҳақиқӣ муқоиса мекунад.

Чиро React мекашад · Ctrl + Enter
const prediction = "";   // масалан: "[1] [] [x] …" — дар ҳар ҷуфти қавс як қимат

export default function App() {
  return (
    <p>
      [{5 + 3}] [{false}] [{null}] [{0}] [{"a" + "b"}] [{true ? "да" : "нет"}] [{undefined}] [{10 > 5}]
    </p>
  );
}

// санҷиши худкор: пешгӯии Шуморо бо он чӣ React сохтааст, муқоиса мекунад
setTimeout(() => console.log(document.getElementById("root").textContent.trim() === prediction.trim() ? "Верно!" : "Не угадали, подумайте ещё"), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
Верно!
Ишора 1

Чор қимат кашида намешаванд: true, false, null, undefined. Рақами 0 кашида мешавад.

Ишора 2

Ифодаи 10 > 5 ба true баробар аст, ва true-ро React нишон намедиҳад.

ВАЗИФАИ 4.6

Доми сифр

душвор

Дар сабад холӣ аст, аммо ба ҷои ҳеҷ чиз дар саҳифа сифр пайдо шуд. Тавре ислоҳ кунед, ки ҳангоми сабади холӣ <p>Корзина пуста</p>, ва ҳангоми ғайриҳолӣ — <p>Товаров: N</p> чоп шавад. Баъд cart-ро ба ["Самбуса", "Чой"] иваз кунед ва боварӣ ҳосил кунед, ки «Товаров: 2» нишон дода мешавад (пас аз санҷиш массиви холиро баргардонед).

Сабад · Ctrl + Enter
const cart = [];

export default function App() {
  return (
    <div>
      <h3>Корзина</h3>
      {cart.length && <p>Товаров: {cart.length}</p>}
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div>
<h3>Корзина</h3>
<p>Корзина пуста</p>
</div>
Ишора 1

0 && … 0 медиҳад, ва сифрро React мекашад. Оператори сегона лозим аст: шарт ? А : Б — он яке аз ду шохаро интихоб мекунад.

Ишора 2

{cart.length > 0 ? <p>Товаров: {cart.length}</p> : <p>Корзина пуста</p>}

Муфассал хонед: react.dev — Writing Markup with JSX · react.dev — JavaScript in JSX with Curly Braces · react.dev — Conditional Rendering

05 App.jsx: содир ва ворид кардани компонентҳо

То ҳол компонентҳо дар як файл меистоданд. Дар лоиҳаи воқеӣ ин тавр намекунанд: як компонент — як файл. Ин ҳамон модулҳои дарси 17 аст: як файл функсияро содир мекунад, файли дигар онро ворид мекунад. Барои компонентҳо export default маъмул аст.

Сохтори лоиҳа бо компонентҳо

src/ ├─ main.jsx ├─ App.jsx саҳифаро аз компонентҳо ҷамъ мекунад └─ components/ ├─ Header.jsx export default function Header() ├─ CourseCard.jsx export default function CourseCard() └─ Footer.jsx export default function Footer()
  • Номи файл = номи компонент, бо ҳарфи калон: Header.jsx, CourseCard.jsx.
  • Пасванди .jsx — нишонаи он аст, ки дар дохил JSX ҳаст. Vite онро барои файлҳои дорои аломатгузорӣ талаб мекунад.
  • Папкаи components — танҳо мувофиқа аст, то ҳама чизро дар src/ нарезем.

Ин дар файлҳо чӣ тавр менамояд

src/components/Header.jsx
export default function Header() {
  return (
    <header className="top">
      <h1>MakeFirstStep</h1>
    </header>
  )
}
src/components/Footer.jsx
export default function Footer() {
  return <footer>© MakeFirstStep, Душанбе</footer>
}
src/App.jsx
import Header from './components/Header.jsx'
import Footer from './components/Footer.jsx'

export default function App() {
  return (
    <div className="page">
      <Header />
      <main>Здесь будут курсы</main>
      <Footer />
    </div>
  )
}

Сатри import Header from './components/Header.jsx' чунин хонда мешавад: «он чизеро, ки Header.jsx бо пешфарз содир мекунад, гир ва Header ном бигузор». Роҳ бо ./ оғоз мешавад (дар паҳлуи ин файл), пасванди .jsx-ро пурра менависем — чунон ки дар дарси 17 мувофиқа кардем. Агар export default намебуд — ворид кардан чизе намебуд.

Монанд аз ҳаёт

Ошхонаи тарабхонаи калон. Салатҳоро бахши сард мекунад, хӯроки гармро бахши гарм, ширинӣро қаннодӣ. Ҳар бахш дар ҳуҷраи худ (файл) кор мекунад ва хӯроки тайёрро медиҳад (содир кардан). Пешхизмати ҷамъкунанда (App.jsx) чизе намепазад: ӯ хӯрокҳоро аз бахшҳо мегирад (ворид кардан) ва аз онҳо фармоишро дар рӯи миз ташкил медиҳад. Бахшҳоро омехта кардан мумкин нест, ва ошпази нав ба бахши мушаххас меояд, на ба тамоми ошхона якбора.

Содири номдор низ кор мекунад

Ду усул — як дона интихоб кунед ва ба он вафодор бошед
// 1) бо пешфарз — як компонент дар як файл (интихоби мо)
export default function Header() { … }
import Header from './components/Header.jsx'

// 2) номдор — якчанд донаро аз як файл содир кардан мумкин аст
export function Header() { … }
import { Header } from './components/Header.jsx'

Асосӣ — он аст, ки содир ва ворид аз рӯи сабк мувофиқ бошанд: дар export default воридот бе қавс аст, дар номдор — бо қавс. Дар ин курс компонентҳоро бо пешфарз содир мекунем.

Се хатои маъмули воридот

1) export default-ро фаромӯш кардаед — хатои «does not provide an export named 'default'». 2) Бе ./ ворид кардаед: import Header from 'components/Header.jsx' — Vite чунин бастаро дар node_modules меҷӯяд ва намеёбад. 3) Компонентро дар воридот бо ҳарфи хурд ном додаед: import header from … — таг мешавад, на компоненти Шумо (нигаред ба бахши 02).

Як компонент — бисёр маротиба

Фоидаи асосии компонентҳо — истифодаи такрорӣ аст: як маротиба эълон кардед, ба қадри лозим ҷойгир кардед. Компонентро тағйир додед — ҳамаи нусхаҳо тағйир ёфтанд.

Як компонент, се нусха · Ctrl + Enter
function CourseCard() {
  return (
    <article className="card">
      <h3>JavaScript</h3>
      <p>24 урока</p>
    </article>
  );
}

export default function App() {
  return (
    <main className="grid">
      <CourseCard />
      <CourseCard />
      <CourseCard />
    </main>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Матни дохили CourseCard-ро тағйир диҳед — ҳар се корт тағйир меёбад. Фавран савол пайдо мешавад: агар номҳои гуногун лозим бошанд — «HTML», «JavaScript», «React»? Барои ин компонентҳо props доранд, мо онҳоро дар дарси оянда таҳлил мекунем.

Як дарс пештар нигоҳ мекунем

Ду калимаи аз ҳама муҳими дарси 23: props — параметрҳои компонент (мисли параметрҳои функсия аз дарси 5) ва useState — хотираи компонент, ки React-ро маҷбур мекунад ҳангоми тағйири маълумот экранро аз нав бикашад. Тугмаро пахш кунед ва бинед — кодро ҳоло танҳо хонед, шарҳи онро дар машғулоти оянда медиҳем.

Тизери дарси 23: ҳисобкунак · Ctrl + Enter
import { useState } from "react";

export default function App() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Нажато раз: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.

Бо дарси 11 муқоиса кунед: он ҷо state, render(), querySelector ва addEventListener буданд. Инҷо — як компонент, ва ягон сатр дар бораи ҷустуҷӯи унсурҳо нест. Маълумот дар count меистад, экран дар return тавсиф шудааст, ва пайвасти «маълумотро тағйир додем → аз нав кашидем»-ро React худаш таъмин мекунад.

Амалиёт: мустаҳкам мекунем

ВАЗИФАИ 5.1

Сатрҳои воридот

осон

Функсияи importLine(name)-ро нависед, ки аз рӯи номи компонент сатри воридотро барои лоиҳаи Vite бармегардонад: файл дар ./components/ меистад, ҳамон ном ва пасванди .jsx-ро дорад, дар охир — нуқтавергул.

Таҳрир кардан мумкин аст · Ctrl + Enter
const components = ["Header", "CourseCard", "Footer"];

function importLine(name) {
  // TODO: сатри намуди import Ном from "./components/Ном.jsx"; баргардонед
  return "";
}

for (const name of components) {
  console.log(importLine(name));
}
Натиҷаи интизоршаванда
import Header from "./components/Header.jsx";
import CourseCard from "./components/CourseCard.jsx";
import Footer from "./components/Footer.jsx";
Ишора 1

Ном дар сатр ду маротиба вомехӯрад: пас аз import ва дар роҳ. Қулай аст, ки сатрро бо сатри қолабӣ дар зеркалимаҳои акс ҷамъ кунед.

Ишора 2

return `import ${name} from "./components/${name}.jsx";`;

ВАЗИФАИ 5.2

Нусхабардории бемаъниро нест кунед

миёна

Се корт дар App бо нусхабардорӣ навишта шудаанд, ва компоненти CourseCard эълон шудааст, аммо истифода намешавад. Се нусхаро бо се истифодаи <CourseCard /> иваз кунед. Санҷиш мебинад, ки компонент воқеан се маротиба даъват шуд: дар консол се сатри «CourseCard готов» бояд пайдо шавад.

Кортҳои курсҳо · Ctrl + Enter
function CourseCard() {
  console.log("CourseCard готов");
  return (
    <article className="card">
      <h3>JavaScript</h3>
      <p>24 урока</p>
    </article>
  );
}

export default function App() {
  return (
    <main>
      <article className="card">
        <h3>JavaScript</h3>
        <p>24 урока</p>
      </article>
      <article className="card">
        <h3>JavaScript</h3>
        <p>24 урока</p>
      </article>
      <article className="card">
        <h3>JavaScript</h3>
        <p>24 урока</p>
      </article>
    </main>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
CourseCard готов
CourseCard готов
CourseCard готов
<main>
<article class="card">
<h3>JavaScript</h3>
<p>24 урока</p>
</article>
<article class="card">
<h3>JavaScript</h3>
<p>24 урока</p>
</article>
<article class="card">
<h3>JavaScript</h3>
<p>24 урока</p>
</article>
</main>
Ишора 1

Дар дохили <main> бояд танҳо се таги компонент монад. Дар дохили онҳо чизе навиштан лозим нест: мундариҷа аллакай дар дохили функсия аст.

Ишора 2

<CourseCard /> — таги худпӯшанда бо ҳарфи калон. Онро се маротиба пай дар пай нависед.

ВАЗИФАИ 5.3

Чор компонент, яке дар дигаре

душвор

Саҳифаро аз чор компонент ҷамъ кунед: Logo (таги <span className="logo">MakeFirstStep</span>), Navbar (таги <nav>, дар дохил компоненти Logo ва истиноди <a href="#courses">Курсы</a>), Hero (<section className="hero"> бо сарлавҳаи h1 «Frontend + ИИ») ва Footer (<footer>© 2026 MakeFirstStep</footer>). Решаи App-ро фрагменти <>…</> кунед: Navbar, Hero, Footer бо тартиб.

Лендинг аз компонентҳо · Ctrl + Enter
// TODO: Logo, Navbar, Hero ва Footer-ро эълон кунед

export default function App() {
  return (
    <div>
      <p>Соберите страницу из компонентов</p>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<nav>
<span class="logo">MakeFirstStep</span>
<a href="#courses">Курсы</a>
</nav>
<section class="hero">
<h1>Frontend + ИИ</h1>
</section>
<footer>© 2026 MakeFirstStep</footer>
Ишора 1

Аввал Logo-ро эълон кунед — он ба Navbar лозим аст. Дар JS тартиби эълони функсияҳо муҳим нест, аммо хондан аз содда ба мураккаб қулайтар аст.

Ишора 2

Navbar <nav><Logo /><a href="#courses">Курсы</a></nav>-ро бармегардонад, ва App — <><Navbar /><Hero /><Footer /></>-ро.

Муфассал хонед: react.dev — Importing and Exporting Components · learn.javascript.ru — Содир ва ворид кардан

06 Блоки ЗС: JS-и шиносро ба React аз нав менависем

Беҳтарин роҳи фаҳмидани равиши нав — гирифтани коде аст, ки Шумо онро аллакай мефаҳмед, ва муқоиса кардани он бо версияи React. ЗС инҷо тарҷумон аст, ва Шумо — санҷанда. Шумо аслро медонед, пас фавран мебинед, ки тарҷума дар куҷо носаҳеҳ аст.

Қоидаҳои курс

1) Аввал 15 дақиқа худатон: кӯшиш кунед блокро ба JSX бе ишора аз нав нависед — дар қуттии регӣ ё дар лоиҳаи Vite. 2) Танҳо баъд промпт. 3) Кодеро, ки сатр ба сатр шарҳ дода наметавонед, ба лоиҳа нагузоред. 4) Натиҷаро иҷро месанҷад, на оҳанги боварибахши ЗС.

Блоки аслӣ бо JS-и тоза

Ин блоке монанд ба онҳое аст, ки Шумо дар дарсҳои 8 ва 11 навиштед: корти донишҷӯ бо даст сохта мешавад.

JavaScript
const app = document.querySelector("#app");
const student = { name: "Мадина", group: "JS-12", score: 87 };

const box = document.createElement("div");
box.className = "profile";

const h = document.createElement("h2");
h.textContent = student.name;

const p = document.createElement("p");
p.textContent = `Группа ${student.group}, баллы: ${student.score}`;

box.append(h, p);
app.append(box);

Промпти бад ва хуб

Дар React аз нав кун

Чаро бад аст: ЗС намедонад, ки Шумо дар куҷо меомӯзед, кадом абзорҳо доред, ва «ҳама чизро якбора» медиҳад — бо ҳолат, эффектҳо ва китобхонаҳои тарафи сеюм, ки мо ҳанӯз нагузаштаем. Ва Шумо шарҳҳо намегиред.

Контекст: ман навомӯзам, моҳи дуюм JavaScript меомӯзам, имрӯз бори аввал React-ро дидам. Лоиҳа дар Vite, қолаби React, JavaScript (на TypeScript), бе китобхонаҳои иловагӣ. Вазифа: инак коди JS-и тоза: [блоки болоро гузоред]. Онро ҳамчун як компоненти React-и App аз нав навис. Маҳдудиятҳо: танҳо аломатгузорӣ ва маълумот. Бе useState, useEffect ва коркардкунандаҳои ҳодиса. Бе document.querySelector ва createElement. Ҳеҷ бастаи нав. Формати ҷавоб: 1) коди компонент; 2) ҷадвали «сатр дар JS — чӣ ба ҷои он дар React омад» — барои ҳар сатри коди аслӣ як сатр; 3) се фарқи JSX аз HTML, ки дар ин мисол вомехӯранд. Санҷиш: бигӯ, ки навомӯзон ҳангоми чунин тарҷума кадом хатоҳоро бештар мекунанд.

Ин варианти густурдаи қолаби шпаргалкаи курс аст: «Инак коди JS-и тоза: [код]. Ҳамчун компоненти React аз нав навис ва сатр ба сатр шарҳ деҳ, ки чӣ ба ҷои querySelector ва addEventListener омад». Мо контекст, маҳдудиятҳо ва формат илова кардем — ва ҳодисаҳоро, ки дар дарси 23 пайдо мешаванд, хориҷ кардем.

ЗС бояд чӣ баргардонад

Ҷавоби ЗС (маъмулӣ)
export default function App() {
  const student = { name: "Мадина", group: "JS-12", score: 87 };

  return (
    <div className="profile">
      <h2>{student.name}</h2>
      <p>Группа {student.group}, баллы: {student.score}</p>
    </div>
  );
}

Таҳлили сатр ба сатр: чӣ ба ҷои чӣ омад

JS-и тозаReactЧӣ тағйир ёфт
document.querySelector("#app")— (нест)Контейнери #root-ро main.jsx меёбад, як маротиба дар тамоми лоиҳа
const student = { … }ҳамон сатрМаълумот — JS-и оддӣ, чизе тағйир намеёбад
createElement("div") + box.className = "profile"<div className="profile">Ба ҷои ду фармон — як таг; class ба className табдил ёфт
createElement("h2") + h.textContent = student.name<h2>{student.name}</h2>Ба ҷои textContent — қавсҳои фигурӣ бо ифода
Сатри қолабии `Группа ${…}`Группа {student.group}, …Матн ва қиматҳо бевосита дар аломатгузорӣ омехта мешаванд
box.append(h, p), app.append(box)дарунгузории тегҳоКӣ дар кӣ ҷойгир аст — аз рӯи канораҳо намоён аст, на аз рӯи даъватҳо
(нест)function App() { return … } ва export defaultБлок компонент шуд: онро ҳамчун <App /> гузоштан ва такроран истифода бурдан мумкин аст

Чек-лист: ҷавоби ЗС-ро чӣ тавр санҷидан лозим

  • Номҳои компонентҳо бо ҳарфи калон ҳам дар эълон ва ҳам дар истифода.
  • className, htmlFor, тегҳои пӯшида, як реша — ҷадвал аз бахши 04.
  • style — объект аст, на сатр.
  • Зиёдатӣ. Агар ЗС useState, useEffect, axios ё styled-components-ро илова карда бошад, гарчанде ки бе онҳо хоста будед, — бипурсед «ин ҷо барои чӣ?» ва хоҳиш кунед хориҷ кунад.
  • Оғоз. Ба қуттии регӣ ё лоиҳа гузоред ва консолро кушоед: хато нест, натиҷа бо аслӣ мувофиқ аст.

Амалиёт: мустаҳкам мекунем

ВАЗИФАИ 6.1

«Ҷавоби ЗС»-ро санҷед: чор хато

душвор

ЗС корти донишҷӯро ба React табдил дод, аммо чор хатои аз чек-лист содир кард. Ҳамаи онҳоро ёбед ва ислоҳ кунед. Саҳифа бояд корти донишҷӯро ва дар зери он сархати «Данные студента»-ро нишон диҳад. Пас аз ҳар ислоҳ оғоз кунед ва консолро хонед.

Ҷавоби ЗС бо хатоҳо · Ctrl + Enter
function profile() {
  const student = { name: "Мадина", group: "JS-12", score: 87 };
  return (
    <div class="profile" style="border: 1px solid gray">
      <h2>{student.name}</h2>
      <p>Группа {student.group}, баллы: {student.score}</p>
    </div>
  );
}

export default function App() {
  return (
    <profile />
    <p>Данные студента</p>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
<div class="profile" style="border: 1px solid gray;">
<h2>Мадина</h2>
<p>Группа JS-12, баллы: 87</p>
</div>
<p>Данные студента</p>
Ишора 1

Хатоҳо бо тартиб: номи компонент бо ҳарфи хурд; class ба ҷои className; style бо сатр; ду унсур дар return бе печонандаи умумӣ.

Ишора 2

function Profile ва <Profile />; className="profile"; style={{ border: "1px solid gray" }}; дар App ду унсурро ба <>…</> печонед.

ВАЗИФАИ 6.2

Дархости воқеӣ ба ЗС

миёна

Блоки худро аз дарси 8 ё 11 гиред (корт, банди рӯйхат, сарлавҳаи саҳифа) — танҳо бе коркардкунандаҳои ҳодиса. Аввал 15 дақиқа онро худатон ба JSX аз нав нависед. Баъд ба ЗС промптро аз рӯи намунаи боло бо коди худ фиристед, ҷавоб гиред ва ҷадвали «сатр дар JS — чӣ дар React — чӣ тағйир ёфт»-ро тартиб диҳед (мисли дар таҳлили боло). Натиҷаро ба қуттии регӣ гузоред, оғоз кунед, боварӣ ҳосил намоед, ки экран бо аслӣ мувофиқ шуд. Ин вазифаро омӯзгор месанҷад — онро худатон қайд кунед, вақте ки анҷом додед.

Ишора 1

Агар ҷавоби ЗС оғоз нашавад, «ислоҳ кун»-ро кӯркӯрона наталабед: матни хаторо аз консол нусха кунед ва бипурсед, ки он чӣ маъно дорад ва сабаб дар кадом сатр аст.

Ишора 2

Ҷадвалро дар файли NOTES.md пеш бурдан қулай аст — он дар вазифаи хонагӣ муфид мешавад.

Муфассал хонед: react.dev — Writing Markup with JSX

07 Амалиёт дар дарс: саҳифаро ба компонентҳо тақсим мекунем

Саҳифаи тайёри «MakeFirstStep»-ро, ки пурра дар як компоненти App навишта шудааст, мегирем ва онро ба компонентҳо мебурем. Се марҳала аст, ҳар кадом бо санҷиш дар консол анҷом меёбад. Дар охир Шумо ҳамин корро дар лоиҳаи воқеии Vite такрор мекунед — аллакай аз рӯи файлҳои алоҳида.

Марҳалаи 1Header-ро ҷудо кардан
→
Марҳалаи 2Courses-ро ҷудо кардан
→
Марҳалаи 3Footer ва Nav-ро ҷудо кардан (дар дохили Header)
HTML дар баромад ҳамон мемонад. Танҳо тарзи ҷамъ кардани саҳифа тағйир меёбад
«Тақсимкунӣ» чӣ тавр санҷида мешавад

Аломатгузории ниҳоӣ ҳангоми тақсимкунӣ тағйир намеёбад — бинобар ин санҷиш ба сатрҳои render … ҳам менигарад. Ҳар компоненти нав бояд бо сатри аввал номи худро чоп кунад: console.log("render Header"). React компонентҳоро бо тартиби «аз боло ба поён, ба умқ» даъват мекунад, пас дар консол Шумо тартиби даъватҳоро мебинед — ва фавран мефаҳмед, ки код воқеан ба компонентҳо бурида шудааст, на танҳо аз нав навишта шудааст.

Марҳалаи 1. Header-ро ҷудо мекунем

Порчаи <header>…</header>-ро ба функсияи алоҳидаи Header интиқол диҳед ва ба ҷои он <Header /> гузоред.

ВАЗИФАИ 7.1

Марҳалаи 1: компоненти Header

миёна

Компоненти Header-ро бо сатри аввали console.log("render Header") эҷод кунед. Дар он — тамоми сарлавҳа (сарлавҳа ва nav бо истинодҳо). Дар App ба ҷои сарлавҳа <Header /> гузоред. Боқиро даст нарасонед.

Саҳифаи MakeFirstStep: марҳалаи 1 · Ctrl + Enter
// TODO: компоненти Header-ро эълон кунед

export default function App() {
  console.log("render App");
  return (
    <div className="page">
      <header className="top">
        <h1>MakeFirstStep</h1>
        <nav>
          <a href="#courses">Курсы</a>
          <a href="#contacts">Контакты</a>
        </nav>
      </header>
      <main id="courses">
        <h2>Наши курсы</h2>
        <ul>
          <li>HTML и CSS</li>
          <li>JavaScript</li>
          <li>React</li>
        </ul>
      </main>
      <footer id="contacts">Душанбе · MakeFirstStep</footer>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
render App
render Header
<div class="page">
<header class="top">
<h1>MakeFirstStep</h1>
<nav>
<a href="#courses">Курсы</a>
<a href="#contacts">Контакты</a>
</nav>
</header>
<main id="courses">
<h2>Наши курсы</h2>
<ul>
<li>HTML и CSS</li>
<li>JavaScript</li>
<li>React</li>
</ul>
</main>
<footer id="contacts">Душанбе · MakeFirstStep</footer>
</div>
Ишора 1

Намуна — компонентҳо аз бахши 02. function Header() { console.log("render Header"); return ( … ); } — ба return тамоми теги <header>-ро якҷоя бо мундариҷа гузоред.

Ишора 2

Дар App ба ҷои сарлавҳа як сатри <Header /> мемонад. Ҳар чизе, ки дар дохили header буд, ҳоло дар функсияи Header зиндагӣ мекунад.

Марҳалаи 2. Courses-ро ҷудо мекунем

Акнун ҳамин корро бо блоки курсҳо. Он Courses номида мешавад.

ВАЗИФАИ 7.2

Марҳалаи 2: компоненти Courses

миёна

Header аллакай ҷудо шудааст. Блоки <main>-ро ба компоненти Courses бо сатри аввали console.log("render Courses") ҷудо кунед ва <Courses />-ро ба App гузоред.

Саҳифаи MakeFirstStep: марҳалаи 2 · Ctrl + Enter
function Header() {
  console.log("render Header");
  return (
    <header className="top">
      <h1>MakeFirstStep</h1>
      <nav>
        <a href="#courses">Курсы</a>
        <a href="#contacts">Контакты</a>
      </nav>
    </header>
  );
}

// TODO: компоненти Courses-ро эълон кунед

export default function App() {
  console.log("render App");
  return (
    <div className="page">
      <Header />
      <main id="courses">
        <h2>Наши курсы</h2>
        <ul>
          <li>HTML и CSS</li>
          <li>JavaScript</li>
          <li>React</li>
        </ul>
      </main>
      <footer id="contacts">Душанбе · MakeFirstStep</footer>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
render App
render Header
render Courses
<div class="page">
<header class="top">
<h1>MakeFirstStep</h1>
<nav>
<a href="#courses">Курсы</a>
<a href="#contacts">Контакты</a>
</nav>
</header>
<main id="courses">
<h2>Наши курсы</h2>
<ul>
<li>HTML и CSS</li>
<li>JavaScript</li>
<li>React</li>
</ul>
</main>
<footer id="contacts">Душанбе · MakeFirstStep</footer>
</div>
Ишора 1

Мисли бо Header амал кунед: функсия бо ҳарфи калон, console.log бо сатри аввал, тамоми теги <main> — ба return.

Ишора 2

Тартиби сатрҳо дар консол — тартиби даъвати компонентҳо аст: аввал App, баъд фарзандонаш навбат ба навбат — Header, баъд Courses.

Марҳалаи 3. Footer ва Nav-и дарунгузошта

Компонент метавонад компоненти дигарро дар бар гирад. Дар сарлавҳа менюро ба Nav-и алоҳида ҷудо мекунем — дарахти бахши 02 ҳосил мешавад.

ВАЗИФАИ 7.3

Марҳалаи 3: Footer ва Nav дар дохили Header

душвор

<footer>-ро ба компоненти Footer, ва <nav>-ро аз сарлавҳа — ба компоненти Nav ҷудо кунед, ки дар дохили Header истифода мешавад. Дар ҳар кадом console.log("render Footer") ва console.log("render Nav")-и нав бо сатри аввал. Дар натиҷа дар консол тартиби даъватҳо: App, Header, Nav, Courses, Footer.

Саҳифаи MakeFirstStep: марҳалаи 3 · Ctrl + Enter
// TODO: Nav ва Footer-ро эълон кунед

function Header() {
  console.log("render Header");
  return (
    <header className="top">
      <h1>MakeFirstStep</h1>
      <nav>
        <a href="#courses">Курсы</a>
        <a href="#contacts">Контакты</a>
      </nav>
    </header>
  );
}

function Courses() {
  console.log("render Courses");
  return (
    <main id="courses">
      <h2>Наши курсы</h2>
      <ul>
        <li>HTML и CSS</li>
        <li>JavaScript</li>
        <li>React</li>
      </ul>
    </main>
  );
}

export default function App() {
  console.log("render App");
  return (
    <div className="page">
      <Header />
      <Courses />
      <footer id="contacts">Душанбе · MakeFirstStep</footer>
    </div>
  );
}

// санҷиши худкор: аломатгузориро, ки React сохтааст, чоп мекунад
setTimeout(() => console.log(document.getElementById("root").innerHTML.replaceAll("><", ">\n<")), 100);
Пешнамоиш
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда
render App
render Header
render Nav
render Courses
render Footer
<div class="page">
<header class="top">
<h1>MakeFirstStep</h1>
<nav>
<a href="#courses">Курсы</a>
<a href="#contacts">Контакты</a>
</nav>
</header>
<main id="courses">
<h2>Наши курсы</h2>
<ul>
<li>HTML и CSS</li>
<li>JavaScript</li>
<li>React</li>
</ul>
</main>
<footer id="contacts">Душанбе · MakeFirstStep</footer>
</div>
Ишора 1

Footer — мисли Header дар марҳалаи 1. Ва Nav алоҳида эълон мешавад, ва Header акнун <h1> ва <Nav />-ро дар бар мегирад.

Ишора 2

Тартиби сатрҳои render … аз тартиби даъват дар дарахт вобаста аст, на аз тартиби эълони функсияҳо дар файл.

Дар лоиҳаи Vite такрор мекунем

Акнун ҳамин корро «ба таври калонсолон» — ҳар компонент дар файли худ. Лоиҳаи my-react-app-ро аз бахши 03 кушоед (ё нав эҷод кунед), қолабро тоза кунед ва чунин кунед:

  1. Папкаи src/components/-ро ва чор файлро дар он эҷод кунед: Header.jsx, Nav.jsx, Courses.jsx, Footer.jsx.
  2. Ба ҳар кадом компоненти худро аз қуттии регӣ интиқол диҳед ва export default-ро илова кунед.
  3. Дар ҷое, ки компонент компоненти дигарро истифода мебарад, import илова кунед (Header Nav-ро ворид мекунад).
  4. Дар App.jsx Header, Courses, Footer-ро ворид кунед ва саҳифаро ҷамъ намоед.
  5. Услубҳоро аз ҷадвали style.css ба src/App.css интиқол диҳед ва боварӣ ҳосил кунед, ки App.jsx онро ворид мекунад: import './App.css'.
  6. npm run dev-ро оғоз кунед, консоли браузерро кушоед ва санҷед: сатрҳои render … чоп мешаванд, ва (аз сабаби StrictMode) ҳар кадом — дукарата.
src/components/Header.jsx
import Nav from './Nav.jsx'

export default function Header() {
  return (
    <header className="top">
      <h1>MakeFirstStep</h1>
      <Nav />
    </header>
  )
}
src/App.jsx
import './App.css'
import Header from './components/Header.jsx'
import Courses from './components/Courses.jsx'
import Footer from './components/Footer.jsx'

export default function App() {
  return (
    <div className="page">
      <Header />
      <Courses />
      <Footer />
    </div>
  )
}
Дарахти компонентҳо дар браузер

Васеъкунии React Developer Tools-ро барои браузери худ насб кунед: дар DevTools ҷадвали Components пайдо мешавад, ки дар он ҳамон дарахт намоён аст — App → Header → Nav ва ғайра. Ин роҳи тез барои боварӣ ҳосил кардан аст, ки тақсимкунӣ мувофиқи нақша иҷро шудааст.

08 Вазифаи хонагӣ: саҳифа аз 5 компонент

Саҳифаи худро дар React ҷамъ кунед: визиткаи шахсӣ, саҳифаи қаҳвахона, афишаи чорабинӣ — ба хоҳиши Шумо. Ин лоиҳаи аввал дар React + Vite аст. Модули «React Lite» — бонус аст, баҳо ба журнал гузошта намешавад, аммо таҳлилро аз рӯи меъёрҳои поён Шумо аз омӯзгор мегиред.

Чӣ кор кардан лозим аст

  • ☐ Лоиҳаро бо фармони npm create vite@latest бо қолаби React (JavaScript) эҷод кунед, қолабро тоза намоед: ҳисобкунак, тасвирҳо ва услубҳои зиёдатиро хориҷ кунед.
  • ☐ Саҳифа ҳадди ақал аз 5 компонент иборат аст, ҳар кадом дар файли худ дар src/components/, бо export default.
  • ☐ Ҳадди ақал як компонент дар дигаре ҷойгир аст (масалан, Logo дар дохили Header), ва ҳадди ақал як компонент дар саҳифа ду маротиба ва бештар истифода мешавад.
  • ☐ App.jsx танҳо саҳифаро аз компонентҳо ҷамъ мекунад: «аломатгузории калони худӣ» надорад.
  • ☐ Дар JSX className, htmlFor (агар шакл бошад), тегҳои пӯшида, ифодаҳо дар {…} (масалан, сол дар поёнӣ) ва ҳадди ақал як style={{…}} ё намоиши шартӣ истифода шудаанд.
  • ☐ Услубҳои худӣ дар App.css ё файлҳои алоҳидаи .css; саҳифа дар телефон ҳам озода менамояд (паҳно 390 px).
  • ☐ npm run build бе хато мегузарад. Дар репозиторий node_modules ва dist нестанд, package-lock.json ҳаст.
  • ☐ На камтар аз 3 коммити пурмазмун; репозиторий дар GitHub.
  • ☐ README.md: ин кадом саҳифа аст, чӣ тавр оғоз кардан, дарахти компонентҳои Шумо ва 2–3 ҷумла бо суханони худӣ: равиши компонентӣ аз DOM-и дастӣ чӣ тавр қулайтар аст.
ЗС дар вазифаи хонагӣ

Қоидаи курс: 15 дақиқа худатон. Аввал дарахти компонентҳоро дар коғаз кашед. Баъд метавонед аз ЗС бипурсед: «Инак дарахти компонентҳои ман [дарахт]. Кадом блокҳоро ман ба компонентҳои алоҳида ҷудо карда метавонам ва дар ин ҷо чиро аз нав истифода бурдан мумкин аст?» — ва бо аслии худ муқоиса кунед. Кодеро, ки сатр ба сатр шарҳ дода наметавонед, ба лоиҳа нагузоред. Дар README нависед, ки ЗС-ро дар куҷо истифода бурдед ва чиро ислоҳ кардан лозим омад.

Чӣ супоридан лозим

  • Истиноди репозиторийи GitHub-ро ба чати гурӯҳ.
  • Скриншоти саҳифа ва скриншоти ҷадвали Components (React Developer Tools) бо дарахти компонентҳо.
  • Дар паём: чанд компонент баромад ва кадомашро такроран истифода мебаред.

Таҳлил аз рӯи меъёрҳо (барои худсанҷӣ)

МеъёрХолҳо
Лоиҳаи Vite оғоз мешавад, npm run build мегузарад, қолаб тоза шудааст2
5+ компонент дар файлҳои алоҳида, номҳои дуруст, export default ва import3
Дарунгузорӣ ва истифодаи такрории компонент ҳаст; App.jsx танҳо саҳифаро ҷамъ мекунад2
JSX дуруст навишта шудааст: className, тегҳои пӯшида, ифодаҳо, як реша1
README бо дарахти компонентҳо ва бо суханони худӣ; коммитҳои озода2

Холҳо барои худсанҷӣ лозиманд: модули бонусӣ ба баҳои ниҳоии курс таъсир намерасонад.

✓ Шпаргалкаи дарс

  • DOM-и дастӣ — императив: «ёб, эҷод кун, ҷойгир кун, нав кун». Кодҳои бисёр, нав карданро фаромӯш кардан осон, аломатгузорӣ намоён нест. React — декларатив: тавсиф мекунем, ки дар экран чӣ бояд бошад, ва React худаш DOM-ро тағйир медиҳад.
  • Компонент — функсияест, ки JSX бармегардонад. Ном бо ҳарфи калон, истифода мисли таг: <Header />. Ном бо ҳарфи хурд — ин теги оддии HTML аст.
  • Саҳифа = дарахти компонентҳо. Аз рӯи маъно мебурем: блоки такроршаванда, блоки дорои вазифаи худ. Як компонент — як файл.
  • Лоиҳа: npm create vite@latest my-app -- --template react → cd my-app → npm install → npm run dev.
  • Занҷираи оғоз: index.html (<div id="root">) → src/main.jsx (createRoot(…).render(<App />)) → src/App.jsx (компоненти асосӣ).
  • JSX ≠ HTML: className, htmlFor, ҳамаи тегҳо пӯшида (<br />, <input />), як реша ё фрагменти <>…</>, {ифода}, style={{ backgroundColor: "gold" }}, шарҳ {/* … */}.
  • Дар {…} — танҳо ифодаҳо: тағйирёбандаҳо, арифметика, даъватҳо, ? :, &&. Кашида намешаванд true, false, null, undefined; 0 кашида мешавад — шарти n && …-ро чун n > 0 && … нависед.
  • Содир ва ворид: export default function Header() {…} → import Header from './components/Header.jsx'. Роҳ бо ./, пасванди .jsx пурра.
  • StrictMode дар реҷаи таҳия компонентҳоро дукарата даъват мекунад — console.log дар компонент ду маротиба чоп мешавад. Дар сайти ҷамъшуда чунин намешавад.
  • ЗС: аввал худатон 15 дақиқа; дар промпт — контекст, «бе useState ва ҳодисаҳо», формати «ҷадвали сатр → сатр». Месанҷем: номҳо, className, як реша, объекти style, китобхонаҳои зиёдатӣ, оғоз.
  • Минбаъд (дарси 23): props — параметрҳои компонент, useState — хотираи он, рӯйхатҳо ва key.