Junior
React'da komponentlarning holatini qanday to'g'ri o'zgartirish mumkin?
sobes.tech AI
AIdan javob
Reactda holat o'zgarishi setState metodi yoki funksional komponentlar uchun useState hook yordamida amalga oshiriladi.
Sinf komponentlari:
// Reactni import qilamiz
import React, { Component } from 'react';
// Sinf komponentini yaratamiz
class MyComponent extends Component {
// Holatni boshlaymiz
constructor(props) {
super(props);
this.state = {
count: 0
};
}
// Holatni o'zgartiruvchi metod
incrementCount = () => {
// setState dan foydalanamiz
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<p>Hisoblagich: {this.state.count}</p>
<button onClick={this.incrementCount}>O'stirish</button>
</div>
);
}
}
// Komponentni eksport qilamiz
export default MyComponent;
setStateasinxron.setStateyangi holatni mavjud holat bilan birlashtiradi (shallow merge).setStatefunksiyani qabul qilishi mumkin, u avvalgisiga asoslangan yangi holatni qaytaradi:
// Funksiya yordamida holatni o'zgartirish
incrementCountFunction = () => {
this.setState((prevState) => ({
count: prevState.count + 1
}));
};
Funktsional komponentlar (useState bilan):
// React va useState ni import qilamiz
import React, { useState } from 'react';
// Funktsional komponent yaratamiz
function MyFunctionComponent() {
// useState yordamida holatni boshlaymiz
const [count, setCount] = useState(0); // [hozirgi holat, yangilash funksiyasi]
// Holatni o'zgartiruvchi funksiya
const incrementCount = () => {
// Yangilash funksiyasidan foydalanamiz
setCount(count + 1);
};
return (
<div>
<p>Hisoblagich: {count}</p>
<button onClick={incrementCount}>O'stirish</button>
</div>
);
}
// Komponentni eksport qilamiz
export default MyFunctionComponent;
useStatehozirgi holat va uni yangilash uchun funksiya bilan ikkita elementli massivni qaytaradi.useStatetomonidan qaytarilgan yangilash funksiyasi hozirgi holatni o'zgartirmaydi, balki o'rnini bosadi.- Agar yangi holat avvalgisiga bog'liq bo'lsa, funksiyani uzatish mumkin:
// Holatni o'zgartiruvchi funksiya
const incrementCountFunction = () => {
setCount(prevCount => prevCount + 1);
};
Holatni o'zgartirishda muhim nuqtalar:
- Holatni to'g'ridan-to'g'ri o'zgartirmang: Hech qachon
statexususiyatiga yangi qiymat tayin qilmang (this.state.count = 5yokicount = 5). React bu o'zgarishni aniqlamaydi va komponent qayta render qilinmaydi. - Obyektlar va massivlarni o'zgartirish: Holatda obyekt yoki massivni o'zgartirayotganda, har doim yangi nusxalarini yarating. React obyekt/massivga bo'lgan havolalarni solishtiradi, va agar havola o'zgarmasa, React ma'lumotlar o'zgarmagan deb hisoblaydi va qayta render qilmaydi.
// Sinf komponentida obyektni o'zgartirish
this.setState(prevState => ({
user: {
...prevState.user, // Eski xususiyatlarni nusxalash
name: 'Yangi nom' // Kerakli xususiyatni yangilash
}
}));
// Funktsional komponentda massivni o'zgartirish
setItems(prevItems => [...prevItems, 'Yangi element']); // Yangi element qo'shish
setStatening asinxronligi: Agar holat yangilanganidan va komponent qayta render qilingandan so'ng biror amal bajarishni istasangiz,setStatening ikkinchi argumenti (callback funktsiya) yokiuseEffecthookidan foydalaning.
// setState'da callback
this.setState({ count: this.state.count + 1 }, () => {
console.log('Holat yangilandi!');
});
// useEffect yordamida holat o'zgarishiga javob berish
useEffect(() => {
console.log('Count holati o'zgardi:', count);
}, [count]); // Bog'liqlik: hook count o'zgarganda ishga tushadi
Usullarning taqqoslanishi:
| Xususiyat | Sinf komponent (setState) |
Funktsional komponent (useState) |
|---|---|---|
| Sintaksis | this.setState(newState[, callback]) |
const [state, setState] = useState(initialState) |
| Birlashtirish / O'rnini bosish | Yangi holatni mavjud bilan birlashtiradi (shallow merge) | Yangi holat bilan o'rnini bosadi |
| Asinxron | Asinxron | Reactning render fazasida chaqirilganda asinxron, voqea handlerlaridan chaqirilganda sinxron |
| Oldingi holatga bog'liqlik | this.setState(prevState => ({...})) funksiyasini uzatish |
setState(prev => ({...})) funksiyasini uzatish |