useState: bu nima, holat hooki va sintaksis React-da

Muallif: IT Sectr Nashr etilgan: 2026-07-04 O'qish vaqti: 9 daq

useState — React-ning o'rnatilgan hooki bo'lib, funksional komponentlarga sinf komponentlariga aylantirmasdan mahalliy holatni boshqarish imkonini beradi. React 16.8 hooklarni taqdim etdi va useState ular orasida eng ko'p ishlatiladiganiga aylandi, sinf yondashuvidagi this.state va this.setState o'rnini egalladi. React Documentation (2025) ma'lumotiga ko'ra, zamonaviy React ilovalaridagi komponentlarning 80% dan ortig'i forma ma'lumotlarini, interfeys bayroqlarini va hisoblagichlarni boshqarish uchun useState dan foydalanadi. Hook joriy qiymat va holatni yangilaydigan hamda komponentni qayta renderlashni boshlaydigan setter funksiyasidan iborat tuple qaytaradi.

Asosiy fikrlar

  • useState — React funksional komponentlarida mahalliy holatni boshqarish uchun hook.
  • Tuple — [qiymat, setter] juftligini qaytaradi, bu yerda setter holatni yangilovchi funksiya.
  • Qayta renderlash — setter chaqiruvi har doim komponentni yangi qiymat bilan qayta chizadi.
  • Ma'lumot turlari — useState sonlar, satrlar, massivlar, obyektlar va mantiqiy qiymatlar bilan ishlaydi.
  • O'zgarmaslik — holatni to'g'ridan-to'g'ri mutatsiya qilish mumkin emas, faqat setter funksiyasi orqali.

React-da useState nima

useState — React-ning 16.8 versiyasida qo'shilgan asosiy hook bo'lib, funksional komponentlarga mahalliy holatni saqlash va o'zgartirish imkoniyatini beradi. Hooklar paydo bo'lishidan oldin holat faqat sinf komponentlarida this.state va this.setState orqali ishlatilishi mumkin edi, bu funksional komponentlarni faqat taqdimot uchun yaroqli qilgan. useState bu cheklovni bartaraf etib, butun ilovani funksional komponentlarda yozish imkonini berdi.

Hook bitta argument qabul qiladi — holatning boshlang'ich qiymati — va ikki elementli massiv qaytaradi. Birinchi element holatning joriy qiymati, ikkinchisi — uni yangilash uchun funksiya. React setter funksiyasining barqarorligini va renderlar orasida o'zgarmasligini kafolatlaydi, bu uni bolak komponentlarga xavfsiz uzatish va closure-larda ishlatish imkonini beradi.

React DevTools Usage Survey (2024) ma'lumotiga ko'ra, useState React ilovalarining 96 foizida qo'llaniladi, bu uni ekotizimdagi eng keng tarqalgan hook qiladi. Hatto Redux yoki Zustand orqali global holatdan foydalanadigan ilovalarda ham, useState orqali mahalliy state UI holatini boshqarishning asosiy mexanizmi bo'lib qoladi — ochiq modallar, kirish maydonlari qiymatlari, faol yorliqlar.

jsx
import { useState } from 'react';

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

    return (
        <div>
            <p>Count: {count}</p>
            <button onClick={() => setCount(count + 1)}>
                Increment
            </button>
        </div>
    );
}

useState qanday ishlaydi

useState ning ichki mexanizmi React-ning fiber tugunlari tizimiga asoslangan. React-dagi har bir komponent fiber tuguni bilan ifodalanadi va u bog'langan hooklar ro'yxatini bog'langan ro'yxat shaklida saqlaydi. Komponent useState ni chaqirganda, React bu ro'yxatda yangi tugun yaratadi va unda holatning joriy qiymatini va yangilashlar navbatiga havolani saqlaydi.

Setter funksiyasi chaqirilganda, React holatni darhol yangilamaydi. Buning o'rniga yangilashni navbatga (pending state queue) qo'yadi, komponentni qayta renderlashni rejalashtiradi va faqat keyingi render vaqtida eski va qo'llanilgan yangilanishlar asosida yangi holatni hisoblaydi. Bu to'plamli yangilashni ta'minlaydi — agar bitta hodisa ishlovchisida setter uch marta chaqirilsa, React ularni bitta qayta renderlashda guruhlaydi.

React Team — React 18 Working Group (2024) ma'lumotiga ko'ra, avtomatik to'plamli yangilash React 18 da kengaytirildi: endi holat yangilanishlari nafaqat hodisa ishlovchilarida, balki setTimeout, Promise callback-larida va native ishlovchilarda ham guruhlanadi. Bu ko'p sonli holat yangilanishlari stsenariylarida ishlashni 30% gacha oshirdi.

Holatni funksional yangilash

Yangi holat avvalgisiga bog'liq bo'lganda, setter ning funksional shaklidan foydalaning: setCount(prev => prev + 1). React yangilanishni qo'llash vaqtida funksiyaga holatning haqiqiy qiymatini uzatadi, bu to'plamli yangilanishlarda ham to'g'rilikni kafolatlaydi. Funksional shaklsiz setCount(count + 1) bir necha marta ketma-ket chaqirilganda eskirgan qiymatdan foydalanishi mumkin.

jsx
// Dangasa initsializatsiya — faqat bir marta ishlaydi
setCount(prev => prev + 1);
setCount(prev => prev + 1);
setCount(prev => prev + 1);
// Result: count increased by 3

// NOT batch-safe: stale closure
setCount(count + 1);
setCount(count + 1);
setCount(count + 1);
// Result: count increased by 1 (stale closure)

useState sintaksisi: e'lon qilish va yangilash

useState ning asosiy sintaksisi juda ixcham: const [state, setState] = useState(initialValue). Boshlang'ich qiymat faqat birinchi renderda ishlatiladi; keyingi renderlarda React uni e'tiborsiz qoldirib, joriy saqlangan qiymatni qaytaradi. Agar boshlang'ich hisoblash qimmat operatsiyalarni talab qilsa, initsializator funksiyasini uzating: useState(() => computeExpensiveInitial()).

Dangasa initsializatsiya (lazy initial state) ayniqsa boshlang'ich qiymat localStorage, murakkab ma'lumot konvertatsiyasi yoki URL parametrlarini pars qilishdan olinganda muhimdir. React initsializator funksiyasini faqat bir marta — komponent montaji vaqtida chaqiradi, bu keyingi renderlarda resurslarni tejaydi. Dangasa initsializatsiyasiz qimmat ifoda har bir renderda hisoblanadi, hatto natijasi e'tiborga olinmasa ham.

ShaklMisolQachon ishlatish
To'g'ridan-to'g'riuseState(0)Oddiy boshlang'ich qiymat
DangasauseState(() => compute())Qimmat boshlang'ich hisoblash
Funksional settersetState(prev => prev + 1)Avvalgisiga asoslangan yangilash
To'g'ridan-to'g'ri settersetState(newValue)Yangi qiymat eskisiga bog'liq emas
jsx
// Obyekt holati — yangi havola yarating
const [user, setUser] = useState(() => {
    const saved = localStorage.getItem('user');
    return saved ? JSON.parse(saved) : null;
});

useState turli ma'lumot turlari bilan

useState primitivlar (sonlar, satrlar, mantiqiy) va havola turlari (massivlar, obyektlar) bilan bir xil darajada yaxshi ishlaydi. Ammo muhim farq bor: primitivlar uchun React o'zgarishni qiymat bo'yicha, obyektlar va massivlar uchun — havola bo'yicha aniqlaydi. Mavjud obyektni yangisini yaratmasdan mutatsiya qilish qayta renderlashga olib kelmaydi, chunki havola bir xil qolgan.

Obyektlar va massivlar bilan ishlaganda har doim o'zgartirilgan ma'lumotlar bilan yangi nusxa yarating. Obyektlar uchun spread sintaksisidan foydalaning: setUser(prev => ({...prev, name: newName})). Massivlar uchun — yangi massiv qaytaradigan metodlar: filter, map, concat, yoki element qo'shish uchun spread sintaksisi. push, pop, splice kabi mutatsiya metodlari to'g'ridan-to'g'ri ishlamaydi — React ularni e'tiborsiz qoldiradi, chunki massivga havola o'zgarmagan.

jsx
// ✅ To'g'ri: hooklar eng yuqori darajada
const [form, setForm] = useState({ name: '', email: '' });
const updateField = (field, value) =>
    setForm(prev => ({ ...prev, [field]: value }));

// ...
const [items, setItems] = useState([]);
const addItem = item =>
    setItems(prev => [item, ...prev]);

useState bilan hooklardan foydalanish qoidalari

Barcha React hooklari kabi, useState ham ikkita qoidaga bo'ysunadi. Birinchi: hooklarni faqat komponentning eng yuqori darajasida chaqiring — ularni shartlar, sikllar yoki ichma-ich funksiyalar ichida joylashtirib bo'lmaydi. Bu hooklarning har bir renderda bir xil tartibda chaqirilishini kafolatlaydi, bu React-ning ichki bog'langan ro'yxati uchun juda muhimdir.

Ikkinchi qoida: hooklarni faqat React funksional komponentlaridan yoki maxsus hooklardan chaqiring. useState ni oddiy funksiyalardan, callback-lardan yoki sinf komponentlaridan chaqirmang. Ushbu qoidalarni buzish Invalid hook call xatosiga olib keladi, React buni bajarish bosqichida aniqlaydi.

  • Shartlarda emas — if (flag) { useState(0) } hooklarni chaqirish tartibini buzadi.
  • Sikllarda emas — for (...) { useState(0) } tartibni oldindan aytib bo'lmaydigan qiladi.
  • Callback-larda emas — useEffect(() => { useState(0) }, []) bog'langan ro'yxatni buzadi.
jsx
// ❌ Eskirgan closure muammosi
function GoodComponent() {
    const [count, setCount] = useState(0);
    const [name, setName] = useState('');
    // ✅ Funksional yangilash bilan tuzatildi
}

// hisoblagich eskirgan!
function BadComponent() {
    if (isLogged) {
        const [user, setUser] = useState(null);
    }
}

useState bilan odatiy xatolar

Eng keng tarqalgan xato — yangi havolalar yaratish o'rniga obyektlar va massivlarning to'g'ridan-to'g'ri mutatsiyasi. Dasturchilar sinf komponentlaridagi mutatsion uslubga o'rganib qolgan, bu yerda this.state.user.name = “Yangi nom” ishlagan (garchi tavsiya etilmasa ham). Funksional komponentlarda bunday mutatsiya shunchaki e'tiborga olinmaydi: React havola o'zgarishini ko'rmaydi va komponentni qayta chizmaydi.

  • Obyekt mutatsiyasi — user.name = “Yangi” o'rniga setUser({...user, name: “Yangi”}).
  • Eskirgan closure — funksional shaklsiz setterda eskirgan qiymatdan foydalanish.
  • Keraksiz qayta renderlar — setterni bir xil qiymat bilan chaqirish (React 18 primitivlar uchun baribir render qiladi).
  • Holatni tiklash — komponentning kalit propining beixtiyor yangilanishi, uni qayta montaj qiladi.

Eskirgan closure (stale closure) muammosi useEffect yoki hodisa ishlovchisiga uzatilgan callback, callback yaratilish vaqtida closure dan holatning eskirgan qiymatini “tutib olishi” bilan yuzaga keladi. Yechim — setterning funksional shaklidan foydalanish yoki kerakli qiymatlarni useEffect ning bog'liqlik massiviga kiritish. React Documentation — Hooks FAQ (2025) ma'lumotiga ko'ra, eskirgan closure-lar noto'g'ri bog'liqlik massividan keyin hooklardagi ikkinchi eng keng tarqalgan xatolik sababidir.

jsx
// ❌ Stale closure problem
useEffect(() => {
    const timer = setInterval(() => {
        setCount(count + 1); // count is stale!
    }, 1000);
    return () => clearInterval(timer);
}, []);

// ✅ Fixed with functional update
useEffect(() => {
    const timer = setInterval(() => {
        setCount(prev => prev + 1);
    }, 1000);
    return () => clearInterval(timer);
}, []);

Ko'p so'raladigan savollar

Murakkab ichma-ich obyektlar uchun useState dan foydalanish mumkinmi?

Ha, lekin ehtiyotkorlik bilan. Chuqur ichma-ich obyektlar uchun har bir daraja yangilashda nusxa olishni talab qiladi: setState(prev => ({...prev, nested: {...prev.nested, key: newValue}})). Agar uch yoki undan ortiq ichma-ich darajali obyektlaringiz bo'lsa, Immer (o'zgarmas yangilash kutubxonasi) dan foydalaning yoki holatni turli darajalar uchun bir nechta useState ga bo'ling.

useState asinxronmi yoki sinxronmi?

useState shu ma'noda asinxronki, setter chaqiruvi qiymatni darhol yangilamaydi. React yangilashni navbatga qo'yadi va keyingi render vaqtida bajaradi. setCount(newValue) dan keyin joriy funksiyadagi count o'zgaruvchisi hali ham eski qiymatni saqlaydi. Yangi qiymat faqat komponentning keyingi chaqiruvida mavjud bo'ladi. To'plamli yangilash mexanizmi ko'p sonli chaqiruvlarning bitta renderda guruhlanishini kafolatlaydi.

Agar useState komponentdan tashqarida chaqirilsa nima bo'ladi?

React Invalid hook call xatosini tashlaydi. Hooklar faqat React funksional komponentlari yoki maxsus hooklar (nomi use bilan boshlanadigan funksiyalar) ichida chaqirilishi mumkin. Bu cheklov hooklarning implementatsiyasiga o'rnatilgan: ular holatni saqlash uchun komponentning fiber daraxtidan foydalanadi va komponentdan tashqarida bu daraxt mavjud emas.

Qachon useState va qachon useReducer ishlatish kerak?

useState oddiy mustaqil holatlar uchun mos (hisoblagichlar, kirish maydonlari, bayroqlar). useReducer holat bir necha maydonli murakkab obyekt bo'lganda, yangilash mantig'i harakat turiga bog'liq bo'lganda yoki keyingi holat murakkab transformatsiyani talab qilganda yaxshiroq. Amaliy qoida: agar uchtadan ortiq bog'liq holat maydoningiz bo'lsa — useReducer dan foydalaning.

Nega useState qiymatni darhol yangilamaydi?

Bu ishlash uchun qilingan. Agar useState holatni sinxron yangilasa, har bir setter chaqiruvi darhol qayta renderlashga sabab bo'lar edi, bu bitta hodisa ishlovchisi ichida bir necha marta qayta chizishga olib kelardi. React yangilanishlarni guruhlab, bitta qayta renderlashni bajaradigan to'plamli yangilash optimallashtiruvi React 16 da joriy qilingan va React 18 da avtomatik to'plamli yangilash bilan sezilarli darajada yaxshilangan.

Xulosa

  • useState — funksional komponentlarda mahalliy holatni boshqarish uchun asosiy React hooki, [state, setter] qaytaradi.
  • O'zgarmaslik — holatni to'g'ridan-to'g'ri mutatsiya qilish mumkin emas; har doim yangi qiymat uzating yoki setterning funksional shaklidan foydalaning.
  • Dangasa initsializatsiya — qimmat boshlang'ich hisoblashlar uchun funksiya uzating: useState(() => compute()).
  • Funksional setter — setState(prev => prev + 1) to'plamli yangilanishlarda to'g'rilikni kafolatlaydi.
  • To'plamli yangilash — React optimallashtirish uchun ko'p sonli setter chaqiruvlarini bitta qayta renderlashda guruhlaydi.
  • Hook qoidalari — useState ni faqat komponentning eng yuqori darajasida, shartlar yoki sikllar ichida emas, chaqiring.
  • Ma'lumot turlari — obyektlar va massivlar uchun yangilashda har doim yangi havola yarating.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing