Murakkab Komponent patternlari yordamida kuchli React komponent dizaynini kashf eting. Global ilovalar uchun moslashuvchan, qo'llab-quvvatlanadigan va qayta ishlatiladigan UI'lar yaratishni o'rganing.
React Komponent Kompozitsiyasini Mahorat bilan o'zlashtirish: Murakkab Komponent Patternlariga chuqur kirish
Veb-dasturlashning keng va jadal rivojlanayotgan landshaftida React mustahkam va interaktiv foydalanuvchi interfeyslarini yaratish uchun asosiy texnologiya sifatida o'z o'rnini mustahkamladi. React falsafasining markazida kompozitsiya printsipi yotadi – bu murakkab UI'larni kichik, mustaqil va qayta ishlatiladigan komponentlarni birlashtirish orqali qurishga undaydigan kuchli paradigma. Bu yondashuv an'anaviy meros modellaridan keskin farq qilib, ilovalarimizda katta moslashuvchanlik, qo'llab-quvvatlash qulayligi va kengaytirilish imkoniyatlarini ta'minlaydi.
React dasturchilari uchun mavjud bo'lgan ko'plab kompozitsiya patternlari orasida Murakkab Komponent Patterni o'zaro bog'liq holat va mantiqqa ega bo'lgan murakkab UI elementlarini boshqarish uchun ayniqsa nafis va samarali yechim sifatida ajralib turadi. Bir-biri bilan chambarchas bog'liq bo'lgan va birgalikda ishlashi kerak bo'lgan komponentlar to'plamini tasavvur qiling, xuddi mahalliy HTML <select> va <option> elementlari kabi. Murakkab Komponent Patterni bunday holatlar uchun toza, deklarativ API taqdim etadi, bu esa dasturchilarga yuqori darajada intuitiv va kuchli maxsus komponentlarni yaratish imkonini beradi.
Ushbu keng qamrovli qo'llanma sizni React'dagi Murakkab Komponent Patternlari dunyosiga chuqur sayohatga olib boradi. Biz uning asosiy tamoyillarini o'rganamiz, amaliy tatbiq misollarini ko'rib chiqamiz, uning afzalliklari va potentsial kamchiliklarini muhokama qilamiz va ushbu patternni global ishlab chiqish ish oqimlariga integratsiya qilish uchun eng yaxshi amaliyotlarni taqdim etamiz. Ushbu maqolaning oxiriga kelib, siz turli xalqaro auditoriyalar uchun yanada mustahkam, tushunarli va kengaytiriladigan React ilovalarini yaratish uchun Murakkab Komponentlardan foydalanish uchun bilim va ishonchga ega bo'lasiz.
React Kompozitsiyasining Mohiyati: LEGO g'ishtlari bilan qurish
Murakkab Komponentlarga chuqurroq kirishdan oldin, React'ning asosiy kompozitsiya falsafasi haqidagi tushunchamizni mustahkamlashimiz muhim. React "merosdan ko'ra kompozitsiyani" qo'llab-quvvatlaydi, bu ob'ektga yo'naltirilgan dasturlashdan olingan, ammo UI ishlab chiqishda samarali qo'llaniladigan kontseptsiya. Sinflarni kengaytirish yoki xususiyatlarni meros qilib olish o'rniga, React komponentlari bir-biri bilan birlashtirilish uchun mo'ljallangan, xuddi alohida LEGO g'ishtlaridan murakkab tuzilma yig'ish kabi.
Bu yondashuv bir qancha jozibali afzalliklarni taqdim etadi:
- Qayta foydalanish imkoniyatini oshirish: Kichikroq, aniq vazifaga yo'naltirilgan komponentlar ilovaning turli qismlarida qayta ishlatilishi mumkin, bu kod takrorlanishini kamaytiradi va ishlab chiqish tsikllarini tezlashtiradi. Masalan, Button komponenti kirish formasida, mahsulot sahifasida yoki foydalanuvchi panelida ishlatilishi mumkin, har safar props orqali biroz farqli sozlanadi.
- Qo'llab-quvvatlash qulayligini yaxshilash: Xatolik yuzaga kelganda yoki biror funksiyani yangilash kerak bo'lganda, siz monolit kod bazasini titkilash o'rniga, muammoni ko'pincha aniq, izolyatsiya qilingan komponentda topishingiz mumkin. Bu modullik nosozliklarni tuzatishni osonlashtiradi va o'zgarishlar kiritishni ancha xavfsiz qiladi.
- Kattaroq moslashuvchanlik: Kompozitsiya dinamik va moslashuvchan UI tuzilmalariga imkon beradi. Siz mavjud kodni keskin o'zgartirmasdan, komponentlarni osongina almashtirishingiz, qayta tartiblashingiz yoki yangilarini kiritishingiz mumkin. Bu moslashuvchanlik talablar tez-tez o'zgarib turadigan loyihalarda bebaho hisoblanadi.
- Vazifalarni yaxshiroq ajratish: Har bir komponent ideal holda bitta vazifani bajaradi, bu esa toza va tushunarliroq kodga olib keladi. Bir komponent ma'lumotlarni ko'rsatish, boshqasi foydalanuvchi kiritishini boshqarish, yana bir boshqasi esa joylashuvni boshqarish uchun mas'ul bo'lishi mumkin.
- Osonroq testlash: Izolyatsiya qilingan komponentlarni alohida testlash osonroq, bu esa yanada mustahkam va ishonchli ilovalarga olib keladi. Siz butun ilova holatini taqlid qilmasdan, komponentning o'ziga xos xatti-harakatini sinab ko'rishingiz mumkin.
Eng asosiy darajada, React kompozitsiyasi props va maxsus children prop orqali amalga oshiriladi. Komponentlar ma'lumotlarni va sozlamalarni props orqali qabul qiladi va ular o'zlariga children sifatida uzatilgan boshqa komponentlarni render qilishi mumkin, bu esa DOMga o'xshash daraxtsimon tuzilmani hosil qiladi.
// Asosiy kompozitsiya misoli
const Card = ({ title, children }) => (
<div style={{ border: '1px solid #ccc', padding: '20px', margin: '10px' }}>
<h3>{title}</h3>
{children}
</div>
);
const App = () => (
<div>
<Card title="Xush kelibsiz">
<p>Bu xush kelibsiz kartasining mazmuni.</p>
<button>Batafsil</button>
</Card>
<Card title="Yangiliklar">
<ul>
<li>Eng so'nggi texnologiya trendlari.</li>
<li>Global bozor tahlillari.</li>
</ul>
</Card>
</div>
);
// Ushbu App komponentini render qilish
Asosiy kompozitsiya juda kuchli bo'lsa-da, u har doim ham bir nechta ichki komponentlar ortiqcha prop uzatishsiz umumiy holatni bo'lishishi va unga munosabat bildirishlari kerak bo'lgan stsenariylarni nafis hal qila olmaydi. Aynan shu yerda Murakkab Komponentlar o'zini namoyon qiladi.
Murakkab Komponentlarni tushunish: Yaxlit tizim
Murakkab Komponent Patterni - bu React'dagi dizayn patterni bo'lib, unda ota-komponent va uning bola komponentlari umumiy, yashirin holatga ega bo'lgan murakkab UI elementini taqdim etish uchun birgalikda ishlashga mo'ljallangan. Barcha holat va mantiqni bitta monolit komponent ichida boshqarish o'rniga, mas'uliyat birgalikda to'liq UI vidjetini tashkil etuvchi bir nechta yonma-yon joylashgan komponentlar o'rtasida taqsimlanadi.
Buni velosipedga o'xshatish mumkin. Velosiped shunchaki rama emas; u rama, g'ildiraklar, rul, pedallar va zanjirdan iborat bo'lib, ularning barchasi velosiped haydash funksiyasini bajarish uchun uzviy bog'liqlikda ishlashga mo'ljallangan. Har bir qismning o'ziga xos vazifasi bor, ammo ularning haqiqiy kuchi yig'ilib, birgalikda ishlaganda namoyon bo'ladi. Xuddi shunday, Murakkab Komponent tuzilmasida alohida komponentlar (masalan, <Accordion.Item> yoki <Select.Option>) ko'pincha o'z-o'zicha ma'nosiz bo'ladi, lekin o'zlarining ota-komponentlari (masalan, <Accordion> yoki <Select>) kontekstida ishlatilganda yuqori darajada funksional bo'lib qoladi.
O'xshatish: HTMLning <select> va <option> elementlari
Murakkab komponent patternining eng intuitiv misoli allaqachon HTMLga o'rnatilgan: <select> va <option> elementlari.
<select name="country">
<option value="us">United States</option>
<option value="gb">United Kingdom</option>
<option value="jp">Japan</option>
<option value="de">Germany</option>
</select>
E'tibor bering:
<option>elementlari har doim<select>ichida joylashadi. Ular o'z-o'zicha ma'noga ega emas.<select>elementi o'zining<option>bolalarining xatti-harakatlarini yashirincha boshqaradi (masalan, qaysi biri tanlanganligi, klaviatura navigatsiyasini boshqarish).<select>dan har bir<option>ga uning tanlanganligini aytish uchun aniq prop uzatilmaydi; holat ota-komponent tomonidan ichkarida boshqariladi va yashirincha bo'lishiladi.- API nihoyatda deklarativ va tushunish oson.
Bu aynan Murakkab Komponent Patterni React'da takrorlashni maqsad qilgan intuitiv va kuchli API turidir.
Murakkab Komponent Patternlarining Asosiy Afzalliklari
Ushbu patternni qo'llash sizning React ilovalaringiz uchun, ayniqsa ular murakkabligi oshib, global miqyosdagi turli jamoalar tomonidan qo'llab-quvvatlanayotganda, sezilarli afzalliklarni taqdim etadi:
- Deklarativ va Intuitiv API: Murakkab komponentlardan foydalanish ko'pincha mahalliy HTMLga taqlid qiladi, bu esa APIni yuqori darajada o'qiladigan va dasturchilar uchun keng hujjatlarsiz ham oson tushuniladigan qiladi. Bu, ayniqsa, turli a'zolari kod bazasi bilan turlicha tanish bo'lishi mumkin bo'lgan taqsimlangan jamoalar uchun foydalidir.
- Mantiqni inkapsulyatsiya qilish: Ota-komponent umumiy holat va mantiqni boshqaradi, bola komponentlar esa o'zlarining maxsus render qilish mas'uliyatlariga e'tibor qaratadi. Ushbu inkapsulyatsiya holatning tashqariga chiqib ketishini va boshqarib bo'lmaydigan holga kelishini oldini oladi.
-
Qayta foydalanish imkoniyatini oshirish: Ichki komponentlar bir-biriga bog'liqdek tuyulishi mumkin bo'lsa-da, umumiy murakkab komponentning o'zi yuqori darajada qayta ishlatiladigan va moslashuvchan qurilish bloki bo'lib qoladi. Siz butun
<Accordion>tuzilmasini ilovangizning istalgan joyida qayta ishlatishingiz mumkin, uning ichki ishlashi izchil ekanligiga ishonch hosil qilasiz. - Yaxshilangan Qo'llab-quvvatlash: Ichki holatni boshqarish mantig'idagi o'zgarishlar ko'pincha har bir bolaga o'zgartirish kiritishni talab qilmasdan, ota-komponent bilan cheklanishi mumkin. Xuddi shunday, bolaning render qilish mantig'idagi o'zgarishlar faqat o'sha bolaga ta'sir qiladi.
- Vazifalarni yaxshiroq ajratish: Murakkab komponent tizimining har bir qismi aniq rolga ega, bu esa yanada modulli va tartibli kod bazasiga olib keladi. Bu yangi jamoa a'zolarini ishga jalb qilishni osonlashtiradi va mavjud dasturchilar uchun kognitiv yukni kamaytiradi.
- Moslashuvchanlikni oshirish: Murakkab komponentingizdan foydalanadigan dasturchilar bola komponentlarni erkin tarzda qayta tartibga solishi yoki hatto ba'zilarini tashlab yuborishi mumkin, agar ular kutilgan tuzilishga rioya qilsalar, ota-komponentning funksionalligini buzmasdan. Bu ichki murakkablikni oshkor qilmasdan yuqori darajadagi kontent moslashuvchanligini ta'minlaydi.
React'da Murakkab Komponent Patternining Asosiy Tamoyillari
Murakkab Komponent Patternini samarali amalga oshirish uchun odatda ikkita asosiy tamoyil qo'llaniladi:
1. Yashirin Holatni Bo'lishish (Ko'pincha React Context bilan)
Murakkab komponentlar ortidagi sehr - bu ularning aniq prop uzatishsiz holatni bo'lishish va aloqa qilish qobiliyatidir. Zamonaviy React'da bunga erishishning eng keng tarqalgan va idiomatik usuli bu Context API orqali. React Context ma'lumotlarni komponentlar daraxti orqali har bir darajada qo'lda props uzatmasdan o'tkazish imkonini beradi.
Bu odatda quyidagicha ishlaydi:
- Ota-komponent (masalan,
<Accordion>) Context Provider yaratadi va umumiy holatni (masalan, hozirda faol element) va holatni o'zgartiruvchi funksiyalarni (masalan, elementni ochib-yopish funksiyasi) uning qiymatiga joylashtiradi. - Bola komponentlar (masalan,
<Accordion.Item>,<Accordion.Header>) ushbu kontekstniuseContexthooki yoki Context Consumer yordamida iste'mol qiladi. - Bu daraxtning qanchalik chuqurligida bo'lishidan qat'i nazar, har qanday ichki bola komponentga umumiy holat va funksiyalarga ota-komponentdan har bir oraliq komponent orqali aniq props uzatmasdan kirish imkonini beradi.
Context eng keng tarqalgan usul bo'lsa-da, boshqa texnikalar, masalan, to'g'ridan-to'g'ri prop uzatish (juda sayoz daraxtlar uchun) yoki Redux yoki Zustand kabi holatni boshqarish kutubxonalaridan foydalanish (murakkab komponentlar foydalanishi mumkin bo'lgan global holat uchun) ham mumkin, ammo murakkab komponent ichidagi to'g'ridan-to'g'ri o'zaro ta'sir uchun kamroq tarqalgan.
2. Ota-bola munosabati va Statik Xususiyatlar
Murakkab komponentlar odatda o'zlarining ichki komponentlarini asosiy ota-komponentning statik xususiyatlari sifatida belgilaydilar. Bu bog'liq komponentlarni guruhlashning aniq va intuitiv usulini ta'minlaydi va ularning munosabatlarini kodda darhol ko'rinadigan qiladi. Masalan, Accordion, AccordionItem, AccordionHeader, va AccordionContent'ni alohida import qilish o'rniga, siz ko'pincha faqat Accordion'ni import qilasiz va uning bolalariga Accordion.Item, Accordion.Header, va hokazo sifatida kirasiz.
// Buni o'rniga:
import Accordion from './Accordion';
import AccordionItem from './AccordionItem';
import AccordionHeader from './AccordionHeader';
import AccordionContent from './AccordionContent';
// Siz bu toza APIni olasiz:
import Accordion from './Accordion';
const MyComponent = () => (
<Accordion>
<Accordion.Item>
<Accordion.Header>1-bo'lim</Accordion.Header>
<Accordion.Content>1-bo'lim uchun kontent</Accordion.Content>
</Accordion.Item>
</Accordion>
);
Ushbu statik xususiyatni tayinlash komponent API'sini yanada yaxlit va topilishi oson qiladi.
Murakkab Komponentni qurish: Bosqichma-bosqich Akkordeon misoli
Keling, nazariyani amaliyotga tatbiq qilib, Murakkab Komponent Patternidan foydalangan holda to'liq funksional va moslashuvchan Akkordeon komponentini yaratamiz. Akkordeon - bu kontentni ochish yoki yopish uchun kengaytirilishi yoki yig'ilishi mumkin bo'lgan elementlar ro'yxatidan iborat keng tarqalgan UI elementi. Bu pattern uchun ajoyib nomzod, chunki har bir akkordeon elementi qaysi element hozirda ochiq ekanligini bilishi (umumiy holat) va o'zining holat o'zgarishlarini ota-komponentga qaytarishi kerak.
Biz odatiy, kamroq ideal yondashuvni bayon qilishdan boshlaymiz va keyin afzalliklarni ta'kidlash uchun uni murakkab komponentlar yordamida refaktor qilamiz.
Stsenariy: Oddiy Akkordeon
Biz bir nechta elementga ega bo'lishi mumkin bo'lgan Akkordeon yaratmoqchimiz va bir vaqtning o'zida faqat bitta element ochiq bo'lishi kerak (yagona ochiq rejim). Har bir elementda sarlavha va kontent maydoni bo'ladi.
Dastlabki yondashuv (Murakkab Komponentlarsiz - Prop uzatish)
Sodda yondashuv barcha holatni ota Accordion komponentida boshqarishni va har bir AccordionItemga qayta qo'ng'iroqlar va faol holatlarni uzatishni o'z ichiga olishi mumkin, u esa o'z navbatida ularni AccordionHeader va AccordionContentga uzatadi. Bu chuqur joylashtirilgan tuzilmalar uchun tezda noqulay bo'lib qoladi.
// Accordion.jsx (Kamroq Ideal)
import React, { useState } from 'react';
const Accordion = ({ children }) => {
const [activeIndex, setActiveIndex] = useState(null);
const toggleItem = (index) => {
setActiveIndex(prevIndex => (prevIndex === index ? null : index));
};
// Bu qism muammoli: biz har bir bola uchun props'larni qo'lda klonlashimiz va kiritishimiz kerak,
// bu moslashuvchanlikni cheklaydi va APIni kamroq toza qiladi.
return (
<div className="accordion">
{React.Children.map(children, (child, index) => {
if (React.isValidElement(child) && child.type.displayName === 'AccordionItem') {
return React.cloneElement(child, {
isActive: activeIndex === index,
onToggle: () => toggleItem(index),
});
}
return child;
})}
</div>
);
};
// AccordionItem.jsx
const AccordionItem = ({ isActive, onToggle, children }) => (
<div className="accordion-item">
{React.Children.map(children, child => {
if (React.isValidElement(child) && child.type.displayName === 'AccordionHeader') {
return React.cloneElement(child, { onClick: onToggle });
} else if (React.isValidElement(child) && child.type.displayName === 'AccordionContent') {
return React.cloneElement(child, { isActive });
}
return child;
})}
</div>
);
AccordionItem.displayName = 'AccordionItem';
// AccordionHeader.jsx
const AccordionHeader = ({ onClick, children }) => (
<div className="accordion-header" onClick={onClick} style={{ cursor: 'pointer' }}>
{children}
</div>
);
AccordionHeader.displayName = 'AccordionHeader';
// AccordionContent.jsx
const AccordionContent = ({ isActive, children }) => (
<div className="accordion-content" style={{ display: isActive ? 'block' : 'none' }}>
{children}
</div>
);
AccordionContent.displayName = 'AccordionContent';
// Foydalanish (App.jsx)
import Accordion, { AccordionItem, AccordionHeader, AccordionContent } from './Accordion'; // Ideal bo'lmagan import
const App = () => (
<div>
<h2>Prop uzatish Akkordeoni</h2>
<Accordion>
<AccordionItem>
<AccordionHeader>A bo'limi</AccordionHeader>
<AccordionContent>A bo'limi uchun kontent.</AccordionContent>
</AccordionItem>
<AccordionItem>
<AccordionHeader>B bo'limi</AccordionHeader>
<AccordionContent>B bo'limi uchun kontent.</AccordionContent>
</AccordionItem>
</Accordion>
</div>
);
Bu yondashuvning bir qancha kamchiliklari bor:
- Prop'larni qo'lda kiritish: Ota
Accordionchildrenorqali qo'lda iteratsiya qilishi vaReact.cloneElementyordamidaisActivevaonToggleprop'larini kiritishi kerak. Bu ota-komponentni uning bevosita bolalari kutadigan aniq prop nomlari va turlariga qattiq bog'laydi. - Chuqur prop uzatish:
isActiveprop hali hamAccordionItemdanAccordionContentga uzatilishi kerak. Bu yerda juda chuqur bo'lmasa-da, yanada murakkab komponentni tasavvur qiling. - Kamroq deklarativ foydalanish: JSX biroz toza ko'rinsa-da, ichki prop boshqaruvi komponentni kamroq moslashuvchan va ota-komponentni o'zgartirmasdan kengaytirishni qiyinlashtiradi.
- Mo'rt tur tekshiruvi: Tur tekshiruvi uchun
displayNamega tayanish mo'rt.
Murakkab Komponent yondashuvi (Context API yordamida)
Endi, keling, buni React Context yordamida to'g'ri Murakkab Komponentga aylantiramiz. Biz faol elementning indeksini va uni ochib-yopish funksiyasini ta'minlaydigan umumiy kontekst yaratamiz.
1. Kontekstni yaratish
Birinchidan, biz kontekstni aniqlaymiz. Bu bizning Akkordeonimiz uchun umumiy holat va mantiqni ushlab turadi.
// AccordionContext.js
import { createContext, useContext } from 'react';
// Akkordeonning umumiy holati uchun kontekst yaratish
// Provider ichida ishlatilmasa, yaxshiroq xato bilan ishlash uchun standart undefined qiymatini taqdim etamiz
const AccordionContext = createContext(undefined);
// Kontekstni iste'mol qilish uchun maxsus hook, noto'g'ri ishlatilganda yordamchi xato bilan ta'minlaydi
export const useAccordionContext = () => {
const context = useContext(AccordionContext);
if (context === undefined) {
throw new Error('useAccordionContext faqat Accordion komponenti ichida ishlatilishi kerak');
}
return context;
};
export default AccordionContext;
2. Ota-komponent: Accordion
Accordion komponenti faol holatni boshqaradi va uni o'z bolalariga AccordionContext.Provider orqali taqdim etadi. U shuningdek, toza API uchun o'zining ichki komponentlarini statik xususiyatlar sifatida belgilaydi.
// Accordion.jsx
import React, { useState, Children, cloneElement, isValidElement } from 'react';
import AccordionContext from './AccordionContext';
// Biz bu ichki komponentlarni keyinroq o'z fayllarida aniqlaymiz,
// lekin bu yerda ularning Accordion ota-komponentiga qanday biriktirilishini ko'rsatamiz.
import AccordionItem from './AccordionItem';
import AccordionHeader from './AccordionHeader';
import AccordionContent from './AccordionContent';
const Accordion = ({ children, defaultOpenIndex = null, allowMultiple = false }) => {
const [openIndexes, setOpenIndexes] = useState(() => {
if (allowMultiple) return defaultOpenIndex !== null ? [defaultOpenIndex] : [];
return defaultOpenIndex !== null ? [defaultOpenIndex] : [];
});
const toggleItem = (index) => {
setOpenIndexes(prevIndexes => {
if (allowMultiple) {
if (prevIndexes.includes(index)) {
return prevIndexes.filter(i => i !== index);
} else {
return [...prevIndexes, index];
}
} else {
// Yagona ochiq rejim
return prevIndexes.includes(index) ? [] : [index];
}
});
};
// Har bir Accordion.Item o'zining yashirin unikal indeksini olishini ta'minlash uchun
const itemsWithProps = Children.map(children, (child, index) => {
if (!isValidElement(child) || child.type !== AccordionItem) {
console.warn("Akkordeon bolalari faqat Accordion.Item komponentlari bo'lishi kerak.");
return child;
}
// Biz 'index' propini kiritish uchun elementni klonlaymiz. Bu ko'pincha
// ota-komponentning o'zining bevosita bolalariga identifikatorni uzatishi uchun zarur.
return cloneElement(child, { index });
});
const contextValue = {
openIndexes,
toggleItem,
allowMultiple // Agar bolalar rejimni bilishi kerak bo'lsa, buni uzatamiz
};
return (
<AccordionContext.Provider value={contextValue}>
<div className="accordion">
{itemsWithProps}
</div>
</AccordionContext.Provider>
);
};
// Ichki komponentlarni statik xususiyatlar sifatida biriktirish
Accordion.Item = AccordionItem;
Accordion.Header = AccordionHeader;
Accordion.Content = AccordionContent;
export default Accordion;
3. Bola komponent: AccordionItem
AccordionItem vositachi sifatida ishlaydi. U o'zining index propini ota Accordiondan oladi (cloneElement orqali kiritilgan) va keyin o'z bolalari, AccordionHeader va AccordionContentga o'z kontekstini taqdim etadi (yoki shunchaki ota-kontekstdan foydalanadi). Oddiylik uchun va har bir element uchun yangi kontekst yaratmaslik uchun, biz bu yerda to'g'ridan-to'g'ri AccordionContextdan foydalanamiz.
// AccordionItem.jsx
import React, { Children, cloneElement, isValidElement } from 'react';
import { useAccordionContext } from './AccordionContext';
const AccordionItem = ({ children, index }) => {
const { openIndexes, toggleItem } = useAccordionContext();
const isActive = openIndexes.includes(index);
const handleToggle = () => toggleItem(index);
// Biz isActive va handleToggle'ni bolalarimizga uzatishimiz mumkin
// yoki agar biz element uchun yangi kontekst o'rnatsak, ular to'g'ridan-to'g'ri kontekstdan iste'mol qilishlari mumkin.
// Bu misol uchun, props orqali bolalarga uzatish oddiy va samarali.
const childrenWithProps = Children.map(children, child => {
if (!isValidElement(child)) return child;
if (child.type.name === 'AccordionHeader') {
return cloneElement(child, { onClick: handleToggle, isActive });
} else if (child.type.name === 'AccordionContent') {
return cloneElement(child, { isActive });
}
return child;
});
return <div className="accordion-item">{childrenWithProps}</div>;
};
export default AccordionItem;
4. Nevara komponentlar: AccordionHeader va AccordionContent
Ushbu komponentlar o'zlarining ota-komponentlari, AccordionItem tomonidan taqdim etilgan prop'larni (yoki to'g'ridan-to'g'ri kontekstni, agar biz shunday sozlagan bo'lsak) iste'mol qiladi va o'zlarining maxsus UI'larini render qiladi.
// AccordionHeader.jsx
import React from 'react';
const AccordionHeader = ({ onClick, isActive, children }) => (
<div
className={`accordion-header ${isActive ? 'active' : ''}`}
onClick={onClick}
style={{
cursor: 'pointer',
padding: '10px',
backgroundColor: '#f0f0f0',
borderBottom: '1px solid #ddd',
fontWeight: 'bold',
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center'
}}
role="button"
aria-expanded={isActive}
tabIndex="0"
>
{children}
<span>{isActive ? '▼' : '►'}</span> {/* Oddiy strelka ko'rsatkichi */}
</div>
);
export default AccordionHeader;
// AccordionContent.jsx
import React from 'react';
const AccordionContent = ({ isActive, children }) => (
<div
className={`accordion-content ${isActive ? 'active' : ''}`}
style={{
display: isActive ? 'block' : 'none',
padding: '15px',
borderBottom: '1px solid #eee',
backgroundColor: '#fafafa'
}}
aria-hidden={!isActive}
>
{children}
</div>
);
export default AccordionContent;
5. Murakkab Akkordeondan foydalanish
Endi, yangi Murakkab Akkordeonimizdan foydalanish qanchalik toza va intuitiv ekanligiga qarang:
// App.jsx
import React from 'react';
import Accordion from './Accordion'; // Faqat bitta import kerak!
const App = () => (
<div style={{ maxWidth: '600px', margin: '20px auto', fontFamily: 'Arial, sans-serif' }}>
<h1>Murakkab Komponentli Akkordeon</h1>
<h2>Yagona ochiq Akkordeon</h2>
<Accordion defaultOpenIndex={0}>
<Accordion.Item>
<Accordion.Header>React Kompozitsiyasi nima?</Accordion.Header>
<Accordion.Content>
<p>React kompozitsiyasi - bu murakkab UI'larni merosga tayanmasdan, kichik, mustaqil va qayta ishlatiladigan komponentlarni birlashtirish orqali qurishga undaydigan dizayn patternidir. U moslashuvchanlik va qo'llab-quvvatlash qulayligini oshiradi.</p>
</Accordion.Content>
</Accordion.Item>
<Accordion.Item>
<Accordion.Header>Nima uchun Murakkab Komponentlardan foydalanish kerak?</Accordion.Header>
<Accordion.Content>
<p>Murakkab komponentlar yashirin holatni bo'lishadigan murakkab UI vidjetlari uchun deklarativ API taqdim etadi. Ular kodni tartibga solishni yaxshilaydi, prop uzatishni kamaytiradi va ayniqsa katta, taqsimlangan jamoalar uchun qayta foydalanish va tushunishni osonlashtiradi.</p>
<ul>
<li>Intuitiv foydalanish</li>
<li>Inkapsulyatsiya qilingan mantiq</li>
<li>Yaxshilangan moslashuvchanlik</li>
</ul>
</Accordion.Content>
</Accordion.Item>
<Accordion.Item>
<Accordion.Header>React Patternlarining Global qabul qilinishi</Accordion.Header>
<Accordion.Content>
<p>Murakkab Komponentlar kabi patternlar React ishlab chiqish uchun global miqyosda tan olingan eng yaxshi amaliyotlardir. Ular izchil kodlash uslublarini shakllantiradi va UI dizayni uchun universal til taqdim etish orqali turli mamlakatlar va madaniyatlar bo'ylab hamkorlikni ancha silliq qiladi.</p>
<em>Ularning butun dunyo bo'ylab keng ko'lamli korporativ ilovalarga ta'sirini ko'rib chiqing.</em>
</Accordion.Content>
</Accordion.Item>
</Accordion>
<h2 style={{ marginTop: '40px' }}>Ko'p ochiq Akkordeon misoli</h2>
<Accordion allowMultiple={true} defaultOpenIndex={0}>
<Accordion.Item>
<Accordion.Header>Birinchi ko'p ochiq bo'lim</Accordion.Header>
<Accordion.Content>
<p>Bu yerda bir vaqtning o'zida bir nechta bo'limni ochishingiz mumkin.</p>
</Accordion.Content>
</Accordion.Item>
<Accordion.Item>
<Accordion.Header>Ikkinchi ko'p ochiq bo'lim</Accordion.Header>
<Accordion.Content>
<p>Bu ko'proq moslashuvchan kontent ko'rsatishga imkon beradi, bu FAQ yoki hujjatlar uchun foydalidir.</p>
</Accordion.Content>
</Accordion.Item>
<Accordion.Item>
<Accordion.Header>Uchinchi ko'p ochiq bo'lim</Accordion.Header>
<Accordion.Content>
<p>Xatti-harakatni ko'rish uchun turli sarlavhalarni bosib tajriba qiling.</p>
</Accordion.Content>
</Accordion.Item>
</Accordion>
</div>
);
export default App;
Ushbu qayta ko'rib chiqilgan Akkordeon tuzilmasi Murakkab Komponent Patternini chiroyli namoyish etadi. Accordion komponenti umumiy holatni (qaysi element ochiq ekanligini) boshqarish uchun mas'uldir va u o'z bolalariga kerakli kontekstni taqdim etadi. Accordion.Item, Accordion.Header va Accordion.Content komponentlari oddiy, aniq vazifaga yo'naltirilgan va kerakli holatni to'g'ridan-to'g'ri kontekstdan iste'mol qiladi. Komponentdan foydalanuvchi aniq, deklarativ va yuqori darajada moslashuvchan APIga ega bo'ladi.
Akkordeon misoli uchun muhim mulohazalar:
-
Indekslash uchun `cloneElement`: Biz ota
Accordionda har birAccordion.Itemga unikalindexpropini kiritish uchunReact.cloneElementdan foydalanamiz. BuAccordionItemga umumiy kontekst bilan o'zaro ta'sirda o'zini tanitish imkonini beradi (masalan, ota-komponentga *o'zining* aniq indeksini ochib-yopishni aytish). -
Holatni bo'lishish uchun kontekst:
AccordionContextasos bo'lib, kerakli har qanday avlodgaopenIndexesvatoggleItemni taqdim etadi va prop uzatishni bartaraf etadi. -
Foydalanish imkoniyati (A11y):
AccordionHeaderdagirole="button",aria-expandedvatabIndex="0"hamdaAccordionContentdagiaria-hiddenkiritilganiga e'tibor bering. Ushbu atributlar sizning komponentlaringizni hamma, shu jumladan yordamchi texnologiyalarga tayanadigan odamlar tomonidan ishlatilishi uchun juda muhimdir. Global foydalanuvchi bazasi uchun qayta ishlatiladigan UI komponentlarini yaratishda har doim foydalanish imkoniyatini hisobga oling. -
Moslashuvchanlik: Foydalanuvchi
Accordion.HeadervaAccordion.Contentichida istalgan kontentni o'rashi mumkin, bu esa komponentni turli xil kontent turlari va xalqaro matn talablariga yuqori darajada moslashuvchan qiladi. -
Ko'p ochiq rejim:
allowMultiplepropini qo'shish orqali biz ichki mantiqni tashqi APIni o'zgartirmasdan yoki bolalarda prop o'zgarishlarini talab qilmasdan qanchalik oson kengaytirish mumkinligini namoyish etamiz.
Kompozitsiyadagi Variatsiyalar va Ilg'or Texnikalar
Akkordeon misoli Murakkab Komponentlarning asosini ko'rsatsa-da, murakkab UI kutubxonalarini yoki global auditoriya uchun mustahkam komponentlarni yaratishda ko'pincha qo'llaniladigan bir nechta ilg'or texnikalar va mulohazalar mavjud.
1. `React.Children` yordamchi dasturlarining kuchi
React React.Children ichida children prop bilan ishlashda, ayniqsa to'g'ridan-to'g'ri bolalarni tekshirish yoki o'zgartirish kerak bo'lgan murakkab komponentlarda juda foydali bo'lgan bir qator yordamchi funksiyalarni taqdim etadi.
-
`React.Children.map(children, fn)`: Har bir to'g'ridan-to'g'ri bolani aylanib chiqadi va unga funksiyani qo'llaydi. Bu bizning
AccordionvaAccordionItemkomponentlarimizdaindexyokiisActivekabi prop'larni kiritish uchun ishlatganimizdir. -
`React.Children.forEach(children, fn)`:
mapga o'xshaydi, lekin yangi massiv qaytarmaydi. Agar siz faqat har bir bolada yon ta'sirni bajarishingiz kerak bo'lsa foydalidir. -
`React.Children.toArray(children)`: Bolalarni massivga aylantiradi, agar siz ularga massiv usullarini (masalan,
filteryokisort) qo'llashingiz kerak bo'lsa foydalidir. - `React.Children.only(children)`: Bolalarning faqat bitta bolaga ega ekanligini (React elementi) tekshiradi va uni qaytaradi. Aks holda xato chiqaradi. Qat'iy ravishda bitta bola kutadigan komponentlar uchun foydalidir.
- `React.Children.count(children)`: To'plamdagi bolalar sonini qaytaradi.
Ushbu yordamchi dasturlardan, ayniqsa map va cloneElementdan foydalanish, ota murakkab komponentga o'z bolalarini kerakli prop'lar yoki kontekst bilan dinamik ravishda to'ldirishga imkon beradi, bu esa tashqi APIni soddalashtiradi va ichki nazoratni saqlab qoladi.
2. Boshqa patternlar bilan birlashtirish (Render Props, Hooks)
Murakkab Komponentlar eksklyuziv emas; ular yanada moslashuvchan va kuchli yechimlar yaratish uchun boshqa kuchli React patternlari bilan birlashtirilishi mumkin:
-
Render Props: Render prop - bu qiymati React elementini qaytaradigan funksiya bo'lgan prop. Murakkab Komponentlar bolalarning *qanday* render qilinishi va ichki o'zaro ta'sirini boshqarsa, render prop'lar komponentning bir qismi ichidagi *kontent* yoki *maxsus mantiq* ustidan tashqi nazoratni amalga oshirishga imkon beradi. Masalan,
<Accordion.Header renderToggle={({ isActive }) => <button>{isActive ? 'Yopish' : 'Ochish'}</button>}>asosiy murakkab tuzilmani o'zgartirmasdan yuqori darajada moslashtirilgan o'zgartirish tugmalariga imkon berishi mumkin. -
Maxsus Hooklar: Maxsus hooklar qayta ishlatiladigan holatli mantiqni ajratib olish uchun ajoyib. Siz
Accordionning holatni boshqarish mantig'ini maxsus hookga (masalan,useAccordionState) ajratib olishingiz va keyin bu hookniAccordionkomponentingiz ichida ishlatishingiz mumkin. Bu kodni yanada modullashtiradi va asosiy mantiqni osongina sinab ko'rish va turli komponentlar yoki hatto turli murakkab komponentlar implementatsiyalari bo'ylab qayta ishlatish imkonini beradi.
3. TypeScript Mulohazalari
Global rivojlanish jamoalari uchun, ayniqsa yirik korxonalarda, TypeScript kod sifatini saqlash, mustahkam avtomatik to'ldirishni ta'minlash va xatolarni erta aniqlash uchun bebaho hisoblanadi. Murakkab Komponentlar bilan ishlaganda, siz to'g'ri tipizatsiyani ta'minlashni xohlaysiz:
- Kontekstni tiplash: Iste'molchilarning umumiy holat va funksiyalarga to'g'ri kirishini ta'minlash uchun kontekst qiymatingiz uchun interfeyslarni aniqlang.
- Prop'larni tiplash: To'g'ri foydalanishni ta'minlash uchun har bir komponent (ota va bolalar) uchun prop'larni aniq belgilang.
-
Bolalarni tiplash: Bolalarni tiplash qiyin bo'lishi mumkin.
React.ReactNodekeng tarqalgan bo'lsa-da, qat'iy murakkab komponentlar uchun sizReact.ReactElement<typeof ChildComponent> | React.ReactElement<typeof ChildComponent>[]dan foydalanishingiz mumkin, ammo bu ba'zan haddan tashqari cheklovchi bo'lishi mumkin. Keng tarqalgan pattern - bu bolalarni ish vaqtidaisValidElementvachild.type === YourComponent(yoki komponent nomlangan funksiya bo'lsa `child.type.name` yoki `displayName`) kabi tekshiruvlar yordamida tasdiqlashdir.
Mustahkam TypeScript ta'riflari sizning komponentlaringiz uchun universal shartnoma taqdim etadi, bu esa turli rivojlanish jamoalari o'rtasidagi noto'g'ri aloqa va integratsiya muammolarini sezilarli darajada kamaytiradi.
Murakkab Komponent Patternlarini qachon ishlatish kerak
Kuchli bo'lishiga qaramay, Murakkab Komponent Patterni hamma uchun mos keladigan yechim emas. Ushbu patternni quyidagi stsenariylarda qo'llashni ko'rib chiqing:
- Murakkab UI Vidjetlari: Ichki munosabat va yashirin holatga ega bo'lgan bir nechta chambarchas bog'liq qismlardan tashkil topgan UI komponentini yaratishda. Misollar: Tablar, Select/Dropdown, Sana tanlagichlar, Karusellar, Daraxt ko'rinishlari yoki ko'p bosqichli formalar.
- Deklarativ API istagi: Komponentingiz foydalanuvchilari uchun yuqori darajada deklarativ va intuitiv API taqdim etishni xohlaganingizda. Maqsad, JSXning UI tuzilishi va niyatini aniq ifodalashi, xuddi mahalliy HTML elementlari kabi.
- Ichki holatni boshqarish: Komponentning ichki holatini bir nechta bog'liq ichki komponentlar bo'ylab, barcha ichki mantiqni to'g'ridan-to'g'ri prop'lar orqali oshkor qilmasdan boshqarish kerak bo'lganda. Ota-komponent holatni boshqaradi, bolalar esa uni yashirincha iste'mol qiladi.
- Butunining qayta foydalanish imkoniyatini yaxshilash: Butun kompozit tuzilma sizning ilovangizda yoki kattaroq komponent kutubxonasi ichida tez-tez qayta ishlatilganda. Ushbu pattern murakkab UI qaerda joylashtirilgan bo'lsa ham, uning ishlashida izchillikni ta'minlaydi.
- Kengaytirilish va Qo'llab-quvvatlash: Bir nechta dasturchilar yoki global miqyosda taqsimlangan jamoalar tomonidan qo'llab-quvvatlanadigan kattaroq ilovalarda yoki komponent kutubxonalarida ushbu pattern modullikni, vazifalarni aniq ajratishni rag'batlantiradi va o'zaro bog'liq UI qismlarini boshqarish murakkabligini kamaytiradi.
- Render Props yoki Prop uzatish noqulay bo'lganda: Agar siz o'zingizni bir xil prop'larni (ayniqsa, qayta qo'ng'iroqlar yoki holat qiymatlarini) bir nechta oraliq komponentlar orqali bir necha daraja pastga uzatayotganingizni topsangiz, Context bilan Murakkab Komponent tozaroq alternativa bo'lishi mumkin.
Potentsial kamchiliklar va mulohazalar
Murakkab Komponent Patterni sezilarli afzalliklarni taqdim etsa-da, potentsial qiyinchiliklardan xabardor bo'lish muhim:
- Oddiylik uchun ortiqcha muhandislik: Murakkab umumiy holatga yoki chuqur bog'langan bolalarga ega bo'lmagan oddiy komponentlar uchun ushbu patternni ishlatmang. Faqat aniq prop'larga asoslanib kontentni render qiladigan komponentlar uchun asosiy kompozitsiya yetarli va kamroq murakkab.
-
Kontekstni noto'g'ri ishlatish / "Kontekst Jahannami": Har bir umumiy holat uchun Context APIga haddan tashqari tayanish kamroq shaffof ma'lumotlar oqimiga olib kelishi mumkin, bu esa nosozliklarni tuzatishni qiyinlashtiradi. Agar holat tez-tez o'zgarsa yoki ko'plab uzoq komponentlarga ta'sir qilsa, keraksiz qayta renderlarning oldini olish uchun iste'molchilarning memoizatsiya qilinganligiga ishonch hosil qiling (masalan,
React.memoyokiuseMemoyordamida). - Nosozliklarni tuzatish murakkabligi: Context yordamida yuqori darajada ichki joylashtirilgan murakkab komponentlarda holat oqimini kuzatish ba'zan aniq prop uzatish bilan solishtirganda qiyinroq bo'lishi mumkin, ayniqsa pattern bilan tanish bo'lmagan dasturchilar uchun. Yaxshi nomlash konventsiyalari, aniq kontekst qiymatlari va React Developer Tools'dan samarali foydalanish juda muhim.
-
Tuzilmani majburlash: Pattern komponentlarning to'g'ri joylashtirilishiga tayanadi. Agar komponentingizdan foydalanadigan dasturchi tasodifan
<Accordion.Header>ni<Accordion.Item>tashqarisiga joylashtirsa, u buzilishi yoki kutilmagan tarzda ishlashi mumkin. Mustahkam xatolarni qayta ishlash (masalan, bizning misolimizdagiuseAccordionContexttomonidan chiqarilgan xato) va aniq hujjatlar juda muhim. - Ishlashga ta'siri: Context o'zi samarali bo'lsa-da, agar Context Provider tomonidan taqdim etilgan qiymat tez-tez o'zgarsa, ushbu kontekstning barcha iste'molchilari qayta renderlanadi, bu esa potentsial ravishda ishlashda muammolarga olib kelishi mumkin. Kontekst qiymatlarini ehtiyotkorlik bilan tuzish va memoizatsiyadan foydalanish buni yumshatishi mumkin.
Global Jamoalar va Ilovalar uchun Eng Yaxshi Amaliyotlar
Global rivojlanish kontekstida Murakkab Komponent Patternlarini amalga oshirish va ulardan foydalanishda, uzluksiz hamkorlik, mustahkam ilovalar va inklyuziv foydalanuvchi tajribasini ta'minlash uchun ushbu eng yaxshi amaliyotlarni ko'rib chiqing:
- Keng qamrovli va aniq hujjatlar: Bu har qanday qayta ishlatiladigan komponent uchun, ayniqsa yashirin holatni bo'lishishni o'z ichiga olgan patternlar uchun juda muhim. Komponentning API'sini, kutilayotgan bola komponentlarini, mavjud prop'larni va umumiy foydalanish patternlarini hujjatlashtiring. Aniq, qisqa Ingliz tilidan foydalaning va turli stsenariylarda foydalanish misollarini taqdim etishni ko'rib chiqing. Taqsimlangan jamoalar uchun yaxshi qo'llab-quvvatlanadigan storybook yoki komponent kutubxonasi hujjatlari portali bebaho hisoblanadi.
-
Izchil Nomlash Konventsiyalari: Komponentlaringiz va ularning ichki komponentlari uchun izchil va mantiqiy nomlash konventsiyalariga rioya qiling (masalan,
Accordion.Item,Accordion.Header). Ushbu universal lug'at turli lingvistik kelib chiqishga ega bo'lgan dasturchilarga har bir qismning maqsadi va munosabatini tezda tushunishga yordam beradi. -
Mustahkam Foydalanish Imkoniyati (A11y): Bizning misolimizda ko'rsatilganidek, foydalanish imkoniyatini to'g'ridan-to'g'ri murakkab komponentlaringizga kiriting. Tegishli ARIA rollari, holatlari va xususiyatlaridan foydalaning (masalan,
role,aria-expanded,tabIndex). Bu sizning UI'ingiz nogironligi bo'lgan shaxslar tomonidan ishlatilishi mumkinligini ta'minlaydi, bu keng qabul qilinishga intilayotgan har qanday global mahsulot uchun muhim mulohaza. -
Xalqarolashtirish (i18n) Tayyorgarligi: Komponentlaringizni osongina xalqarolashtiriladigan qilib loyihalashtiring. Matnni to'g'ridan-to'g'ri komponentlar ichida qattiq kodlashdan saqlaning. Buning o'rniga, matnni prop'lar sifatida uzating yoki tarjima qilingan satrlarni olish uchun maxsus xalqarolashtirish kutubxonasidan foydalaning. Masalan,
Accordion.HeadervaAccordion.Contentichidagi kontent turli tillarni va har xil matn uzunliklarini chiroyli qo'llab-quvvatlashi kerak. - Puxta Testlash Strategiyalari: Alohida ichki komponentlar uchun birlik testlari va butun murakkab komponent uchun integratsiya testlarini o'z ichiga olgan mustahkam testlash strategiyasini amalga oshiring. Turli o'zaro ta'sir patternlarini, chekka holatlarni sinab ko'ring va foydalanish imkoniyati atributlarining to'g'ri qo'llanilishini ta'minlang. Bu global miqyosda ishga tushirayotgan jamoalarga ishonch bag'ishlaydi, chunki komponent turli muhitlarda izchil ishlaydi.
- Lokalizatsiyalar bo'yicha Vizual Izchillik: Komponentingizning uslubi va joylashuvi turli matn yo'nalishlariga (chapdan o'ngga, o'ngdan chapga) va tarjima bilan birga keladigan har xil matn uzunliklariga mos keladigan darajada moslashuvchan ekanligiga ishonch hosil qiling. CSS-in-JS yechimlari yoki yaxshi tuzilgan CSS global miqyosda izchil estetika saqlashga yordam beradi.
- Xatolarni Qayta Ishlash va Zaxira Yechimlar: Agar komponentlar noto'g'ri ishlatilsa (masalan, bola komponent o'zining ota-komponenti tashqarisida render qilinsa), aniq xato xabarlarini amalga oshiring yoki chiroyli zaxira yechimlar taqdim eting. Bu dasturchilarga joylashuvi yoki tajriba darajasidan qat'i nazar, muammolarni tezda tashxislash va tuzatishga yordam beradi.
Xulosa: Deklarativ UI Ishlab Chiqishni Kuchaytirish
React Murakkab Komponent Patterni deklarativ, moslashuvchan va qo'llab-quvvatlanadigan foydalanuvchi interfeyslarini yaratish uchun murakkab, ammo juda samarali strategiyadir. Kompozitsiya kuchi va React Context APIdan foydalangan holda, dasturchilar o'z iste'molchilariga biz har kuni foydalanadigan mahalliy HTML elementlariga o'xshash intuitiv API taklif qiladigan murakkab UI vidjetlarini yaratishi mumkin.
Ushbu pattern yuqori darajadagi kodni tashkil etishni rag'batlantiradi, prop uzatish yukini kamaytiradi va komponentlaringizning qayta foydalanish va sinovdan o'tkazish imkoniyatlarini sezilarli darajada oshiradi. Global rivojlanish jamoalari uchun bunday aniq belgilangan patternlarni qabul qilish shunchaki estetik tanlov emas; bu izchillikni rag'batlantiradigan, hamkorlikdagi ishqalanishni kamaytiradigan va natijada yanada mustahkam va universal foydalanish imkoniyatiga ega ilovalarga olib keladigan strategik zaruratdir.
React ishlab chiqishdagi sayohatingizni davom ettirar ekansiz, Murakkab Komponent Patternini asboblar to'plamingizga qimmatli qo'shimcha sifatida qabul qiling. Mavjud ilovalaringizda yanada yaxlit va deklarativ APIdan foyda ko'rishi mumkin bo'lgan UI elementlarini aniqlashdan boshlang. Umumiy holatni kontekstga ajratib olish va ota-bola komponentlaringiz o'rtasida aniq munosabatlarni belgilash bilan tajriba qiling. Ushbu patternni tushunish va amalga oshirishga qilingan dastlabki sarmoya, shubhasiz, React kod bazangizning aniqligi, kengaytirilishi va qo'llab-quvvatlanishida uzoq muddatli sezilarli foyda keltiradi.
Komponent kompozitsiyasini o'zlashtirish orqali siz nafaqat yaxshiroq kod yozasiz, balki hamma joyda, hamma uchun yanada tushunarli va hamkorlikka asoslangan rivojlanish ekotizimini yaratishga hissa qo'shasiz.