Дарси 23 · React Lite (бонус)
Props, рӯйхатҳо ва keys, useState
Шумо аллакай компонентҳо эҷод карда, аз онҳо саҳифа ҷамъ карда метавонед. Аммо саҳифае, ки тағйир намеёбад, — танҳо тасвири зебост. Имрӯз мо ба компонентҳо меомӯзонем, ки маълумотро қабул кунанд (props), рӯйхатҳоро аз массив намоиш диҳанд , ҳолатро ба ёд доранд (useState) ва ба истифодабаранда вокуниш нишон диҳанд . Маҳз ба ин чор чиз интерфейси ҳар як сайти React истодааст — аз сабади мағозаи интернетӣ то чат.
Маълумотро ба компонент тавассути props додан, children, деструктуризатсия ва қиматҳои пешфарзро истифода бурдан
Рӯйхатро аз массив тавассути .map() намоиш додан ва шарҳ додан, ки key барои чӣ лозим аст ва чаро индекс дар нақши калид рӯйхатро вайрон мекунад
Маълумоти тағйирёбандаро дар useState нигоҳ доштан ва онро тавассути setter нав кардан, аз ҷумла бо усули функсионалӣ
Ҳолатро ҳеҷ гоҳ «дар ҷояш» тағйир надодан: унсурҳои массивҳо ва объектҳоро тавассути spread, filter ва map илова кардан, нест кардан ва нав кардан
Ҳодисаҳоро коркард кардан (onClick, onChange, onSubmit) ва майдонҳои воридоти идорашаванда сохтан
Қисмҳои интерфейсро нишон додан ва пинҳон кардан: &&, оператори сегона, return-и барвақт
Бо ин саҳифа чӣ тавр кор кардан лозим аст
Блокҳои код бо ҷадвалҳои App.jsx ва style.css — ин мини-лоиҳаҳои React бевосита дар браузер ҳастанд: дар чап код, дар рост натиҷа, дар поён консол. Кодро тағйир диҳед ва ▶ Иҷро кардан -ро пахш кунед. Ба онҳо интернет лозим аст — React аз шабака бор мешавад. Дар вазифаҳо дар зери код сатри // ---- санҷиш (тағйир надиҳед) ---- ҳаст: ин «роботи озмоишгар»-и хурд аст, ки пас аз оғоз худаш тугмаҳоро пахш мекунад ва матн ворид менамояд, баъд натиҷаро ба консол менависад — вазифа аз рӯи он худкор санҷида мешавад. Дар лоиҳаи воқеӣ чунин блок лозим нест, ва ба он даст задан лозим нест. Ишораҳо дар зери қулф 🔒 пинҳонанд: аввал худатон кӯшиш кунед.
Ва боз як чизи муҳим. Дар лоиҳаи воқеии Vite React дар консоли браузер дар бораи хатоҳо шикоят мекунад, масалан «Each child in a list should have a unique key». Инҷо, дар қуттии регии таълимӣ, барпоии «ҷангӣ» (production)-и React кор мекунад, ва ин огоҳиҳо нестанд. Бинобар ин хатоҳои калидҳо ва ҳолатро мо аз рӯи натиҷа мегирем, на аз рӯи сатрҳои сурх. Ин ҳатто муфидтар аст: ин тавр Шумо меомӯзед, ки хаторо бо чашм бинед.
01 Props: маълумот ба компонент
Компонент — функсияест, ки порчаи интерфейсро бармегардонад (дар дарси гузашта Шумо онҳоро дар Vite эҷод кардед). Як функсияи ҳамон бояд кортҳои гуногунро кашида тавонад: дар бораи самбӯса, қурутоб, шакароб. Барои ин ба он маълумоти воридотӣ лозим аст. Дар React онҳо props номида мешаванд — аз калимаи «properties», хосиятҳо.
Монанд аз ҳаёт
Менюи чойхона. Чорчӯба, ҳарф ва ҷойгиршавии сатр — ин компонент аст: онҳо барои ҳамаи таомҳо якхелаанд. Ва «Самбӯса — 5 сомонӣ» ва «Қурутоб — 35 сомонӣ» — ин props аст: ҳар таом аз они худро дорад. Чопхона бояд барои ҳар таом бланки нав чоп накунад — танҳо он чизе, ки ба сатрҳо навишта шудааст, тағйир меёбад.
Props-ро мисли атрибутҳо дар HTML мегузаронанд. Дар дохили компонент онҳо бо як объект дар аргументи аввали функсия меоянд:
Props чӣ тавр ба компонент мерасанд
function DishCard (props) {
return <div>{props.name} — {props.price} сомони</div>;
}
// props = { name: "Самбуса", price: 5 }
<DishCard name="Самбуса" price={5 } />
Ба навишти қиматҳо диққат диҳед: сатрҳоро дар зеркалимаҳо навиштан мумкин аст (name="Самбуса"), ва ҳама чизи дигар — рақамҳо, қиматҳои булӣ, массивҳо, объектҳо, функсияҳо — дар қавсҳои фигурӣ (price={5}). Қавсҳои фигурӣ инҷо маънои онро доранд: «дар дохил — ифодаи оддии JavaScript».
Кортҳои таомҳо тавассути props · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Як компонент — бисёр корт: маълумот тавассути props меояд
function DishCard ({ name, price }) {
return (
<div className="card" >
<b>{name}</b>
<div>{price} сомони</div>
</div>
);
}
export default function App () {
return (
<div>
<DishCard name="Самбуса" price={5 } />
<DishCard name="Курутоб" price={35 } />
<DishCard name="Шакароб" price={15 } />
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Props Объекти маълумот, ки волид ба фарзанд мегузаронад. Волид онҳоро мисли атрибутҳо менависад, фарзанд ҳамчун аргументи функсия мегирад.
Ҷараёни яктарафа Маълумот танҳо аз боло ба поён меравад: аз волид ба фарзанд. Фарзанд props-и волидашро аз нав навишта наметавонад.
children Props-и махсус: ҳар чизе, ки дар байни тегҳои кушодан ва пӯшидани компонент навишта шудааст.
Props-ро тағйир додан мумкин нест
Props барои компонент танҳо барои хондан дастрасанд. Компонент бояд мисли функсияи тоза рафтор кунад: маълумотро гирифт — аз рӯи он интерфейсро кашид, аммо худи маълумотро даст намезанад. Агар компонентро чизеро тағйир додан лозим бошад — ин аллакай на props, балки ҳолат аст (useState, бахши 04).
Хатои маъмул
Кӯшиши «ислоҳ кардан»-и props дар дохили компонент: props.price = props.price * 2. Дар реҷаи таҳия React фавран хато медиҳад, ва дар барпоии ҷангӣ тағйирот метавонад «хомӯшона» ҷойҳои дигарро вайрон кунад. Қиматро дар тағйирёбандаи нав ҳисоб кардан лозим аст: const total = price * 2;
children — мундариҷаи дарунгузошта
Компонентҳоро мисли тегҳои оддии HTML дар якдигар гузоштан мумкин аст. Ҳар чизе, ки Шумо байни <Panel> ва </Panel> навиштаед, ба компонент дар prop-и children меояд. Шумо худатон қарор медиҳед, ки онро дар куҷо нишон диҳед.
Panel бо children · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// children — ҳар чизе, ки БАЙНИ тегҳои кушодан ва пӯшидан навишта шудааст
function Panel ({ title, children }) {
return (
<section className="card" >
<h3 style={{ margin: "0 0 6px" }}>{title}</h3>
{children}
</section>
);
}
export default function App () {
return (
<div>
<Panel title="Сегодня в MakeFirstStep" >
<p>JavaScript, 18 :00 </p>
<p>Практика с ИИ, 19 :30 </p>
</Panel>
<Panel title="Объявление" >
<button>Записаться</button>
</Panel>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монанд аз ҳаёт
Қутти тӯҳфа. Худи қутти (чорчӯба, бант, навишта) — ин компоненти Panel аст. Дар дохил чӣ ҳаст — children. Як қуттиро барои қанд, барои китоб, барои рӯймол истифода бурдан мумкин аст. Ба қутти муҳим нест, ки дар дохил чӣ ҳаст, — вазифаи он зебо печондани он аст.
Компонент-«печонанда» бо children — яке аз усулҳои аз ҳама маъмул: кортҳо, равзанаҳои модалӣ, бахшҳои саҳифа, тугмаҳо бо нишонаҳо.
Муфассал хонед: react.dev — Passing Props to a Component , learn.javascript.ru — Таъиноти деструктуризатсионӣ
Амалиёт: мустаҳкам мекунем
Аз оддӣ оғоз мекунем: ба компонентҳо қабул кардани маълумотро меомӯзонем.
ВАЗИФАИ 1.1 Менюи чойхона осон
Компоненти DishCard ҳамеша «Самбуса — 5 сомони»-ро мекашад, гарчанде ки дар App ба он таомҳои гуногунро медиҳанд. Онро маҷбур кунед, ки маълумотро аз props нишон диҳад: name ва price.
Менюи чойхона · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Корти таом. Ҳоло он ҳамеша як чизро нишон медиҳад.
function DishCard () {
return <div className="card" >Самбуса — 5 сомони</div>;
}
export default function App () {
return (
<div>
<DishCard name="Самбуса" price={5 } />
<DishCard name="Курутоб" price={35 } />
<DishCard name="Шакароб" price={15 } />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
document.querySelectorAll (".card" ).forEach ((card) => console.log (card.textContent));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Самбуса — 5 сомони
Курутоб — 35 сомони
Шакароб — 15 сомони
Ишора 1 Props ҳамчун аргументи аввали функсия меоянд. Онҳоро дар деструктуризатсия навиштан қулай аст: function DishCard({ name, price }).
Ишора 2 Дар дохили JSX қиматҳо дар қавсҳои фигурӣ ҷойгир мешаванд: {name} — {price} сомони.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 1.2 Панел бо мундариҷа осон
Компоненти Panel чорчӯбаро бо сарлавҳа мекашад, аммо ду сархат, ки ба дохили тегҳо гузошта шудаанд, ба куҷое ғайб мезананд. Онҳоро ба ҷояшон баргардонед: мундариҷаро дар зери сарлавҳа нишон диҳед.
Панел бо мундариҷа · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Панел-чорчӯба: бояд сарлавҳа ВА ҳар чизеро, ки ба дохили тегҳо гузошта шудааст, нишон диҳад
function Panel ({ title }) {
return (
<section className="card" >
<h3>{title}</h3>
</section>
);
}
export default function App () {
return (
<Panel title="Сегодня в MakeFirstStep" >
<p>JavaScript, 18 :00 </p>
<p>Практика с ИИ, 19 :30 </p>
</Panel>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
const panel = document.querySelector (".card" );
console.log (panel.querySelector ("h3" ).textContent);
console.log (panel.querySelectorAll ("p" ).length);
console.log (panel.lastElementChild.textContent);
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Сегодня в MakeFirstStep
2
Практика с ИИ, 19:30
Ишора 1 Ҳар чизе, ки байни тегҳои компонент аст, ба prop бо номи махсуси children меояд.
Ишора 2 children-ро ба рӯйхати props илова кунед: { title, children } — ва {children}-ро пас аз сарлавҳа нишон диҳед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 1.3 Нарх ба куҷо рафт? миёна
Нархи палав нишон дода намешавад: дар саҳифа танҳо калимаи «сомони» аст. Ин хаторо ёбед : як калимаро дар код ислоҳ кунед. Фикр кунед, ки номҳое, ки компонент интизор аст, аз номҳое, ки ба он дода шудаанд, чӣ фарқ доранд. React дар ин бора шикоят намекунад, балки танҳо undefined-ро мегузорад.
Нарх ба куҷо рафт? · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Нарх нишон дода намешавад. ЯК хаторо ёбед ва ислоҳ кунед.
function Price ({ value, currency }) {
return <b>{value} {currency}</b>;
}
export default function App () {
return (
<p>
Плов: <Price amount={45 } currency="сомони" />
</p>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
console.log (document.querySelector ("b" ).textContent);
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 45 сомони
Ишора 1 Номи prop-ро дар эълони Price({ value, ... }) ва дар даъвати <Price amount=... /> муқоиса кунед.
Ишора 2 Номҳо бояд ҳарф ба ҳарф мувофиқат кунанд. Ё amount-ро дар даъват ба value иваз кунед, ё баръакс — дар эълон.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
02 Деструктуризатсия, қиматҳои пешфарз ва rest
Навиштани props.name, props.price, props.city дар ҳар сатр хастакунанда аст. Шумо аз дарси объектҳо медонед, ки чӣ тавр он кӯтоҳ мешавад: деструктуризатсия . Дар React онро қариб ҳама ҷо истифода мебаранд — бевосита дар қавсҳои параметрҳои функсия.
Чунин буд ва чунин шуд
// чунин буд
function StudentCard (props) {
return <p>{props.name}, {props.age} лет</p>;
}
// чунин шуд
function StudentCard ({ name, age }) {
return <p>{name}, {age} лет</p>;
}
Қиматҳои пешфарз
Агар волид prop-ро надода бошад, дар дохил undefined мешавад. Барои ҷойгир кардани қимати эҳтиётӣ аломати =-ро дар деструктуризатсия истифода баред — мисли дар параметрҳои функсияи оддӣ (дарси 5).
Тугма бо қиматҳои пешфарз · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қиматҳои пешфарз — бевосита дар деструктуризатсияи props
function Button ({ label = "Нажми" , color = "gray" }) {
return (
<button style={{ background: color, color: "white" , border: 0 , borderRadius: 8 , marginRight: 8 }}>
{label}
</button>
);
}
export default function App () {
return (
<div>
<Button label="Купить" color="green" />
<Button label="Отмена" />
<Button />
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Дом
Қимати пешфарз танҳо барои undefined кор мекунад. Агар null, 0 ё сатри холии "" дода шуда бошад, маҳз ҳамин қимат истифода мешавад. Барои null дар JavaScript оператори ?? ҳаст — Шумо бо он аз дарси шартҳо шиносед. Инро дар вазифаи 2.3 таҳлил мекунем.
Rest ва spread: «props-и боқимондаро тақсим кардан»
Мешавад, ки компонент худаш як-ду prop-ро истифода мебарад, ва ҳамаи дигарҳоро бояд ба тегҳои дарунгузошта диҳад — масалан, ба <input>. Инҷо се нуқтаи шинос кор мекунад:
{ label, ...rest } дар параметрҳо — ҳамаи props-и боқимондаро дар объекти rest ҷамъ мекунад ;
<input {...rest} /> дар JSX — ин объектро ҳамчун маҷмӯи атрибутҳо тақсим мекунад .
Field: label + боқӣ ба input · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// ...rest «ҳамаи дигар» props-ро ҷамъ мекунад, ва {...rest} онҳоро минбаъд тақсим мекунад
function Field ({ label, ... rest }) {
return (
<label style={{ display: "block" , margin: "6px 0" }}>
{label}: <input {... rest} />
</label>
);
}
export default function App () {
return (
<div>
<Field label="Имя" placeholder="Мадина" />
<Field label="Пароль" type="password" placeholder="не менее 8 знаков" />
<Field label="Возраст" type="number" min="14" max="99" />
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монанд аз ҳаёт
Маршруткаи Душанбе. Ронанда пули роҳкиро мегирад (ин label аст — он чи ба ӯ лозим аст), ва хоҳиши Шумо «дар назди Бозори Сабз нигоҳ доред» ва борхалтаро (ин rest аст) ба худ намегирад, балки танҳо минбаъд мегузаронад. Компонент ҳам чунин аст: он чиро, ки ба ӯ лозим аст, мегирад, ва боқиро бе таҳқиқот минбаъд мефиристад.
Маслиҳат
{...rest}-ро бошуурона истифода баред. Агар «ҳамаро аз пай ҳам» тақсим кунед, ба таг метавонад prop-е афтад, ки онро намефаҳмад, ва ин ислоҳи хатоҳоро душвор мекунад. Барои компонентҳои оддӣ беҳтар аст props-и лозимиро ошкоро номбар кардан.
Муфассал хонед: react.dev — қиматҳои пешфарзи props , learn.javascript.ru — Rest ва spread
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 2.1 Тугма бо матни эҳтиётӣ осон
Ду аз се тугма ҳоло холӣ ва бе ранг ҳастанд, зеро волид ба онҳо label ва color-ро надодааст. Қиматҳои пешфарзро таъин кунед: label = "Нажми", color = "gray".
Тугма бо матни эҳтиётӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қиматҳои пешфарзро таъин кунед: label = "Нажми", color = "gray"
function Button ({ label, color }) {
return <button style={{ background: color }}>{label}</button>;
}
export default function App () {
return (
<div>
<Button label="Купить" color="green" />
<Button />
<Button label="Отмена" />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
document.querySelectorAll ("button" ).forEach ((b) => console.log (b.textContent, b.style.background));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Купить green
Нажми gray
Отмена gray
Ишора 1 Аломати = бевосита дар деструктуризатсия, дар паҳлуи ном навишта мешавад: { label = "...", color = "..." }.
Ишора 2 Навишт чунин менамояд: function Button({ label = "Нажми", color = "gray" }).
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 2.2 Майдоне, ки ҳама чизро минбаъд мегузаронад миёна
Компоненти Field тавсиф ва майдони воридотро мекашад, аммо placeholder, type ва maxLength, ки ба он дода мешаванд, гум мешаванд: ҳарду майдон намуди оддӣ доранд ва бе маҳдудият. Props-и боқимондаро тавассути ...rest ҷамъ кунед ва ба <input> гузаронед.
Майдоне, ки ҳама чизро минбаъд мегузаронад · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Field бояд props-и «зиёдатӣ»-ро ба <input> гузаронад. Ҳоло placeholder, type ва maxLength гум мешаванд.
function Field ({ label }) {
return (
<label>
{label}: <input />
</label>
);
}
export default function App () {
return (
<div>
<Field label="Имя" placeholder="Мадина" maxLength={10 } />
<br />
<Field label="Пароль" type="password" placeholder="••••" />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
document.querySelectorAll ("input" ).forEach ((i) => console.log (i.type, i.placeholder, i.maxLength));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда text Мадина 10
password •••• -1
Ишора 1 Дар параметрҳо: { label, ...rest }. Ҳоло дар rest ҳамаи props, ба истиснои label, ҳастанд.
Ишора 2 Дар JSX онҳоро ба майдон тақсим кунед: <input {...rest} />. Қимати -1 дар ҷавоб — ин «маҳдудият нест»-и оддӣ барои maxLength аст.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 2.3 Пешбинӣ кунед, ки нишонаҳо чӣ нишон медиҳанд миёна
Дар код шаш нишона бо қиматҳои гуногуни text ҳаст. Бе иҷрои код дар дафтар нависед, ки дар қавсҳои чоркунҷа барои ҳар кадом чӣ пайдо мешавад. Баъд оғоз кунед ва муқоиса намоед. Сипас Label-ро ислоҳ кунед: бигзор барои null ҳам «—» нишон дода шавад. Барои 0 ва сатри холӣ рафторро тағйир додан лозим нест.
Пешбинӣ кунед, ки нишонаҳо чӣ нишон медиҳанд · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// 1) Пешбинӣ кунед, ки ҳар як аз шаш нишона чӣ нишон медиҳад. 2) Оғоз кунед ва муқоиса намоед.
// 3) Label-ро тавре ислоҳ кунед, ки барои null ҳам «—» нишон дода шавад.
function Label ({ text = "—" }) {
return <span>[{text}]</span>;
}
export default function App () {
return (
<div>
<Label />
<Label text="Плов" />
<Label text={undefined } />
<Label text={null } />
<Label text={0 } />
<Label text="" />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
document.querySelectorAll ("span" ).forEach ((s) => console.log (s.textContent));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда пас аз ислоҳ [—]
[Плов]
[—]
[—]
[0]
[]
Ишора 1 Қимати пешфарз дар қавсҳо барои null кор намекунад. Онро аз он ҷо хориҷ кунед ва бо қимати эҳтиётӣ дар дохили функсия сару кор гиред.
Ишора 2 Оператори ?? қисми ростро ҷойгир мекунад, агар дар чап null ё undefined бошад, ва 0 ва ""-ро мисли ҳаст мегузорад: const shown = text ?? "—";
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
03 Рӯйхатҳо: .map() ва key
Маълумот дар сайт қариб ҳамеша бо рӯйхат меояд: молҳо дар феҳрист, паёмҳо дар чат, донишҷӯён дар гурӯҳ. <li>-ро барои ҳар унсур бо даст навиштан мумкин нест — дарозии рӯйхат аз пеш номаълум аст. Дар React рӯйхатро чунин мекашанд: массивро мегиранд ва ҳар унсури онро бо методи .map() ба порчаи JSX табдил медиҳанд. Бо map Шумо дар дарси массивҳо шинос шудед — он массиви нав бармегардонад, ва React массиви аз унсурҳои JSX-ро нишон дода метавонад.
Рӯйхати дарсҳо тавассути map · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Рӯйхат аз массив: .map() ҳар унсурро ба <li> табдил медиҳад
const lessons = ["HTML и CSS" , "JavaScript" , "React Lite" ];
export default function App () {
return (
<ul>
{lessons.map ((lesson) => (
<li key={lesson}>{lesson}</li>
))}
</ul>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Массиви маълумот. lessons — массиви оддии сатрҳо.
map ҳар сатрро ба унсур табдил медиҳад. Барои "JavaScript" <li>JavaScript</li> ҳосил мешавад.
Массиви аз се унсури JSX ҳосил шуд. React онҳоро яке аз паи дигаре ба саҳифа мебарорад.
Ҳамаи ин дар қавсҳои фигурӣ навишта шудааст { ... } — дар дохили JSX ин «ворид кардани JavaScript» аст.
key барои чӣ лозим аст
Ба ҳар унсури рӯйхат prop-и махсуси key-ро додан лозим аст — «шиноснома»-и якто барои унсур. Аз рӯи калид React мефаҳмад, ки кадом унсур тағйир ёфт, илова шуд ё нопадид шуд, ва танҳо чизи лозимиро аз нав мекашад. Бе калидҳо он «унсури дуюмро нест карданд»-ро аз «мундариҷаи дуюм ва сеюмро тағйир доданд» фарқ карда наметавонад.
Монанд аз ҳаёт
Гардероб дар чойхона ё театр. Шумо курткаро месупоред ва рақам мегиред. Гардеробчӣ рӯи Шуморо ба ёд намегирад ва ба ранги куртка наменшигарад, балки аз рӯи рақам меҷӯяд. Агар рақамҳоро «аз рӯи тартиби навбат» (якум, дуюм, сеюм) диҳанд ва шахси якум равад, ҳамаи дигарон ногаҳон рақамҳои бегона мегиранд. Рақами хуб ба шахс тааллуқ дорад, на ба ҷой дар навбат. Калидҳо маҳз ҳамин тавр кор мекунанд.
Калид бояд чунин бошад:
дар байни ҳамсояҳо якто (дар як рӯйхат), аммо на ҳатман дар тамоми саҳифа;
устувор : барои як унсури ҳамон ҳангоми ҳар кашидани аз нав як калиди ҳамон;
аз маълумот гирифташуда : id аз база, артикули якто ё логин — на рақами тасодуфӣ.
Кортҳои донишҷӯён аз рӯи id · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Массиви объектҳо: ҳар кадом id-и якто дорад — маҳз он key мешавад
const students = [
{ id: 1 , name: "Мадина" , city: "Душанбе" },
{ id: 2 , name: "Фарход" , city: "Хуҷанд" },
{ id: 3 , name: "Зарина" , city: "Бохтар" },
];
function StudentCard ({ name, city }) {
return (
<div className="card" >
<b>{name}</b> — {city}
</div>
);
}
export default function App () {
return (
<div>
{students.map ((student) => (
<StudentCard key={student.id} name={student.name} city={student.city} />
))}
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Калид дар берунитарин унсуре, ки аз map бармегардонед навишта мешавад — инҷо ин <StudentCard key=...> аст. Дар дохили компоненти StudentCard калид лозим нест, ва худи компонент онро «намебинад»: key — атрибути хидматӣ аст, он ба props намеафтад.
Чиро ҳамчун key гирифтан
Вариант Мувофиқ аст? Чаро key={item.id}Бале, беҳтарин Ба худи унсур тааллуқ дорад ва ҳангоми нест кардан ва ҷудокунӣ тағйир намеёбад key={item} барои сатрҳоБале, агар сатрҳо такрор нашаванд Худи қимат якто аст — масалан, рӯйхати номҳои дарсҳо key={index}Танҳо барои рӯйхате, ки ҳеҷ гоҳ тағйир намеёбад Индекс — ин рақами ҷой аст, на шиносномаи унсур. Тафсилот — дар бахши 06 key={Math.random()}Не, ҳеҷ гоҳ Ҳар кашидани аз нав калидҳои нав эҷод мекунад, ва React ҳамаи унсурҳоро аз сифр аз нав месозад
Хатои маъмул
Ба ҷои функсияи тирчадор бо қавсҳои мудаввар (tag) => ( ... ) қавсҳои фигурии (tag) => { ... }-ро навиштан ва калимаи return-ро фаромӯш кардан. Функсия ҳалолона кор мекунад ва undefined-ро бармегардонад — ва ба ҷои рӯйхат дар саҳифа холигӣ мешавад. Ин ҳамон қоидаи дарси функсияҳост: дар функсияи тирчадор бо { } натиҷаро ошкоро баргардондан лозим аст. Маҳз ба чунин дом Шумо дар вазифаи 3.4 меафтед.
Маслиҳат
Филтркунӣ ва намоиш занҷирӣ меравад, мисли дар дарси массивҳо: orders.filter(...).map(...). Аввал унсурҳои лозимиро нигоҳ доред, баъд онҳоро ба JSX табдил диҳед. Агар ҳисобкунак лозим бошад («ёфт шуд: 2»), қулай аст аввал натиҷаи filter-ро дар тағйирёбанда нигоҳ доред ва аз он .length-ро гиред.
Муфассал хонед: react.dev — Rendering Lists , MDN — Array.prototype.map()
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 3.1 Ҷадвали дарсҳо осон
Ҳамаи унсурҳои массиви lessons-ро ба намуди <li> дар дохили <ul> нишон диҳед. key-ро фаромӯш накунед.
Ҷадвали дарсҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
const lessons = ["HTML и CSS" , "JavaScript" , "React Lite" ];
export default function App () {
return (
<ul>
{/* барои ҳар дарс аз массиви lessons як <li> нишон диҳед */ }
</ul>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
const items = document.querySelectorAll ("li" );
console.log (items.length);
items.forEach ((li) => console.log (li.textContent));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 3
HTML и CSS
JavaScript
React Lite
Ишора 1 Дар дохили <ul> қавсҳои фигурӣ гузоред ва lessons.map(...)-ро даъват кунед.
Ишора 2 {lessons.map((lesson) => <li key={lesson}>{lesson}</li>)} — сатрҳо дар ин массив такрор намешаванд, бинобар ин худи сатр дар нақши калид мувофиқ аст.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 3.2 Меню аз массиви объектҳо осон
Тавассути компоненти MenuItem ҳамаи таомҳоро аз массиви menu нишон диҳед. Калид бояд id-и таом бошад.
Меню аз массиви объектҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
const menu = [
{ id: 1 , name: "Самбуса" , price: 5 },
{ id: 2 , name: "Курутоб" , price: 35 },
{ id: 3 , name: "Шакароб" , price: 15 },
{ id: 4 , name: "Чой" , price: 3 },
];
function MenuItem ({ name, price }) {
return <div className="card" >{name} · {price} сомони</div>;
}
export default function App () {
return (
<div>
{/* ҳамаи таомҳоро аз menu тавассути MenuItem нишон диҳед, дар бораи key фаромӯш накунед */ }
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
document.querySelectorAll (".card" ).forEach ((c) => console.log (c.textContent));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Самбуса · 5 сомони
Курутоб · 35 сомони
Шакароб · 15 сомони
Чой · 3 сомони
Ишора 1 Барои ҳар таом map бояд <MenuItem ... />-ро бо се props баргардонад: key, name, price.
Ишора 2 {menu.map((dish) => <MenuItem key={dish.id} name={dish.name} price={dish.price} />)}
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 3.3 Кӣ ҳанӯз пардохт накардааст миёна
Дар массиви orders фармоишҳои чойхона ҳастанд. Танҳо пардохтнашуда -ҳоро нишон диҳед — барои ҳар кадом як <li> дар формати «Клиент — сумма сомони». Дар сархати болои рӯйхат нишон диҳед, ки чандто ҳастанд.
Кӣ ҳанӯз пардохт накардааст · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
const orders = [
{ id: 1 , client: "Рустам" , total: 120 , paid: true },
{ id: 2 , client: "Зарина" , total: 80 , paid: false },
{ id: 3 , client: "Далер" , total: 45 , paid: false },
{ id: 4 , client: "Нилуфар" , total: 200 , paid: true },
];
export default function App () {
// танҳо фармоишҳои пардохтнашуда ва миқдори онҳоро нишон диҳед
return (
<div>
<p>Ждут оплаты: ?</p>
<ul></ul>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
console.log (document.querySelector ("p" ).textContent);
document.querySelectorAll ("li" ).forEach ((li) => console.log (li.textContent));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Ждут оплаты: 2
Зарина — 80 сомони
Далер — 45 сомони
Ишора 1 Пеш аз return тағйирёбанда эҷод кунед: const unpaid = orders.filter(...). Дарозии он — рақами дар сархат аст, ва худи он — он чизест, ки ба map меравад.
Ишора 2 Шарт барои filter: (order) => !order.paid. Калидро order.id гардонед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 3.4 Рӯйхати холии барчасбҳо осон
Хаторо ёбед. Барчасбҳо нишон дода намешаванд: дар саҳифа холӣ аст, гарчанде ки дар консол хато нест. Сабабро ёбед ва кодро чунон ислоҳ кунед, ки се барчасб пайдо шаванд.
Рӯйхати холии барчасбҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Барчасбҳо дар саҳифа пайдо намешаванд. Сабабро ёбед.
const tags = ["react" , "props" , "state" ];
export default function App () {
return (
<div>
{tags.map ((tag) => {
<span key={tag} className="card" >#{tag}</span>;
})}
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
const cards = document.querySelectorAll (".card" );
console.log (cards.length);
cards.forEach ((c) => console.log (c.textContent));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 3
#react
#props
#state
Ишора 1 Ба қавсҳо пас аз тир нигаред: => {. Дар чунин қавсҳо чӣ навиштан лозим аст, то функсия қимат баргардонад?
Ишора 2 return-ро пеш аз <span ...> илова кунед ё { }-ро ба қавсҳои мудаввар ( ) иваз намоед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
04 useState: компонент, ки ба ёд дорад
Props аз берун меоянд ва тағйир намеёбанд. Аммо дар саҳифа маълумоте ҳаст, ки аз амалҳои истифодабаранда тағйир меёбад: чанд маротиба «лайк» пахш карданд, дар майдон чӣ навишта шудааст, меню кушода аст ё не. Ин маълумот ҳолат (state) номида мешавад. Барои он дар React ҳук (hook)-и useState ҳаст.
Аввал мебинем, ки чаро тағйирёбандаи оддӣ кифоя нест. Мисолро оғоз кунед ва тугмаро якчанд бор пахш намоед:
Тағйирёбандаи оддӣ кор намекунад · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Ин тавр кор НАМЕКУНАД: тағйирёбандаи оддӣ React-ро маҷбур намекунад, ки экранро аз нав бикашад.
// Тугмаро якчанд бор пахш кунед ва экранро бо консол муқоиса намоед.
export default function App () {
let count = 0 ;
function handleClick () {
count = count + 1 ;
console.log ("count в памяти:" , count);
}
return (
<div>
<p>На экране: {count}</p>
<button onClick={handleClick}>+1 </button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Дар консол рақам меафзояд, ва дар экран ҳамеша нол аст. Ду сабаб:
React компонентро танҳо вақте аз нав мекашад, ки аз ӯ дар ин бора «хоҳиш карданд». Тағйири оддии тағйирёбанда барои ӯ намоён нест.
Ҳангоми ҳар кашидани аз нав функсияи компонент аз сифр аз нав иҷро мешавад, ва let count = 0 боз сифр мешавад. Тағйирёбандаҳои оддӣ дар дохили компонент кашидани аз навро наметавонанд аз сар гузаронанд.
Ҷойе лозим аст, ки қимат дар он байни кашидани аз нав зиндагӣ мекунад , ва роҳе, ки ба React хабар диҳад «қимат тағйир ёфт, аз нав бикаш». Ин худи useState мекунад:
Ҳисобкунак бо useState · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [count, setCount] = useState (0 );
return (
<div>
<p>Вы нажали {count} раз</p>
<button onClick={() => setCount (count + 1 )}>Нажми меня</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
useState (0)
const [count,
setCount]
= useState(0);
useState ҷуфтро бармегардонад: қимати ҷорӣ ва функсияеро, ки онро тағйир медиҳанд
Қимати аввалия Аргументи useState(0). Танҳо ҳангоми намоиши аввал -и компонент истифода мешавад. Ҳангоми кашидани аз нави минбаъда React қимати аллакай захирашударо медиҳад.
Қимати ҷорӣ Унсури аввали ҷуфт — count. Ин тағйирёбандаи оддӣ аст, ки дар JSX хонда мешавад.
Сеттер Унсури дуюм — setCount. Даъвати setCount(5) қимати навро нигоҳ медорад ва аз React хоҳиш мекунад, ки компонентро аз нав бикашад.
Номҳо дар ҷуфт аз они Шумо ҳастанд, аммо одатан [чӣ, setЧӣ] менависанд: [liked, setLiked], [name, setName], [items, setItems]. Ин деструктуризатсияи массив аст — Шумо онро аз дарси 7 медонед.
Монанд аз ҳаёт
Тахтаи натиҷа дар бозии футбол. Довариён (setScore) мегӯянд: «гол!», ва тахта нав мешавад. Агар тамошобин дар трибуна танҳо дар дили худ фикр кунад «аллакай 3:2» — тахта тағйир намеёбад, ва ҳеҷ кас дигар дар ин бора намедонад. Қиматро бевосита тағйир додан — ин «дар дил фикр кардан» аст. Сеттерро даъват кардан — ин «расман ба довар хабар додан» аст.
Ҳар компонент ҳолати худро дорад
Ҳар нусхаи компонент ҳолати худии худро нигоҳ медорад. Агар Шумо Counter-ро ду маротиба нишон дода бошед, ду ҳисобкунаки мустақил доред.
Ҳар кадом ҳисобкунаки худро дорад · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
// Ҳар нусхаи компонент ҳолати худии худро дорад
function Counter ({ title }) {
const [n, setN] = useState (0 );
return (
<div className="card" >
{title}: <b>{n}</b> <button onClick={() => setN (n + 1 )}>+</button>
</div>
);
}
export default function App () {
return (
<div>
<Counter title="Плов" />
<Counter title="Шашлык" />
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Нави функсионалӣ
Вақте ки қимати нав аз қимати кӯҳна вобаста аст («1 илова кун»), ба сеттер функсия додан бехатар аст: setCount((c) => c + 1). React худаш ба c қимати аз ҳама тозаро мегузорад. Ин барои чӣ муҳим аст? Дар дохили як коркардкунанда тағйирёбандаи count — ин «акс»-и қимат дар лаҳзаи кашидани аз нав аст. Се даъвати пай дар пайи setCount(count + 1) ба се маротиба «0 + 1 гузоштан» табдил меёбанд — ва ҳисобкунак танҳо ба 1 меафзояд.
Акс ва нави функсионалӣ
// count ҳоло 0
setCount (count + 1 ); // 0 + 1 гузоштан
setCount (count + 1 ); // 0 + 1 гузоштан (count дар ин «акс» ҳанӯз 0 аст)
setCount (count + 1 ); // 0 + 1 гузоштан → натиҷа: 1
// навишти функсионалӣ
setCount ((c) => c + 1 ); // 0 → 1
setCount ((c) => c + 1 ); // 1 → 2
setCount ((c) => c + 1 ); // 2 → 3 → натиҷа: 3
Хатои маъмул
Интизор шудан, ки фавран пас аз setCount(5) тағйирёбандаи count ба 5 баробар мешавад. Он танҳо ҳангоми кашидани аз нави минбаъда тағйир меёбад. Агар «ҳамин ҳозир» бо қимати нав кор кардан лозим бошад, онро дар тағйирёбандаи алоҳида гузоред: const next = count + 1; setCount(next); console.log(next);
Қоидаҳои ҳукҳо
Ҳукҳоро танҳо дар сатҳи болои компонент даъват мекунанд — на дар дохили if, давраҳо ва функсияҳои дарунгузошта — ва танҳо дар компонентҳо (функсияҳо бо ном аз ҳарфи калон). Ин тавр React тартиби қиматҳои нигоҳдоштаро гум намекунад.
Танҳо лозимиро нигоҳ доштан
Агар қиматро аз ҳолати дигар ҳисоб кардан мумкин бошад — барои он ҳолати алоҳида надиҳед. Дар вазифаи 4.2 шумораи лайкҳо аз парчами liked ҳисоб карда мешавад: ду қимат, ки ба осонӣ ҳамоҳанг намешаванд, ба як қимат табдил меёбанд.
Муфассал хонед: react.dev — State: A Component's Memory , react.dev — useState
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 4.1 Ҳисобкунаки меҳмонон осон
Ҳисобкунакро зинда кунед: «+» 1 илова мекунад, «−» 1 кам мекунад, «Сброс» сифр мекунад. Барои ин useState ва коркардкунандаҳои onClick-ро илова кунед. Воридотро дар болотарини файл фаромӯш накунед.
Ҳисобкунаки меҳмонон · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Ҳисобкунакро зинда кунед: useState ва коркардкунандаҳоро барои се тугма илова кунед.
// Сатри воридотро дар болотарин фаромӯш накунед: import { useState } from "react";
export default function App () {
return (
<div>
<p>Счёт: 0 </p>
<button>−</button> <button>+</button> <button>Сброс</button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
const $ = (s) => document.querySelector (s);
const $$ = (s) => [... document.querySelectorAll (s)];
const btn = (t) => $$("button" ).find ((b) => b.textContent.trim () === t);
async function click (el) {
el.click ();
await wait ();
}
(async () => {
await wait ();
console.log ($("p" ).textContent);
await click (btn ("+" ));
await click (btn ("+" ));
await click (btn ("+" ));
await click (btn ("−" ));
console.log ($("p" ).textContent);
await click (btn ("Сброс" ));
console.log ($("p" ).textContent);
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Счёт: 0
Счёт: 2
Счёт: 0
Ишора 1 Аз const [count, setCount] = useState(0); оғоз кунед ва дар сархат 0-ро ба {count} иваз намоед.
Ишора 2 Коркардкунандаҳо: onClick={() => setCount(count + 1)}, onClick={() => setCount(count - 1)}, onClick={() => setCount(0)}. Тир лозим аст, то функсия ҳангоми кашидан фавран даъват нашавад.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 4.2 Тугмаи «лайк» миёна
Тугмаи лайк созед: бо клики аввал дил пур мешавад (♥) ва рақам ба 1 меафзояд, бо дуюм ҳама чиз бармегардад (♡, рақами аввалия). Дар ҳолат танҳо парчами liked-ро нигоҳ доред, ва шумораи лайкҳоро аз он ҳисоб кунед.
Тугмаи «лайк» · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Тугмаи «лайк»: бо клик дил пур мешавад ва ҳисобкунак ба 1 меафзояд, бо клики дуюм — ҳама чиз бармегардад.
// Ишора оид ба тарҳ: дар ҳолат танҳо liked-ро нигоҳ доштан лозим аст, ва шумораи лайкҳоро ҳисоб кардан мумкин аст.
export default function App () {
const likes = 12 ;
return <button>♡ {likes}</button>;
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const b = document.querySelector.bind (document);
await wait ();
console.log (b ("button" ).textContent);
await click (b ("button" ));
console.log (b ("button" ).textContent);
await click (b ("button" ));
console.log (b ("button" ).textContent);
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда ♡ 12
♥ 13
♡ 12
Ишора 1 Ҳолат: const [liked, setLiked] = useState(false);. Клик иваз мекунад: setLiked(!liked).
Ишора 2 Рақам: const likes = liked ? 13 : 12;. Дил: {liked ? "♥" : "♡"}.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 4.3 Тугмаи «+3» миёна
Хаторо ёбед. Тугмаи «+3» setCount-ро се маротиба даъват мекунад, аммо ҳисоб танҳо ба 1 меафзояд. Коркардкунандаро ислоҳ кунед, шумораи даъватҳои setCount-ро кам накарда.
Тугмаи «+3» · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Тугмаи «+3» танҳо 1 илова мекунад. Чаро? Ислоҳ кунед, шумораи даъватҳои setCount-ро тағйир надода.
import { useState } from "react" ;
export default function App () {
const [count, setCount] = useState (0 );
function addThree () {
setCount (count + 1 );
setCount (count + 1 );
setCount (count + 1 );
}
return (
<div>
<p>Счёт: {count}</p>
<button onClick={addThree}>+3 </button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const p = () => document.querySelector ("p" ).textContent;
await wait ();
console.log (p ());
await click (document.querySelector ("button" ));
console.log (p ());
await click (document.querySelector ("button" ));
console.log (p ());
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Счёт: 0
Счёт: 3
Счёт: 6
Ишора 1 Се даъват як «акс»-и ҳамони count-ро мебинанд. Лозим аст, ки ҳар даъвати навбатӣ аз натиҷаи гузашта оғоз шавад.
Ишора 2 Ба сеттер функсия диҳед: setCount((c) => c + 1), се маротиба пай дар пай.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 4.4 Се ҳисобкунаки мустақил миёна
Аввал пешбинӣ кунед : се ҳисобкунак пас аз ду пахш дар якум ва як пахш дар сеюм чӣ нишон медиҳанд? Баъд ба Counter prop-и step-ро илова кунед (пешфарз 1) — тугма бояд step илова кунад — ва ба ҳисобкунаки сеюм step={10}-ро таъин намоед.
Се ҳисобкунаки мустақил · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// 1) Пешбинӣ кунед: се ҳисобкунак чӣ нишон медиҳанд, агар «+»-ро дар якум ду маротиба ва дар сеюм як маротиба пахш кунем?
// 2) Ба Counter prop-и step-ро илова кунед (пешфарз 1): тугма step илова мекунад.
// 3) Ба ҳисобкунаки сеюм step={10}-ро таъин кунед.
import { useState } from "react" ;
function Counter ({ step = 1 }) {
const [n, setN] = useState (0 );
return (
<div className="card" >
<span>Счёт: {n}</span> <button onClick={() => setN (n + 1 )}>+</button>
</div>
);
}
export default function App () {
return (
<div>
<Counter />
<Counter />
<Counter />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const buttons = () => [... document.querySelectorAll ("button" )];
await wait ();
await click (buttons ()[0 ]);
await click (buttons ()[0 ]);
await click (buttons ()[2 ]);
document.querySelectorAll ("span" ).forEach ((s) => console.log (s.textContent));
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда пас аз ислоҳ Счёт: 2
Счёт: 0
Счёт: 10
Ишора 1 Ҳолати ҳар Counter аз они худаш аст, бинобар ин кликҳо ба якум ба сеюм таъсир намерасонанд. Қисми нав инҷо — prop-и step аст.
Ишора 2 Дар коркардкунанда n + 1-ро ба n + step иваз кунед, ва дар App дар даъвати сеюм <Counter step={10} />-ро нависед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
05 Қоидаи асосӣ: ҳолатро «дар ҷояш» тағйир надиҳед
Ҳолат-массив ва ҳолат-объект — ҷойи аз ҳама маъмули хатоҳои навомӯзон аст. Қоида як аст: ҳеҷ гоҳ ҳолатро бевосита тағйир надиҳед — ҳамеша ба сеттер нусхаи нав диҳед . React қимати кӯҳна ва навро «аз рӯи истинод» муқоиса мекунад. Агар Шумо ҳамон массивро тағйир дода ба қафо дода бошед, барои React чизе тағйир наёфтааст — вай кашидани аз навро мегузарад.
Монанд аз ҳаёт
Навбати электронӣ дар бонк. Агар оператор хомӯшона сатрро дар талони кӯҳна хат занад, тахта дар толор инро пай намебарад. Барои он ки ҳама тағйиротро бинанд, бояд талони нав дод ва онро ба тахта овезон кард. Нусхаи нави массив — талони нав аст: он ба React мегӯяд «бин, ин ҷо чизе тағйир ёфт».
Мисолро оғоз кунед ва тугмаро пахш намоед. Дар консол «Лук» ҳаст, ва дар экран он нест:
push — мутатсия (ин тавр мумкин нест) · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Ин тавр кор НАМЕКУНАД: push массивро «дар ҷояш» тағйир медиҳад, ва setItems ҳамон истинодро мегирад.
import { useState } from "react" ;
export default function App () {
const [items, setItems] = useState (["Хлеб" , "Молоко" ]);
function addItem () {
items.push ("Лук" );
setItems (items);
console.log ("в массиве:" , items.length);
}
return (
<div>
<ul>
{items.map ((item, i) => <li key={i}>{item}</li>)}
</ul>
<button onClick={addItem}>Добавить «Лук»</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Дуруст — массиви нав эҷод кардан ва ба сеттер додан:
Spread — нусхаи нав · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Ин тавр кор мекунад: setItems массиви НАВ мегирад
import { useState } from "react" ;
export default function App () {
const [items, setItems] = useState (["Хлеб" , "Молоко" ]);
function addItem () {
setItems ([... items, "Лук" ]);
}
return (
<div>
<ul>
{items.map ((item, i) => <li key={i}>{item}</li>)}
</ul>
<button onClick={addItem}>Добавить «Лук»</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Ҷадвали дастурҳо
Ба Шумо лозим нест даҳҳо методро ба ёд гиред — чор усул кифоя аст. Ҳамаи онҳо массив ё объекти нав бармегардонанд, ва кӯҳнаро даст намезананд:
Чӣ кор кардан лозим Навишт Мумкин нест (мутатсия) Ба охир илова кардан setItems([...items, newItem])items.push(newItem)Ба аввал илова кардан setItems([newItem, ...items])items.unshift(newItem)Аз рӯи id нест кардан setItems(items.filter((x) => x.id !== id))items.splice(i, 1)Як унсурро тағйир додан setItems(items.map((x) => x.id === id ? { ...x, done: true } : x))items[i].done = trueМайдони объектро тағйир додан setUser({ ...user, age: 20 })user.age = 20
Ба навишти { ...x, done: true } диққат диҳед: ин нусхаи объекти x аст, ки дар он майдони done иваз карда шудааст. Майдонҳои боқӣ чӣ ҳастанд, нусха шудаанд. Ин «нусха бо ивазкунӣ»-ро Шумо дар дарси 7 дар бахши spread дида будед. Ҳамин усул барои ҳолат-объект ҳам кор мекунад:
Объект дар ҳолат · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [user, setUser] = useState ({ name: "Мадина" , age: 19 , city: "Душанбе" });
// {...user, age: ...} — нусхаи объект, ки дар он як майдон иваз шудааст
const birthday = () => setUser ({ ... user, age: user.age + 1 });
const move = () => setUser ({ ... user, city: "Хуҷанд" });
return (
<div className="card" >
<p>{user.name}, {user.age} лет, {user.city}</p>
<button onClick={birthday}>С днём рождения</button> <button onClick={move}>Переехать</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Дом
Spread нусхаи рӯякӣ месозад. Агар дар дохили объект объекти дарунгузошта ё массив бошад (user.address.city), онро ҳам нусха кардан лозим аст: { ...user, address: { ...user.address, city: "Хуҷанд" } }. Бинобар ин дар ҳолат кӯшиш мекунанд маълумотро «ҳамвор» нигоҳ доранд.
Маслиҳат
Агар шубҳа дошта бошед, ки ҳолатро мутатсия намекунам, ба метод нигаред. Мутатсия мекунанд : push, pop, shift, unshift, splice, sort, reverse. Мутатсия намекунанд (нав бармегардонанд): map, filter, slice, concat, spread. Барои ҷудокунӣ аввал нусха гиред: [...items].sort(...).
Муфассал хонед: react.dev — Updating Arrays in State , react.dev — Updating Objects in State
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 5.1 Рӯйхати харид намеафзояд осон
Хаторо ёбед. Ҳангоми пахши «Добавить» ба рӯйхати харид бояд «Лук» илова шавад, аммо дар экран чизе тағйир намеёбад. addItem-ро ислоҳ кунед. Тугмаро як маротиба пахш кардан лозим аст — калид худи ном аст.
Рӯйхати харид намеафзояд · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Тугмаи «Добавить» чизе намекунад. Коркардкунандаи addItem-ро ислоҳ кунед.
import { useState } from "react" ;
export default function App () {
const [items, setItems] = useState (["Хлеб" , "Молоко" ]);
function addItem () {
items.push ("Лук" );
setItems (items);
}
return (
<div>
<ul>
{items.map ((item) => <li key={item}>{item}</li>)}
</ul>
<button onClick={addItem}>Добавить</button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
(async () => {
await wait ();
console.log (document.querySelectorAll ("li" ).length);
document.querySelector ("button" ).click ();
await wait ();
console.log (document.querySelectorAll ("li" ).length);
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 2
3
Ишора 1 Кадом методи массив онро «дар ҷояш» тағйир медиҳад? Он маҳз дар коркардкунанда истифода шудааст.
Ишора 2 Ду сатрро бо як сатр иваз кунед: setItems([...items, "Лук"]);
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 5.2 Профили донишҷӯ миёна
Ду вазифа. (1) «С днём рождения» бояд синни дар экранро зиёд кунад, ҳоло он онро «мутатсия» мекунад. (2) rename-ро ба итмом расонед: ном ба «Зарина» иваз мешавад, синну сол чӣ буд, ҳамон мемонад.
Профили донишҷӯ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// 1) «С днём рождения» синни дар экранро тағйир намедиҳад — ислоҳ кунед.
// 2) rename-ро ба итмом расонед: ном «Зарина» мешавад, синну сол ҳамон мемонад.
import { useState } from "react" ;
export default function App () {
const [user, setUser] = useState ({ name: "Мадина" , age: 19 });
function birthday () {
user.age = user.age + 1 ;
setUser (user);
}
function rename () {
// коди Шумо
}
return (
<div>
<p>{user.name}, {user.age}</p>
<button onClick={birthday}>С днём рождения</button> <button onClick={rename}>Сменить имя</button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const p = () => document.querySelector ("p" ).textContent;
const b = () => document.querySelectorAll ("button" );
await wait ();
console.log (p ());
await click (b ()[0 ]);
console.log (p ());
await click (b ()[1 ]);
console.log (p ());
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Мадина, 19
Мадина, 20
Зарина, 20
Ишора 1 Ба setUser объекти нав додан лозим аст, на ҳамон user.
Ишора 2 setUser({ ...user, age: user.age + 1 }) ва setUser({ ...user, name: "Зарина" }).
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 5.3 Нест кардан ва қайд кардан душвор
Рӯйхати корҳо аллакай кашида шудааст. Ду функсияро ба итмом расонед: removeTask(id) вазифаро нест мекунад, toggleTask(id) парчами done-ро дар вазифа иваз мекунад. На splice, ва на таъини қимат ба майдонҳои объект дар ҳолат истифода бурдан мумкин нест. Ин ду амал — асоси вазифаи хонагӣ аст.
Нест кардан ва қайд кардан · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// removeTask ва toggleTask-ро ба итмом расонед. Массиви tasks-ро «дар ҷояш» тағйир додан мумкин нест.
import { useState } from "react" ;
const start = [
{ id: 1 , title: "Сделать зарядку" , done: false },
{ id: 2 , title: "Купить лепёшки" , done: false },
{ id: 3 , title: "Позвонить маме" , done: false },
];
export default function App () {
const [tasks, setTasks] = useState (start);
function removeTask (id) {
// вазифаро бо ин id хориҷ кунед
}
function toggleTask (id) {
// done-ро дар вазифа бо ин id баръакс кунед, боқиро даст нарасонед
}
return (
<ul>
{tasks.map ((t) => (
<li key={t.id}>
<button className="toggle" onClick={() => toggleTask (t.id)}>{t.done ? "✓" : "○" }</button>{" " }
<span>{t.title}</span>{" " }
<button className="del" onClick={() => removeTask (t.id)}>✕</button>
</li>
))}
</ul>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const $$ = (s) => [... document.querySelectorAll (s)];
const show = () =>
console.log ($$("li" ).map ((li) => li.querySelector (".toggle" ).textContent + " " + li.querySelector ("span" ).textContent).join (" | " ));
await wait ();
show ();
await click ($$(".del" )[1 ]);
await click ($$(".toggle" )[0 ]);
show ();
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда ○ Сделать зарядку | ○ Купить лепёшки | ○ Позвонить маме
✓ Сделать зарядку | ○ Позвонить маме
Ишора 1 Нест кардан — «ҳамаро ғайр аз як нафар нигоҳ доштан» аст: методи filter бо шарти t.id !== id.
Ишора 2 Иваз кардан — map аст: барои вазифаи лозимӣ нусхаи { ...t, done: !t.done }-ро баргардонед, барои боқӣ — худи t-ро. Натиҷаро ба setTasks додан фаромӯш накунед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
06 Чаро индекс дар нақши key рӯйхатро вайрон мекунад
Акнун, ки мо ҳолат ва нест кардан дорем, дидан мумкин аст, ки «шиноснома»-и унсурҳо барои чӣ лозиманд. Бисёриҳо key={index} менависанд — ин осонтар аст, ва аввал ҳама чиз муқаррарӣ менамояд. Дар амал месанҷем.
Дар ҳар сатр майдони «қайд» ҳаст. Мисолро бо индекс оғоз кунед, дар майдони назди Мадина «привет» нависед, баъд «Удалить»-ро дар муқобили Мадина пахш кунед:
key = index (вайрон мешавад) · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// key = index. Дар майдони «қайд» назди Мадина чизе нависед ва Мадинаро нест кунед.
import { useState } from "react" ;
export default function App () {
const [people, setPeople] = useState ([
{ id: 1 , name: "Мадина" },
{ id: 2 , name: "Фарход" },
{ id: 3 , name: "Зарина" },
]);
return (
<ul>
{people.map ((p, index) => (
<li key={index}>
<b>{p.name}</b> <input placeholder="заметка" />{" " }
<button onClick={() => setPeople (people.filter ((x) => x.id !== p.id))}>Удалить</button>
</li>
))}
</ul>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Мадина нопадид шуд, аммо «привет» монд — ва ҳоло дар назди Фарход меистад. Акнун ҳамин чиз бо key={p.id}:
key = id (дуруст) · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// key = p.id. Ҳамон озмоишро такрор кунед: қайд назди соҳиби худ мемонад.
import { useState } from "react" ;
export default function App () {
const [people, setPeople] = useState ([
{ id: 1 , name: "Мадина" },
{ id: 2 , name: "Фарход" },
{ id: 3 , name: "Зарина" },
]);
return (
<ul>
{people.map ((p) => (
<li key={p.id}>
<b>{p.name}</b> <input placeholder="заметка" />{" " }
<button onClick={() => setPeople (people.filter ((x) => x.id !== p.id))}>Удалить</button>
</li>
))}
</ul>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Инҷо қайд бо Мадина меравад, ва боқӣ даст нахӯрдаанд.
Дар асл чӣ рӯй дод
Буд (key = index) Пас аз нест кардани Мадина шуд React чиро қарор дод key=0 → Мадина + «привет»key=0 → Фарход«Сатри 0 монд. Танҳо ном тағйир ёфт» — майдони бо матн нигоҳ дошта мешавад key=1 → Фарходkey=1 → Зарина«Сатри 1 монд. Ном тағйир ёфт» key=2 → Зарина— (нест) «Сатри 2 нопадид шуд» — сатри охирин нест карда мешавад
Бо индекс React сатри охиринро «нест кард» ва маълумотро ба боло кӯчонд. Матни воридшуда дар сатри 0 монд — ҳоло он ба Фарход тааллуқ дорад
Бо калиди id React мебинад: «калиди 1 гум шуд» — ва маҳз ҳамон сатрро (якҷоя бо майдони воридоташ) мебардорад, ва боқиро чӣ буд, ҳамон мегузорад.
Он чи мо дар ин ҷо дар майдони воридот мебинем, бо «ҳолати дохилӣ»-и дигари унсурҳо ҳам рӯй медиҳад: фокуси курсор, чекбокси интихобшуда, ҳолати компонентҳои дарунгузошта (useState дар дохили корт), аниматсия. Индекс танҳо барои рӯйхатҳое мувофиқ аст, ки нест намешаванд, аз нав чида намешаванд ва ҷудо карда намешаванд — ва дар онҳо майдонҳои воридот нестанд.
Хатои маъмул
Калидро «дар парвоз» эҷод кардан — key={Math.random()} ё key={crypto.randomUUID()} дар дохили map. Он гоҳ ҳангоми ҳар кашидани аз нав ҳамаи калидҳо нав мешаванд, React мешуморад, ки ҳамаи унсурҳо иваз шуданд , ва онҳоро аз сифр аз нав месозад: майдонҳо фокус ва матни воридшударо гум мекунанд. Шиносоиро як маротиба — ҳангоми эҷоди маълумот (масалан, вақте ки истифодабаранда вазифа илова мекунад) эҷод кардан ва онро бо маълумот якҷоя нигоҳ доштан лозим аст.
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 6.1 Қайдҳо назди ҳамсоя рафтанд миёна
Хаторо ёбед. Ҳар як шахс дар рӯйхат майдон барои қайд дорад. Санҷиш ба ҳар се нафар қайд менависад ва Мадинаро нест мекунад. Пас аз ин назди Фарход қайди ӯ «про Фарход», ва назди Зарина — «про Зарину» бояд монад. Ҳоло онҳо омехта шудаанд. Як сатрро ислоҳ кунед.
Қайдҳо назди ҳамсоя рафтанд · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қайдҳо пас аз нест кардан ба шахси дигар «кӯчида мераванд». Як сатрро ислоҳ кунед.
import { useState } from "react" ;
export default function App () {
const [people, setPeople] = useState ([
{ id: 1 , name: "Мадина" },
{ id: 2 , name: "Фарход" },
{ id: 3 , name: "Зарина" },
]);
return (
<ul>
{people.map ((p, index) => (
<li key={index}>
<b>{p.name}</b> <input placeholder="заметка" />{" " }
<button onClick={() => setPeople (people.filter ((x) => x.id !== p.id))}>Удалить</button>
</li>
))}
</ul>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
(async () => {
await wait ();
const notes = ["про Мадину" , "про Фарход" , "про Зарину" ];
document.querySelectorAll ("input" ).forEach ((input, i) => (input.value = notes[i]));
document.querySelector ("button" ).click (); // якумро — Мадинаро нест мекунем
await wait ();
document.querySelectorAll ("li" ).forEach ((li) => {
console.log (li.querySelector ("b" ).textContent + ": " + li.querySelector ("input" ).value);
});
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Фарход: про Фарход
Зарина: про Зарину
Ишора 1 Ба key-и <li> нигаред. React маҳз чиро истифода мебарад, то бифаҳмад, ки кадом сатр гум шуд?
Ишора 2 key={index}-ро ба key={p.id} иваз кунед. Тағйирёбандаи index дар қавсҳои map пас аз он лозим нест.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
07 Ҳодисаҳо ва майдонҳои воридоти идорашаванда
Ҳолат лозим аст, то ба чизе вокуниш нишон диҳем. Ва мо ба ҳодисаҳо вокуниш нишон медиҳем: кликҳо, воридкунии матн, фиристодани шакл. Дар React онҳо ҳамчун props бо номи on… дар сабки camelCase пайваст мешаванд: onClick, onChange, onSubmit. Баръакси HTML (onclick="..."), қимат на сатр, балки худи функсия аст.
onClick ва объекти ҳодиса · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [log, setLog] = useState ("пока ничего" );
// React ба коркардкунанда объекти ҳодисаро медиҳад
function handleClick (event) {
setLog ("клик по кнопке «" + event.target.textContent + "»" );
}
return (
<div>
<button onClick={handleClick}>Первая</button>{" " }
<button onClick={handleClick}>Вторая</button>{" " }
<button onClick={() => setLog ("привет из стрелочной функции" )}>Стрелка</button>
<p>{log}</p>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Ҳодиса Кай кор мекунад Истифодаи маъмулӣ onClickКлик ба унсур Тугмаҳо, кортҳо, бандҳои меню onChangeҚимати майдон тағйир ёфт — барои ҳар аломат Майдонҳои воридот, чекбоксҳо, select onSubmitФиристодани шакл (Enter ё тугма) Иловакунӣ ба рӯйхат, вуруд, ҷустуҷӯ onKeyDownКлавиша пахш шуд Enter дар майдон, Escape барои пӯшидани равзана
Функсияро медиҳем, на даъват мекунем
Хатои аз ҳама маъмул бо ҳодисаҳо: onClick={sayHi()}-ро бо қавсҳо навиштан. Қавсҳо функсияро бевосита ҳангоми кашидан даъват мекунанд , ва ба onClick на функсия, балки он чи баргардонд, меафтад. Мисолро оғоз кунед: «Салом!» дар консол бе ягон клик пайдо мешавад.
sayHi() ва sayHi · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Оғоз кунед ва ба консол нигаред: «Салом!» аллакай он ҷост, гарчанде ки мо тугмаро як маротиба ҳам пахш накардем.
function sayHi () {
console.log ("Салом!" );
}
export default function App () {
return (
<div>
<button onClick={sayHi ()}>Неправильно: sayHi ()</button>{" " }
<button onClick={sayHi}>Правильно: sayHi</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Се усули дуруст:
Коркардкунандаро чӣ тавр пайваст кардан
<button onClick={sayHi}>Без параметров</button>
<button onClick={() => remove (item.id)}>С параметром: оборачиваем в стрелку</button>
<button onClick={() => setCount (count + 1 )}>Прямо в стрелке</button>
Агар ба коркардкунанда аргумент додан лозим бошад (item.id), даъватро ба функсияи тирчадор печонед. Он гоҳ даъват на ҳозир, балки вақте ки истифодабаранда пахш мекунад, рӯй медиҳад.
Майдони идорашаванда (controlled input)
Дар HTML-и оддӣ қимати майдонро браузер соҳибӣ мекунад. Дар React ба тарзи дигар қабул шудааст: қимат дар ҳолат зиндагӣ мекунад, ва майдон танҳо онро нишон медиҳад ва дар бораи тағйирот хабар медиҳад. Чунин майдон идорашаванда номида мешавад. Барои ин ду атрибут лозим аст:
value={name} — чиро нишон додан;
onChange={(e) => setName(e.target.value)} — ҳолатро ҳангоми чоп кардани истифодабаранда чӣ тавр нав кардан. Матни нав дар e.target.value аст (дар чекбокс — e.target.checked).
Майдонҳои идорашаванда: input, checkbox, select · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [name, setName] = useState ("" );
const [student, setStudent] = useState (false );
const [city, setCity] = useState ("Душанбе" );
return (
<div>
<p>
<input value={name} onChange={(e) => setName (e.target.value)} placeholder="Ваше имя" />
</p>
<p>
<label>
<input type="checkbox" checked={student} onChange={(e) => setStudent (e.target.checked)} /> Я студент
</label>
</p>
<p>
<select value={city} onChange={(e) => setCity (e.target.value)}>
<option>Душанбе</option>
<option>Хуҷанд</option>
<option>Бохтар</option>
</select>
</p>
<p className="card" >
{name || "Аноним" } из города {city}{student ? ", студент" : "" }
</p>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монанд аз ҳаёт
Диктор ва телесуфлёр. Шумо калимаро чоп мекунед, он ба «марказ» (ҳолат) меравад, ва аз он ҷо ба экран дар майдон бармегардад. Майдон — танҳо равзанаи хурд аст, ки дар он қимат аз ҳолат нишон дода мешавад. То даме ки ҳолат нав нашудааст, дар равзана чизи нав пайдо намешавад. Бинобар ин агар value-ро бе onChange нависед, майдон «ях мекунад»: дар он чизе чоп кардан мумкин нест.
Шаклҳо: onSubmit ва preventDefault
Шакл ба таври пешфарз ҳангоми фиристодан саҳифаро аз нав бор мекунад. Ҳолат ҳангоми ин аз нав танзим мешавад — ин айнан ҳамон чизест, ки мо намехоҳем. Бинобар ин дар аввали коркардкунандаи onSubmit event.preventDefault()-ро даъват мекунанд — усули ба Шумо шинос аз дарси шаклҳо.
Шакл ва onSubmit · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [text, setText] = useState ("" );
const [sent, setSent] = useState ("" );
function handleSubmit (event) {
event.preventDefault (); // ба браузер намегузорем, ки саҳифаро аз нав бор кунад
setSent (text);
setText ("" );
}
return (
<form onSubmit={handleSubmit}>
<input value={text} onChange={(e) => setText (e.target.value)} placeholder="Ваше сообщение" />{" " }
<button>Отправить</button>
<p>Отправлено: {sent || "—" }</p>
</form>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Хатои маъмул
onClick-ро ба тугмаи шакл ба ҷои onSubmit ба худи шакл овезон кардан. Он гоҳ Enter дар майдон шаклро намефиристад. Қоида: амали «фиристодан» — ба <form onSubmit>, ва тугма дар дохили шакл оддӣ мемонад.
Маслиҳат
Агар дар ҳолат матн аз майдон бошад, дар бораи .trim() фаромӯш накунед: истифодабаранда ба осонӣ метавонад сатри аз фосилаҳо иборатро фиристад. Санҷиши if (text.trim() === "") return; — одатест, ки аз вазифаҳои холӣ дар рӯйхат наҷот медиҳад.
Муфассал хонед: react.dev — Responding to Events , react.dev — <input>
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 7.1 Салом ҳангоми воридкунӣ осон
Майдонро идорашаванда кунед: то даме ки ном ворид нашудааст, «Привет, гость!» нишон дода мешавад, ҳангоми чоп — «Привет, Ном!».
Салом ҳангоми воридкунӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Майдонро идорашаванда кунед: салом бояд ҳангоми воридкунии ном тағйир ёбад.
export default function App () {
const name = "" ;
return (
<div>
<input placeholder="Ваше имя" />
<p>Привет, {name || "гость" }!</p>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
function typeInto (el, value) {
Object.getOwnPropertyDescriptor (Object.getPrototypeOf (el), "value" ).set.call (el, value);
el.dispatchEvent (new Event ("input" , { bubbles: true }));
}
(async () => {
await wait ();
console.log (document.querySelector ("p" ).textContent);
typeInto (document.querySelector ("input" ), "Мадина" );
await wait ();
console.log (document.querySelector ("p" ).textContent);
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Привет, гость!
Привет, Мадина!
Ишора 1 Ҳолати name бо қимати аввалияи "" ва ду атрибут дар майдон лозиманд: value ва onChange.
Ишора 2 <input value={name} onChange={(e) => setName(e.target.value)} />
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 7.2 Пост бо маҳдудияти аломатҳо миёна
Майдони постро бо маҳдудияти 20 аломат созед: дар <small> «дарозӣ/20»-ро нишон диҳед, ва тугмаи «Опубликовать»-ро бо атрибути disabled хомӯш кунед, агар матн холӣ бошад ё аз маҳдудият дарозтар бошад.
Пост бо маҳдудияти аломатҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Майдон барои пост бо маҳдудияти 20 аломат.
// 1) Матнро дар ҳолат нигоҳ доред (майдони идорашаванда).
// 2) Дар <small> «дарозӣ/20»-ро нишон диҳед.
// 3) Тугмаи «Опубликовать» хомӯш аст (disabled), агар матн холӣ бошад ё аз 20 аломат дарозтар бошад.
export default function App () {
return (
<div>
<textarea placeholder="Что нового?" />
<p><small>0 /20 </small></p>
<button>Опубликовать</button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
function typeInto (el, value) {
Object.getOwnPropertyDescriptor (Object.getPrototypeOf (el), "value" ).set.call (el, value);
el.dispatchEvent (new Event ("input" , { bubbles: true }));
}
const state = () => document.querySelector ("small" ).textContent + " " + document.querySelector ("button" ).disabled;
(async () => {
await wait ();
console.log (state ());
typeInto (document.querySelector ("textarea" ), "Салом" );
await wait ();
console.log (state ());
typeInto (document.querySelector ("textarea" ), "я" .repeat (25 ));
await wait ();
console.log (state ());
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 0/20 true
5/20 false
25/20 true
Ишора 1 Дарозиро алоҳида нигоҳ доштан лозим нест: он ҳамеша ба text.length баробар аст. Дар ҳолат — танҳо text.
Ишора 2 <button disabled={text.length === 0 || text.length > 20}> — атрибут қимати булиро қабул мекунад.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 7.3 Шакли иловакунии харид миёна
handleSubmit-ро ба итмом расонед: аз нав боркунии саҳифаро бекор кунед, сатрҳои холӣ ва сатрҳои аз фосилаҳо иборатро илова накунед, ба рӯйхат объекти { id: Date.now(), text }-ро илова кунед ва майдонро тоза намоед. Шиносоӣ як маротиба — ҳангоми иловакунӣ эҷод мешавад, ва ин калид хоҳад буд.
Шакли иловакунии харид · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// handleSubmit-ро ба итмом расонед: аз нав боркуниро бекор кунед, сатрҳои холиро (ва сатрҳои аз фосилаҳо иборатро) илова накунед,
// {id, text}-ро ба рӯйхат илова кунед ва майдонро тоза намоед.
import { useState } from "react" ;
export default function App () {
const [items, setItems] = useState ([]);
const [text, setText] = useState ("" );
function handleSubmit (event) {
// коди Шумо
}
return (
<form onSubmit={handleSubmit}>
<input value={text} onChange={(e) => setText (e.target.value)} placeholder="Что купить?" />{" " }
<button>Добавить</button>
<ul>
{items.map ((item) => <li key={item.id}>{item.text}</li>)}
</ul>
</form>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
function typeInto (el, value) {
Object.getOwnPropertyDescriptor (Object.getPrototypeOf (el), "value" ).set.call (el, value);
el.dispatchEvent (new Event ("input" , { bubbles: true }));
}
async function submitWith (value) {
typeInto (document.querySelector ("input" ), value);
await wait ();
document.querySelector ("form" ).requestSubmit ();
await wait ();
}
(async () => {
await wait ();
await submitWith ("Лепёшки" );
await submitWith (" " );
await submitWith ("Чой" );
console.log ([... document.querySelectorAll ("li" )].map ((li) => li.textContent).join (" | " ));
console.log ("поле: [" + document.querySelector ("input" ).value + "]" );
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Лепёшки | Чой
поле: []
Ишора 1 Тартиби амалҳо: event.preventDefault() → const clean = text.trim() → агар холӣ бошад, return → илова кардан → тоза кардани майдон тавассути setText("").
Ишора 2 Иловакунӣ ба охир бе мутатсия: setItems([...items, { id: Date.now(), text: clean }]);
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 7.4 Ҷустуҷӯи зиндаи шаҳрҳо душвор
Рӯйхати шаҳрҳоро дар парвоз аз рӯи матни майдон, бе назардошти ҳарфи калон ё хурд, филтр кардан лозим аст. Агар чизе ёфт нашавад — <p>Ничего не найдено</p>-ро нишон диҳед. Ҳолат танҳо як аст — query; рӯйхати филтршударо ҳангоми ҳар кашидан ҳисоб кунед.
Ҷустуҷӯи зиндаи шаҳрҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Ҷустуҷӯи зинда: танҳо шаҳрҳоро нишон диҳед, ки дар номашон матни воридшуда ҳаст (бе назардошти ҳарфи калон ё хурд).
// Агар чизе ёфт нашавад — <p>Ничего не найдено</p>-ро нишон диҳед.
import { useState } from "react" ;
const cities = ["Душанбе" , "Худжанд" , "Бохтар" , "Куляб" , "Истаравшан" ];
export default function App () {
const [query, setQuery] = useState ("" );
return (
<div>
<input value={query} onChange={(e) => setQuery (e.target.value)} placeholder="Поиск города" />
<ul>
{cities.map ((city) => <li key={city}>{city}</li>)}
</ul>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
function typeInto (el, value) {
Object.getOwnPropertyDescriptor (Object.getPrototypeOf (el), "value" ).set.call (el, value);
el.dispatchEvent (new Event ("input" , { bubbles: true }));
}
(async () => {
await wait ();
for (const q of ["ду" , "УД" , "xyz" ]) {
typeInto (document.querySelector ("input" ), q);
await wait ();
const names = [... document.querySelectorAll ("li" )].map ((li) => li.textContent).join (", " );
console.log (q + ": " + (names || document.querySelector ("p" ).textContent));
}
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда ду: Душанбе
УД: Худжанд
xyz: Ничего не найдено
Ишора 1 Пеш аз return const found = cities.filter(...)-ро ҳисоб кунед ва found-ро ба ҷои cities нишон диҳед.
Ишора 2 Шарт: city.toLowerCase().includes(query.trim().toLowerCase()). Паём: {found.length === 0 && <p>Ничего не найдено</p>}.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
08 Рендери шартӣ: нишон додан ё пинҳон кардан
Интерфейс пайваста «шоха мешавад»: барои меҳмон як тугма, барои воридшуда дигар; то даме ки маълумот бор мешавад — гардон, баъд рӯйхат; сабад холӣ — ишора, холӣ нест — молҳо. Дар React барои ин тегҳои махсус мисли v-if нестанд. Шумо JavaScript-и оддиро — шартҳо ва операторҳоеро, ки аллакай медонед, истифода мебаред. Се усул ҳаст.
1. Оператори &&: «нишон деҳ ё чизе не»
Агар порчаи интерфейсро нишон додан ё умуман нишон надодан лозим бошад, шарт && <JSX /> менависанд. Агар шарт нодуруст бошад, false ҳосил мешавад, ва React дар ҷои false, null ва undefined чизе намекашад.
&& — нишони бо рақам · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [unread, setUnread] = useState (3 );
return (
<div className="card" >
<b>Сообщения</b>
{/* && : «агар қисми чап рост бошад — қисми ростро нишон деҳ» */ }
{unread > 0 && <span style={{ color: "crimson" }}> ({unread} новых)</span>}
<p>
<button onClick={() => setUnread (unread + 1 )}>Пришло сообщение</button>{" " }
<button onClick={() => setUnread (0 )}>Прочитать всё</button>
</p>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
2. Оператори сегона: «яке ё дигаре»
Вақте ки аз ду вариант интихоб кардан лозим аст, шарт ? А : Б-ро истифода мебаранд. Оператори сегонаро Шумо дар дарси шартҳо омӯхтед.
Оператори сегона — ворид шуд / ворид нашуд · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
export default function App () {
const [loggedIn, setLoggedIn] = useState (false );
return (
<div className="card" >
{/* оператори сегона: «ё яке, ё дигаре» */ }
{loggedIn ? <p>Привет, Мадина! Ваши курсы ждут.</p> : <p>Войдите, чтобы увидеть курсы.</p>}
<button onClick={() => setLoggedIn (!loggedIn)}>{loggedIn ? "Выйти" : "Войти" }</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
3. return-и барвақт: «ҳолати махсус — ва фавран баромадан»
Агар компонент дар ҳолати махсус тамоман дигар менамояд (боршавӣ, холӣ, хато), онро дар аввали функсия коркард кардан ва фавран return кардан қулай аст. Варианти асосӣ дар поён, бе шартҳои дарунгузошта мемонад.
return-и барвақт: боршавӣ ва «холӣ» · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
import { useState } from "react" ;
function Courses ({ loading, courses }) {
// return-и барвақт: аввал ҳолатҳои «махсус»-ро коркард мекунем
if (loading) return <p>Загрузка…</p>;
if (courses.length === 0 ) return <p>Курсов пока нет</p>;
return (
<ul>
{courses.map ((c) => <li key={c}>{c}</li>)}
</ul>
);
}
export default function App () {
const [loading, setLoading] = useState (true );
const [courses, setCourses] = useState ([]);
return (
<div className="card" >
<Courses loading={loading} courses={courses} />
<button onClick={() => setLoading (!loading)}>Загрузка вкл/выкл</button>{" " }
<button onClick={() => setCourses (["HTML и CSS" , "JavaScript" ])}>Добавить курсы</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Усул Кай истифода бурдан Мисол &&Чизе барои нишон додан ҳаст — ё не {isNew && <Badge />}? :Ду вариант дар як ҷой {loggedIn ? <Menu /> : <LoginButton />}return-и барвақтҲолати махсус тамоми компонентро тағйир медиҳад if (loading) return <Spinner />;
Монанд аз ҳаёт
Лавҳа дар мағоза: «Кушода» ё «Баста». Ин оператори сегона аст: ҳамеша яке аз ду лавҳа овезон аст. Аммо лавҳаи «Тахфиф!» танҳо агар тахфиф бошад овезон аст — ин && аст. Агар тахфиф набошад, лавҳа ҳам нест, на лавҳаи «Тахфиф нест».
Дом: «0 && …» нолро мекашад
Оператори && қисми чапро бармегардонад, агар он нодуруст бошад. false, null, undefined-ро React нишон намедиҳад, аммо рақами 0-ро ҳамчун 0 нишон медиҳад. Бинобар ин {items.length && <List />} ҳангоми рӯйхати холӣ дар саҳифа рақами 0-ро нишон медиҳад. Ошкоро муқоиса кунед: {items.length > 0 && ...}.
0 && ... — дом · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Дом: 0 && ... 0-ро бармегардонад, ва React рақами 0-ро дар экран нишон медиҳад
import { useState } from "react" ;
export default function App () {
const [count, setCount] = useState (0 );
return (
<div className="card" >
<p>Неправильно: [{count && <b>есть товары</b>}]</p>
<p>Правильно: [{count > 0 && <b>есть товары</b>}]</p>
<button onClick={() => setCount (count + 1 )}>Добавить товар ({count})</button>
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Маслиҳат
Агар шартҳо зиёд шаванд, операторҳои сегонаи дарунгузоштаро ғун накунед — хондани онҳо ғайриимкон аст. Мантиқро ба тағйирёбанда пеш аз return ё ба компоненти алоҳида бо return-и барвақт бароред.
Муфассал хонед: react.dev — Conditional Rendering , learn.javascript.ru — Операторҳои мантиқӣ
Амалиёт: мустаҳкам мекунем
ВАЗИФАИ 8.1 Нишони «Новинка» осон
Ба компоненти Dish нишони <span>Новинка</span>-ро дар паҳлуи ном илова кардан лозим аст, аммо танҳо дар таомҳое, ки isNew-и онҳо дуруст аст. Навишти <Dish name="Манту" isNew /> бе қимат маънои isNew={true}-ро дорад.
Нишони «Новинка» · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Нишони «Новинка» (<span>)-ро танҳо дар таомҳо бо isNew нишон диҳед.
function Dish ({ name, isNew }) {
return <div className="card" >{name}</div>;
}
export default function App () {
return (
<div>
<Dish name="Манту" isNew />
<Dish name="Плов" />
<Dish name="Лагман" isNew={false } />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
setTimeout (() => {
document.querySelectorAll (".card" ).forEach ((c) => console.log (c.textContent.trim ()));
}, 100 );
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Манту Новинка
Плов
Лагман
Ишора 1 Оператори && дар қавсҳои фигурӣ дар дохили JSX, пас аз номи таом навишта мешавад.
Ишора 2 {name} {isNew && <span>Новинка</span>}
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 8.2 Сабади холӣ миёна
Хаторо ёбед. Дар сабади холӣ ба ҷои ишора рақами 0 аст. Ислоҳ кунед: то даме ки сабад холӣ аст, <p>Корзина пуста</p>-ро нишон диҳед, дар акси ҳол — рӯйхатро.
Сабади холӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// То даме ки сабад холӣ аст, дар экран «0»-и аҷиб пайдо мешавад. Лозим аст:
// сабади холӣ -> матни «Корзина пуста»; дар акси ҳол -> рӯйхати молҳо.
import { useState } from "react" ;
export default function App () {
const [cart, setCart] = useState ([]);
function addItem () {
setCart ([... cart, { id: cart.length + 1 , title: "Лепёшка" }]);
}
return (
<div>
<button onClick={addItem}>Добавить лепёшку</button>
<div id="cart" >
{cart.length && (
<ul>
{cart.map ((item) => <li key={item.id}>{item.title}</li>)}
</ul>
)}
</div>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
(async () => {
await wait ();
console.log (document.querySelector ("#cart" ).textContent);
document.querySelector ("button" ).click ();
await wait ();
console.log (document.querySelector ("#cart" ).textContent);
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Корзина пуста
Лепёшка
Ишора 1 0 аз куҷо меояд? Домро аз назария ба ёд оред: 0 && ... чиро бармегардонад?
Ишора 2 &&-ро бо оператори сегона иваз кунед: {cart.length === 0 ? <p>Корзина пуста</p> : <ul>...</ul>}
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 8.3 Профил бе истифодабаранда миёна
То даме ки истифодабаранда ворид нашудааст, user ба null баробар аст, ва Profile дар user.name бо хато меафтад. Ба аввали Profile return-и барвақтро бо матни «Войдите в аккаунт» илова кунед.
Профил бе истифодабаранда · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Profile то даме ки user === null, меафтад. return-и барвақтро илова кунед:
// агар истифодабаранда набошад — <p>Войдите в аккаунт</p>-ро баргардонед.
import { useState } from "react" ;
function Profile ({ user }) {
return <p>Привет, {user.name}!</p>;
}
export default function App () {
const [user, setUser] = useState (null );
return (
<div>
<Profile user={user} />
<button onClick={() => setUser (user ? null : { name: "Мадина" })}>{user ? "Выйти" : "Войти" }</button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
(async () => {
const show = () => console.log (document.querySelector ("p" ).textContent);
await wait ();
show ();
document.querySelector ("button" ).click ();
await wait ();
show ();
document.querySelector ("button" ).click ();
await wait ();
show ();
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда Войдите в аккаунт
Привет, Мадина!
Войдите в аккаунт
Ишора 1 Шарти баромади барвақт — «истифодабаранда нест»: if (!user).
Ишора 2 if (!user) return <p>Войдите в аккаунт</p>; — як сатр болотар аз return-и асосӣ.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 8.4 FAQ-аккордеон душвор
Саволҳои кушодашавандаро созед: клик ба савол ҷавобро нишон медиҳад (<p className="answer">) ва боқиро мепӯшонад, клики такрорӣ ба ҳамон савол ҷавобро мепӯшонад. Фикр кунед: дар ҳолат чиро нигоҳ доштан кифоя аст, то ҳамзамон на бештар аз як савол кушода бошад?
FAQ-аккордеон · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// FAQ-аккордеон. Клик ба савол ҷавоби онро мекушояд ва боқиро мепӯшонад; клики такрорӣ мепӯшонад.
// Ҷавоб — <p className="answer">. Фикр кунед: дар ҳолат чиро нигоҳ доштан лозим аст, то на бештар аз яктоаш кушода бошад?
import { useState } from "react" ;
const faq = [
{ id: 1 , q: "Сколько стоит курс?" , a: "Ответ про цену" },
{ id: 2 , q: "Нужен ли свой ноутбук?" , a: "Ответ про ноутбук" },
{ id: 3 , q: "Будет ли сертификат?" , a: "Ответ про сертификат" },
];
export default function App () {
return (
<div>
{faq.map ((item) => (
<div key={item.id} className="card" >
<button>{item.q}</button>
{/* инҷо бояд ҷавоб бошад */ }
</div>
))}
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const shown = () => [... document.querySelectorAll (".answer" )].map ((a) => a.textContent).join (", " ) || "закрыто" ;
const q = (i) => document.querySelectorAll (".card button" )[i];
await wait ();
console.log (shown ());
await click (q (0 ));
console.log (shown ());
await click (q (1 ));
console.log (shown ());
await click (q (1 ));
console.log (shown ());
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда закрыто
Ответ про цену
Ответ про ноутбук
закрыто
Ишора 1 Як қимат кифоя аст — id-и саволи кушода (ё null, агар ҳама пӯшида бошанд): const [openId, setOpenId] = useState(null);
Ишора 2 Бо клик: setOpenId(openId === item.id ? null : item.id). Ҷавобро чунин нишон диҳед: {openId === item.id && <p className="answer">{item.a}</p>}.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
09 Блоки ЗС: ЗС хатоҳои React-ро шарҳ медиҳад — ва мо месанҷем
Ду хатои React-ро навомӯзон аз ҳама бештар мебинанд: «ман пахш мекунам, аммо экран тағйир намеёбад» ва «рӯйхат пас аз нест кардан ғайримуқаррарӣ рафтор мекунад». ЗС онҳоро зуд ва боэътимод шарҳ медиҳад. Аммо боэътимод — маънои дуруст нест. Вазифаи Шумо имрӯз — шарҳи ЗС-ро гирифтан ва онро дар коди худатон санҷидан : оғоз кардан, вайрон кардан, ислоҳ кардан ва боварӣ ҳосил намудан, ки сабаб дуруст номбар шудааст.
Қоидаҳои курс, ки дар ин ҷо махсусан муҳиманд
1. Аввал 15 дақиқа худатон кӯшиш мекунед: бахшҳои 04–06-и ин дарсро ба ёд оред. 2. Танҳо баъд ба ЗС мераведед. 3. Кодеро, ки сатр ба сатр шарҳ дода наметавонед, ба лоиҳа нагузоред — барои React ин маънои онро дорад: Шумо медонед, ки чаро ин ҷо массиви нав аст, на push, ва аз куҷо ҳар як key гирифта мешавад. 4. Ҷавоби ЗС-ро бо оғоз санҷед: шарҳе, ки онро дар код санҷидан мумкин нест, арзише надорад.
Чӣ тавр хостан: бад ва хуб
Формулаи промпти курс: контекст → вазифа → маҳдудиятҳо → формати ҷавоб → санҷиш . Ду промпти тайёр аз китобхонаи курс — барои «ҳолат нав намешавад» ва «key барои чӣ лозим» — аллакай аз рӯи он сохта шудаанд.
дар реакт тугмаи ман кор намекунад, ислоҳ кунНусха бардоштан
Ман React-ро дар сатҳи навомӯз меомӯзам: props, useState ва .map()-ро медонам. Инак компоненти ман: [код гузоред]. Ҳангоми пахши «Добавить» унсури нав дар экран пайдо намешавад, гарчанде ки дар консол он дар массив ҳаст. Шарҳ деҳ, чаро useState кор накард ва чӣ тавр ислоҳ кардан лозим. Маҳдудиятҳо: бе китобхонаҳои тарафи сеюм, бе useEffect, то ҳадди имкон камтар сатрро тағйир деҳ. Формати ҷавоб: 1) сабаб дар ду ҷумла бо калимаҳои оддӣ; 2) коди ислоҳшуда пурра; 3) чӣ маҳз тағйир ёфт. Санҷиш: дар охир бигӯ, ки оё ман ҳолатро бевосита мутатсия намекунам.Нусха бардоштан
барои чӣ дар реакт keyНусха бардоштан
Дар мисоли ман шарҳ деҳ, ки React барои чӣ key дар .map() лозим дорад ва бе он чӣ вайрон мешавад: [коди рӯйхатро гузоред]. Ман навомӯзам. Формат: шарҳи кӯтоҳ бо монанд, баъд нишон деҳ, ки агар index-ро ҳамчун key истифода баранд, рӯйхат чӣ тавр вайрон мешавад ва чӣ тавр ислоҳ кардан лозим. Санҷиш: пешниҳод кун, ки ман худам чӣ тавр дар хато ҳангоми нест кардани унсур аз миёнаи рӯйхат боварӣ ҳосил кунам (кадом майдонҳои воридот ва кадом амалҳо лозиманд).Нусха бардоштан
Чек-лист: шарҳи ЗС-ро чӣ тавр санҷидан лозим
1) Ҳолат нав намешавад: оё ЗС мутатсияро ёфт (push, obj.x = …, sort бе нусха)? Агар вай «танҳо useEffect илова кун» ё «маҷбурӣ аз нав каш» пешниҳод кунад — ин қариб ҳамеша зиёдатӣ аст. 2) Калидҳо: кадом key-ро интихоб кард? Агар index «барои хориҷ кардани огоҳӣ» бошад — ин ҳамон хато -и бахши 06 аст. Калид бояд аз маълумот ояд. 3) Санҷиш бо оғоз: хаторо ҳангоми нест кардан аз миёна — бо майдони воридот дар ҳар сатр — пеш ва пас аз ислоҳ такрор кунед. 4) Оё Шумо бо суханони худ шарҳ дода метавонед, ки чаро ислоҳ кор мекунад?
Ёрирасони хуби ЗС шарҳ медиҳад, на танҳо ислоҳ мекунад. Агар дар ҷавоб ҳатто як калимаро нафаҳмида бошед, бипурсед: «соддатар шарҳ деҳ, дар мисоли чойхона». Ва аз баҳс ҳаросон нашавед: агар ЗС key={index} пешниҳод кард, ба ӯ бо мисоли бахши 06 эътироз кунед ва бинед, ки ӯ чӣ тавр мебарояд.
Амалиёт: ЗС-ро месанҷем
ВАЗИФАИ 9.1 Рӯйхати корҳо «аз ЗС» душвор
Ин кодро ЗС аз рӯи дархости «рӯйхати корҳоро дар React бисоз» додааст. Он оғоз мешавад, аммо дар он се хато ҳаст: тугмаи «Добавить» экранро нав намекунад, пас аз нест кардан аз миёна қайдҳо назди ҳамсояҳо мераванд, ва пас аз «нест кардан → илова кардан» нест кардани сатри охирин якбора ду сатрро мебарад. Ҳар серо ёбед ва ислоҳ кунед. Хатои охирин маккор аст: фикр кунед, ки id-и вазифаи нав аз куҷо гирифта мешавад ва оё он метавонад такрор шавад.
Рӯйхати корҳо «аз ЗС» · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Ин рӯйхати корҳоро «ЗС навишт». Он оғоз мешавад, аммо нодуруст кор мекунад. ҲАМАИ хатоҳоро ёбед ва ислоҳ кунед.
// Аломатҳо: пас аз иловакунӣ рӯйхат нав намешавад; пас аз нест кардан қайдҳо назди ҳамсояҳо мераванд;
// пас аз «нест кардан, баъд илова кардан» нест кардан якбора ду сатрро мебарад.
import { useState } from "react" ;
export default function App () {
const [todos, setTodos] = useState ([
{ id: 1 , text: "Позвонить маме" },
{ id: 2 , text: "Купить лепёшки" },
]);
function addTodo () {
todos.push ({ id: todos.length + 1 , text: "Новая задача" });
setTodos (todos);
}
return (
<div>
<ul>
{todos.map ((t, i) => (
<li key={i}>
<b>{t.text}</b> <input placeholder="заметка" />{" " }
<button className="del" onClick={() => setTodos (todos.filter ((x) => x.id !== t.id))}>✕</button>
</li>
))}
</ul>
<button className="add" onClick={addTodo}>Добавить</button>
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const $ = (s) => document.querySelector (s);
const $$ = (s) => [... document.querySelectorAll (s)];
const count = () => console.log ($$("li" ).length);
await wait ();
await click ($(".add" ));
count ();
$$("input" ).forEach ((input, i) => (input.value = ["a" , "b" , "c" ][i]));
await click ($$(".del" )[0 ]);
console.log ($$("li" ).map ((li) => li.querySelector ("b" ).textContent + ": " + li.querySelector ("input" ).value).join (" | " ));
await click ($(".add" ));
count ();
await click ($$(".del" )[2 ]);
count ();
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда 3
Купить лепёшки: b | Новая задача: c
3
2
Ишора 1 Се ҷой: push + setTodos(todos) (мутатсия), key={i} (индекс ба ҷои шиноснома) ва id: todos.length + 1 (пас аз нест кардан дарозӣ кам мешавад, ва id-и нав бо мавҷуда мувофиқ меояд).
Ишора 2 Иловакунӣ: setTodos([...todos, { id: Date.now(), text: "Новая задача" }]). Калид: key={t.id}. Шиносоӣ як маротиба — дар лаҳзаи иловакунӣ эҷод мешавад.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
ВАЗИФАИ 9.2 Промпти худии шумо дар бораи key осон
Коди худро аз вазифаи 6.1 ё 9.1 гиред ва барои ЗС промптро аз рӯи формулаи курс тартиб диҳед. Фиристед, ҷавоб гиред ва онро аз чек-листи боло гузаронед. Дар шарҳ нависед: ЗС кадом key-ро пешниҳод кард, оё бо ӯ баҳс кардан лозим омад, ва чӣ тавр боварӣ ҳосил кардед, ки шарҳ дуруст аст. Санҷиши худкор нест — вазифаро дастӣ қайд кунед, вақте ки тайёр шавад.
Таҳрир кардан мумкин аст · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
// Промпти ман:
// ...
// ЗС кадом key-ро пешниҳод кард ва ман чиро санҷидам:
// ...
Ишора 1 Агар ҷавоби ЗС Шуморо қонеъ накард, «боз як бор ислоҳ кун» нахоҳед, балки нокомии мушаххасро ном баред: «пас аз нест кардани сатри аввал қайд назди дуюм монд».
Ишора 2 Ҷавобро бо бахши 06-и ин дарс муқоиса кунед. Агар ЗС чизеро иддао кунад, ки дар он ҷо нест, — дар код аз нав санҷед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
10 Амалиёт дар дарс: феҳристи курсҳо бо лайкҳо
Ҳамаро якҷоя ҷамъ мекунем: феҳристи курсҳои MakeFirstStep. Кортҳо аз массив тавассути props кашида мешаванд, ҳар кадом тугмаи «лайк» дорад, ки ҳолати худро ба ёд медорад. Қадам ба қадам меравем — пас аз ҳар қадам код кор мекунад. Ҳар қадамро ҳамин ҷо оғоз ва тағйир додан мумкин аст.
Қадами 1. Компонент ва props
Аввал як компоненти CourseCard ва се даъват бо маълумоти гуногун.
Қадами 1. CourseCard ва props · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қадами 1. Компоненти CourseCard ва се корт бо props-и гуногун
function CourseCard ({ title, price }) {
return (
<div className="card" >
<b>{title}</b>
<div>{price} сомони в месяц</div>
</div>
);
}
export default function App () {
return (
<div>
<CourseCard title="HTML и CSS" price={300 } />
<CourseCard title="JavaScript" price={400 } />
<CourseCard title="React Lite" price={450 } />
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Қадами 2. Маълумот ба массив ва map
Се сатри қариб якхела — сабаб барои ба массив баровардани маълумот аст. id-ро барои калидҳо илова мекунем ва кортҳоро тавассути map нишон медиҳем.
Қадами 2. Массив ва map бо key · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қадами 2. Маълумот — ба массив, кортҳо — тавассути map бо key
const courses = [
{ id: 1 , title: "HTML и CSS" , price: 300 },
{ id: 2 , title: "JavaScript" , price: 400 },
{ id: 3 , title: "React Lite" , price: 450 },
];
function CourseCard ({ title, price }) {
return (
<div className="card" >
<b>{title}</b>
<div>{price} сомони в месяц</div>
</div>
);
}
export default function App () {
return (
<div>
{courses.map ((course) => (
<CourseCard key={course.id} title={course.title} price={course.price} />
))}
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Қадами 3. Лайк бо useState
Ба ҳар корт ҳолати худии liked-ро илова мекунем. Шумораи лайкҳоро нигоҳ намедорем — ҳисоб мекунем: likes + (liked ? 1 : 0). Якчанд дилро пахш кунед: кортҳо ба якдигар халал намерасонанд.
Қадами 3. Лайк дар ҳар корт · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қадами 3. Лайк: ҳар корт ҳолати худии liked-ро дорад
import { useState } from "react" ;
const courses = [
{ id: 1 , title: "HTML и CSS" , likes: 10 },
{ id: 2 , title: "JavaScript" , likes: 25 },
{ id: 3 , title: "React Lite" , likes: 7 },
];
function CourseCard ({ title, likes }) {
const [liked, setLiked] = useState (false );
const count = likes + (liked ? 1 : 0 );
return (
<div className="card" >
<b>{title}</b>{" " }
<button onClick={() => setLiked (!liked)}>{liked ? "♥" : "♡" } {count}</button>
</div>
);
}
export default function App () {
return (
<div>
{courses.map ((course) => (
<CourseCard key={course.id} title={course.title} likes={course.likes} />
))}
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Қадами 4 (бонус). Ҳисобкунаки умумӣ: ҳолатро боло мебарем
Агар ҳисобкунаки «маъқул шуд N аз M» дар болои рӯйхат лозим бошад чӣ? Кортҳо дар ин бора ба ҳамсояҳо гуфта наметавонанд, ва App ба ҳолати корт нигоҳ карда наметавонад. Ҳал — ҳолатро ба боло бардоштан : App нигоҳ медорад, ки кадом курсҳо лайк шудаанд, ва корт liked ва функсияи onToggle-ро тавассути props мегирад. Бале, props функсия ҳам буда метавонанд: ин тавр фарзанд ба волид дар бораи ҳодиса «хабар медиҳад».
Қадами 4 (бонус). Ҳисобкунаки умумӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Қадами 4 (бонус). Ҳолатро боло мебарем: App медонад, ки кадом курсҳо лайк шудаанд, ва ҳисобкунаки умумиро ҳисоб мекунад
import { useState } from "react" ;
const courses = [
{ id: 1 , title: "HTML и CSS" },
{ id: 2 , title: "JavaScript" },
{ id: 3 , title: "React Lite" },
];
// onToggle — ин prop-ФУНКСИЯ аст: корт онро даъват мекунад, вақте ки ба дил пахш карданд
function CourseCard ({ title, liked, onToggle }) {
return (
<div className="card" >
<b>{title}</b>{" " }
<button onClick={onToggle}>{liked ? "♥ Нравится" : "♡ Лайк" }</button>
</div>
);
}
export default function App () {
const [likedIds, setLikedIds] = useState ([]);
function toggle (id) {
setLikedIds (likedIds.includes (id) ? likedIds.filter ((x) => x !== id) : [... likedIds, id]);
}
return (
<div>
<h3>Понравилось: {likedIds.length} из {courses.length}</h3>
{courses.map ((course) => (
<CourseCard
key={course.id}
title={course.title}
liked={likedIds.includes (course.id)}
onToggle={() => toggle (course.id)}
/>
))}
</div>
);
}
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Монанд аз ҳаёт
Сардори гурӯҳ. Ҳар донишҷӯ метавонад бигӯяд «ман омадам», аммо рӯйхати умумии ҳозиршавиро сардор пеш мебарад — як нафар, ки он пурра назди ӯст. Донишҷӯ (корт) варақаи умумиро назди худ нигоҳ намедорад, балки ба сардор (App) тавассути функсияи onToggle хабар медиҳад. Ва сардор хулосаро эълон мекунад: «3 нафар аз 5 омаданд».
Амалиёт: феҳристро ҷамъ мекунем
ВАЗИФАИ 10.1 Феҳрист бо лайкҳо миёна
Ҳоло дар экран як ҷойгиркунанда аст. Феҳристро аз рӯи қадамҳои 1–3 ҷамъ кунед: CourseCard props-и title ва likes-ро мегирад, App ҳамаи курсҳоро тавассути map нишон медиҳад, ва ҳар корт ҳолати худии liked-ро дорад: клик — ♥ ва рақам ба 1 зиёд, клики такрорӣ — ҳама чиз бозпас.
Феҳрист бо лайкҳо · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Феҳристи курсҳо. Ҳоло дар экран як ҷойгиркунанда аст. Ҳар чизеро, ки мо таҳлил кардем, ҷамъ кунед:
// 1) CourseCard props-и title ва likes-ро мегирад ва ном ва тугмаи «♡ рақам»-ро нишон медиҳад;
// 2) App ҳамаи курсҳоро аз массив тавассути map бо key нишон медиҳад;
// 3) ҳар корт ҳолати худии liked-ро дорад: клик → «♥ рақам+1», клики такрорӣ → бозпас «♡ рақам».
const courses = [
{ id: 1 , title: "HTML и CSS" , likes: 10 },
{ id: 2 , title: "JavaScript" , likes: 25 },
{ id: 3 , title: "React Lite" , likes: 7 },
];
function CourseCard () {
return (
<div className="card" >
<b>Курс</b> <button className="like" >♡ 0 </button>
</div>
);
}
export default function App () {
return (
<div>
<CourseCard />
</div>
);
}
// ---- санҷиш (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
async function click (el) {
el.click ();
await wait ();
}
(async () => {
const cards = () => [... document.querySelectorAll (".card" )];
const show = () =>
console.log (cards ().map ((c) => c.querySelector ("b" ).textContent + " " + c.querySelector (".like" ).textContent).join (" | " ));
await wait ();
show ();
await click (cards ()[0 ].querySelector (".like" ));
await click (cards ()[2 ].querySelector (".like" ));
show ();
await click (cards ()[0 ].querySelector (".like" ));
show ();
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Натиҷаи интизоршаванда HTML и CSS ♡ 10 | JavaScript ♡ 25 | React Lite ♡ 7
HTML и CSS ♥ 11 | JavaScript ♡ 25 | React Lite ♥ 8
HTML и CSS ♡ 10 | JavaScript ♡ 25 | React Lite ♥ 8
Ишора 1 Тартиби кор: аввал props ва map (санҷед, ки се корт намоён аст), ва танҳо баъд useState-ро ба CourseCard илова кунед.
Ишора 2 Дар CourseCard: const [liked, setLiked] = useState(false);, дар тугма onClick={() => setLiked(!liked)} ва {liked ? "♥" : "♡"} {likes + (liked ? 1 : 0)}. className="like"-ро дар тугма ва воридоти useState-ро фаромӯш накунед.
○ Ҳалшуда қайд кардан 💬 Дар бораи ин вазифа пурсидан
11 Вазифаи хонагӣ: Todo-рӯйхат дар React
Todo-рӯйхат дар React: илова кардани вазифа, иҷрошуда қайд кардан, нест кардан. Артефакт — компоненти интерактивӣ дар useState + рӯйхат тавассути .map() . Усулҳои асосиро Шумо аллакай дар вазифаҳои 5.3 ва 7.3 машқ кардед — акнун онҳоро ба як барнома ҷамъ кунед. Дар поён коди оғозӣ бо «худсанҷӣ» ҳаст: онро оғоз кунед — дар консол сатрҳо бо аломати ✗ пайдо мешаванд, ҳадафи Шумо — ҳамаи ✓.
Todo-рӯйхат: коди оғозӣ ва худсанҷӣ · Ctrl + Enter ↺ Аз нав ▶ Иҷро кардан
App.jsx style.css
// Todo-рӯйхат. Ҳолат ва се амалро ба итмом расонед: илова кардан, қайд кардан, нест кардан.
// Блоки «худсанҷӣ» дар поён худаш тугмаҳоро пахш мекунад ва ✓ ё ✗-ро ба консол менависад — ба даст оред, ки ҳамаи сатрҳо бо ✓ бошанд.
import { useState } from "react" ;
export default function App () {
// ҳолат: массиви вазифаҳо { id, text, done } ва матни майдон
function handleSubmit (event) {
event.preventDefault ();
// вазифаро илова кардан
}
return (
<div>
<form onSubmit={handleSubmit}>
<input placeholder="Новая задача" />{" " }
<button>Добавить</button>
</form>
<p id="left" >Осталось: 0 </p>
<ul>
{/* барои ҳар вазифа: <li> бо чекбокс, <span> бо матн (класси done дар иҷрошуда) ва тугмаи ✕ (className="del") */ }
</ul>
</div>
);
}
// ---- худсанҷӣ (тағйир надиҳед) ----
const wait = () => new Promise ((r) => setTimeout (r, 60 ));
function typeInto (el, value) {
Object.getOwnPropertyDescriptor (Object.getPrototypeOf (el), "value" ).set.call (el, value);
el.dispatchEvent (new Event ("input" , { bubbles: true }));
}
async function add (text) {
typeInto (document.querySelector ("input[placeholder]" ), text);
await wait ();
document.querySelector ("form" ).requestSubmit ();
await wait ();
}
(async () => {
const $ = (s) => document.querySelector (s);
const $$ = (s) => [... document.querySelectorAll (s)];
const check = (ok, msg) => console.log ((ok ? "✓ " : "✗ " ) + msg);
await wait ();
await add ("Купить лепёшки" );
await add ("Позвонить маме" );
check ($("input[placeholder]" ).value === "" , "поле очищается после добавления" );
await add (" " );
check ($$("li" ).length === 2 , "добавление: две задачи, пустая строка не добавилась" );
check ($("#left" ).textContent.trim () === "Осталось: 2" , "счётчик: Осталось: 2" );
if ($$("li" ).length < 2 ) return console.log ("✗ дальше проверять нечего: выведите задачи в список" );
$$("li input[type=checkbox]" )[0 ].click ();
await wait ();
check ($$("li span" )[0 ].classList.contains ("done" ), "отметка: у первой задачи класс done" );
check (!$$("li span" )[1 ].classList.contains ("done" ), "отметка: вторая задача не затронута" );
check ($("#left" ).textContent.trim () === "Осталось: 1" , "счётчик: Осталось: 1" );
$$("li input[type=checkbox]" )[0 ].click ();
await wait ();
check (!$$("li span" )[0 ].classList.contains ("done" ), "повторный клик снимает отметку" );
$$("li .del" )[0 ].click ();
await wait ();
check ($$("li" ).length === 1 && $$("li span" )[0 ].textContent === "Позвонить маме" , "удаление: осталась «Позвонить маме»" );
check ($("#left" ).textContent.trim () === "Осталось: 1" , "счётчик после удаления" );
})();
body { font-family : system-ui, sans-serif; }
.card { border : 1px solid #d5dbe6 ; border-radius : 12px ; padding : 10px 14px ; margin : 8px 0 ; background : #fff ; }
button { padding : 6px 12px ; font : inherit; cursor : pointer; }
input { padding : 6px 8px ; font : inherit; }
ul { padding-left : 20px ; }
.done { text-decoration : line-through; color : #8a93a6 ; }
Пешнамоиш Пӯшонидан
Барои дидани натиҷа «Иҷро кардан»-ро пахш кунед.
Чӣ кор кардан лозим аст
Ҳолат. Массиви вазифаҳо { id, text, done } ва матни майдони воридот (майдони идорашаванда).
Иловакунӣ. Тавассути <form onSubmit> бо preventDefault. Сатрҳои холӣ ва сатрҳои аз фосилаҳо иборат илова намешаванд. Пас аз иловакунӣ майдон тоза мешавад. id ҳангоми иловакунӣ эҷод мешавад (Date.now()).
Рӯйхат. Тавассути .map() бо key={task.id}. Дар ҳар вазифа: чекбокс, матн дар <span> ва тугмаи ✕ бо className="del".
Қайд. Чекбокс done-ро иваз мекунад. Дар вазифаи иҷрошуда дар <span> класси done (матни хатзада) ҳаст.
Нест кардан. Тугмаи ✕ вазифаро аз рӯйхат мебардорад.
Ҳисобкунак <p id="left">Осталось: N</p> — шумораи иҷронашудагон. Ишора: ин ҳолати алоҳида нест, балки қимати ҳисобшаванда аст.
Рендери шартӣ. Агар вазифаҳо набошанд — ба ҷои рӯйхат «Пока задач нет» нишон дода мешавад (худсанҷӣ ба ин банд сахтгирӣ намекунад, аммо дар баҳо ба назар гирифта мешавад).
Ҳеҷ мутатсия. На push, на splice, на таъини қимат ба майдонҳои объектҳо дар ҳолат — танҳо spread, map ва filter.
Санҷиши ЗС. Агар ЗС-ро истифода бурда бошед — промпти худ ва ҷавоб ба саволро замима кунед: кадом хаторо (мутатсия, калид) ЗС содир кард ё каме монда буд, ва Шумо инро чӣ тавр санҷидед.
Бонус барои қавиҳо
Филтрҳои «Ҳама / Фаъол / Иҷрошуда» — як ҳолати иловагии filter.
Тугмаи «Тоза кардани иҷрошудаҳо» — як сатр бо filter.
Таҳрири матни вазифа бо клики дукарата.
Чӣ супоридан лозим
Истиноди репозиторий дар GitHub бо лоиҳаи Vite (App.jsx ва услубҳо).
Скриншот: рӯйхат бо се вазифа, яке аз онҳо иҷро шудааст.
README-и кӯтоҳ: барнома чӣ кор карда метавонад ва кадом усулҳо (props, map, useState) дар куҷо истифода шудаанд.
Чӣ тавр баҳо медиҳем (0–10)
Чӣ Холҳо Иловакунӣ: шакл, preventDefault, сатрҳои холӣ рад мешаванд, майдон тоза мешавад 2 Иҷрошуда қайд кардан ва ҳисобкунаки «Осталось» 2 Нест кардан тавассути filter 1 Рӯйхат тавассути .map() бо key={id}, на индекс 2 Мутатсияи ҳолат нест (spread, map, filter) 2 Ҳолати холии «Пока задач нет», коди тоза, коди ЗС-ро шарҳ дода метавонед 1
Пеш аз супоридан
Худатон санҷед: се вазифа илова кунед, миёнаро нест кунед ва охиринро қайд намоед. Агар вазифаи хатзада дигар баромад, пас дар ягон ҷо индекс ба ҷои id мондааст.
✓ Шпаргалкаи дарс
Props: маълумот аз волид ба фарзанд ҳамчун атрибутҳо меравад, бо объект меояд: function Card({ name, price }). Props танҳо барои хондан. Сатрҳо — дар зеркалимаҳо, боқӣ — дар { }.
children: ҳар чизе, ки байни тегҳои компонент аст. {children}-ро дар ҷое, ки лозим аст, нишон медиҳем: чорчӯбаҳо, панелҳо, печонандаҳо.
Пешфарз ва rest: { label = "Нажми" } танҳо барои undefined кор мекунад; барои null — ??. { a, ...rest } боқиро ҷамъ мекунад, <input {...rest} /> тақсим мекунад.
Рӯйхатҳо: items.map((x) => <Item key={x.id} … />). Бо { } пас аз тир return лозим аст. Филтр — filter пеш аз map.
key: якто ва устувор, аз маълумот (id). На index барои рӯйхатҳои тағйирёбанда (майдонҳои воридот ва ҳолати сатрҳо вайрон мешаванд) ва на Math.random().
useState: const [x, setX] = useState(аввалия). Қимати аввалия — танҳо ҳангоми намоиши аввал. Тағйирёбандаи оддӣ экранро нав намекунад. Ҳукҳо — танҳо дар сатҳи болои компонент.
Нави функсионалӣ: setX((x) => x + 1), вақте ки қимати нав аз кӯҳна вобаста аст. Ҳисобшавандаро дар ҳолат нигоҳ намедорем.
Мутатсия намекунем: илова кардан [...arr, x], нест кардан arr.filter(...), тағйир додан arr.map(...), объект { ...obj, k: v }. Мумкин нест: push, splice, obj.k = v, sort бе нусха.
Ҳодисаҳо: onClick={fn} — функсияро медиҳем, даъват намекунем: onClick={() => remove(id)}. Шакл: onSubmit + event.preventDefault().
Майдони идорашаванда: value={text} + onChange={(e) => setText(e.target.value)}; дар чекбокс — checked ва e.target.checked.
Рендери шартӣ: cond && <A /> («ё чизе не»), cond ? <A /> : <B /> («яке ё дигаре»), return-и барвақт барои ҳолатҳои махсус. 0 && … 0-ро мекашад — муқоиса кунед: n > 0 && ….
Боло бурдани ҳолат: ҳолати умумӣ дар наздиктарин волиди умумӣ зиндагӣ мекунад, ва ба фарзандон қимат ва функсияи коркардкунанда тавассути props медиҳем.
Бо ЗС: аввал худатон, баъд промпт аз рӯи формула. Шарҳи ЗС-ро бо оғоз месанҷем: оё мутатсия нест ва key аз куҷо гирифта шудааст.