Reduxда сўров статусини қўллаш
Олдинги дарсларда биз қўшимча
редьюсерлар ёрдамида иловамизга нима қилиш кераклигини
тасвирладик, агар fetchProducts сўров жараёнида
экшенлар pending, fulfilled ва
rejected ни юборса. Энди биз
фойдаланувчига маълумотлар юкланмоқда бўлган
боскични кўрсатишимиз мумкин.
Келинг, маҳсулотлар билан иловамизни ochамиз, унда ProductsList.jsx
файлини ochамиз.
Биринчи бўлиб, биз маҳсулот карточкаси учун алохида
компонент яратамиз ProductCard.
Буни импорт сатрларидан кейин darhol
ProductsList функсияси олдида қиламиз. Пропс сифатида
уңга product ни узатамиз:
const ProductCard = ({ product }) => {
return ()
}
Энди бўш текис қавсларга return
dispProducts дан маҳсулот маълумотларини кўрсатиш учун
барча кодни кўчирамиз:
const ProductCard = ({ product }) => {
return (
<div key={product.id} className="product-excerpt">
<h3>{product.name}</h3>
<SellerOfProd sellerId={product.seller} />
<p>{product.desc.substring(0, 100)}</p>
<UserReactions product={product} />
<Link to={`/products/${product.id}`} className="link-btn">
view
</Link>
</div>
)
}
Ва ProductsList да қолган сатрни
олиб ташлаймиз. У энди бизга керак эмас:
const dispProducts = products.map((product) => ())
Энди ProductsList функсияси коди бошланишида
янги ўзгарuvчилар, error ва
content ни киритамиз. Биринчиси хato учун бўлади,
иккинчисига биз сўров статусига қараб турли
контентни ёзамиз.
Буни const dataFetch = useRef(false) олдида қиламиз:
const error = useSelector((state) => state.products.error)
let content
Энди ProductsList компонентининг
return буйруги олдида шартлар билан код блокини
ёзамиз, унда content га статусга боғлиқ холда
турли контент киритилади. Биринчи бўлиб биз
'in progress' статусини тасвирлаймиз - сўровимиз
юборилган пайтида. Бунда биз фойдаланувчига
маълумотлар юкланмоқда деб хабар берамиз:
if (productStatus === 'in progress') {
content = <p>Products list loading ...</p>
}
Агар юклаш муваффақиятли амалга ошса (биз буни
'success' деб белгилаганмиз), у ҳолда биз
олинган маҳсулотлар рўйхатини кўрсатишимиз керак. Уни
map орқали ProductCard компоненти ёрдамида кўрсатамиз,
уңга пропс сифатида product ни узатамиз:
if (productStatus === 'in progress') {
content = <p>Products list loading ...</p>
} else if (productStatus === 'success') {
content = products.map((product) => (
<ProductCard key={product.id} product={product} />
))
}
Ва бизда мавжуд бўлган охирги статус -
бу 'fail'. Уни ҳам қўшамиз. Бунда биз
error ўзгарuvчисини ишлатамиз, унга биз юқорида стейтдан
хatони ёзган эдик:
if (productStatus === 'in progress') {
content = <p>Products list loading ...</p>
} else if (productStatus === 'success') {
content = products.map((product) => (
<ProductCard key={product.id} product={product} />
))
} else if (productStatus === 'fail') {
content = <div>{error}</div>
}
Ва охирги қадам сифатида биз return учун
эски {dispProducts} ни {content} га алмаштирамиз.
Иловамизни ишга туширамиз, менюда
'Products' ни босамиз. Ҳаммаси ишлайди. Кўрамизки,
тахминан 2 сония (серверда ўрнатганимиздек)
маҳсулот қўшиш форми остида
'Products list loading ...' ёзиви осилиб турибди,
сўнгра маҳсулотлар рўйхати пайдо бўлади.
Ўқувчилар билан иловангизни ochинг.
Унда StudentsList.jsx файлини ochинг.
Унда янги компонент яратинг
StudentCard. Унга dispStudents дан кодни кўчиринг, дарсда кўрсатилганидек.
StudentsList функсиясида
error ва content ўзгарuvчиларини киритинг.
content ўзгарuvчисига сўров статусига қараб
контентни тенгланг.
Қайтариладиган версткада эски dispStudents ни content га алмаштиришни унутмангиз.