useState — React-də funksional komponentlərə sinif komponentlərinə çevirmədən lokal vəziyyəti idarə etməyə imkan verən daxili hookdur. React 16.8 hookları təqdim etdi və useState onların ən çox istifadə olunanı oldu, sinif yanaşmasındakı this.state və this.setState-i əvəz etdi. React Documentation (2025) məlumatına görə, müasir React tətbiqlərində komponentlərin 80%-dən çoxu formaların məlumatlarını, interfeys bayraqlarını və sayğacları idarə etmək üçün useState istifadə edir. Hook cari dəyəri və vəziyyəti yeniləyən və komponentin yenidən renderini tetikleyen setter funksiyasından ibarət tuple qaytarır.
Əsas məqamlar
useState — React-in 16.8 versiyasında əlavə edilmiş əsas hookdur və funksional komponentlərə lokal vəziyyəti saxlamaq və dəyişmək imkanı verir. Hookların meydana gəlməsindən əvvəl vəziyyət yalnız sinif komponentlərində this.state və this.setState vasitəsilə istifadə oluna bilərdi, bu da funksional komponentləri yalnız prezentasiya üçün yararlı edirdi. useState bu məhdudiyyəti aradan qaldıraraq bütün tətbiqi funksional komponentlər üzərində yazmağa imkan verdi.
Hook bir arqument qəbul edir — vəziyyətin ilkin dəyəri — və iki elementli massiv qaytarır. Birinci element vəziyyətin cari dəyəri, ikincisi isə onu yeniləmək üçün funksiyadır. React setter funksiyasının sabit olduğunu və renderlər arasında dəyişmədiyini təmin edir ki, bu da onu uşaq komponentlərə təhlükəsiz şəkildə ötürməyə və closure-larda istifadə etməyə imkan verir.
React DevTools Usage Survey (2024) məlumatına görə, useState React tətbiqlərinin 96%-də istifadə olunur və bu onu ekosistemdə ən geniş yayılmış hook edir. Hətta Redux və ya Zustand vasitəsilə qlobal vəziyyətdən istifadə edən tətbiqlərdə belə, useState vasitəsilə lokal state UI vəziyyətini idarə etmək üçün əsas mexanizm olaraq qalır — açıq modallar, giriş sahələrinin dəyərləri, aktiv tablar.
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-in daxili mexanizmi React-in fiber qovşaqlar sisteminə əsaslanır. React-də hər bir komponent fiber qovşağı ilə təmsil olunur və o, əlaqəli hookların siyahısını bağlı siyahı şəklində saxlayır. Komponent useState çağırdıqda, React bu siyahıda yeni qovşaq yaradır və orada vəziyyətin cari dəyərini və yeniləmələr növbəsinə istinadı saxlayır.
Setter funksiyası çağırıldıqda, React vəziyyəti dərhal yeniləmir. Bunun əvəzinə yeniləməni növbəyə (pending state queue) qoyur, komponentin yenidən renderini planlaşdırır və yalnız növbəti render zamanı köhnə və tətbiq edilmiş yeniləmələr əsasında yeni vəziyyəti hesablayır. Bu, toplu yeniləməni təmin edir — əgər bir hadisə idarəedicisində setter üç dəfə çağırılsa, React onları bir yenidən renderdə qruplaşdırır.
React Team — React 18 Working Group (2024) məlumatına görə, avtomatik toplu yeniləmə React 18-də genişləndirildi: indi vəziyyət yeniləmələri təkcə hadisə idarəedicilərində deyil, həm də setTimeout, Promise callback-lərində və native idarəedicilərdə qruplaşdırılır. Bu, çoxsaylı vəziyyət yeniləməsi ssenarilərində performansı 30%-ə qədər artırdı.
Yeni vəziyyət əvvəlkindən asılı olduqda, setter-in funksional formasından istifadə edin: setCount(prev => prev + 1). React yeniləmənin tətbiqi zamanı funksiyaya vəziyyətin aktual dəyərini ötürür ki, bu da toplu yeniləmələrdə belə düzgünlüyü təmin edir. Funksional forma olmadan setCount(count + 1) bir neçə dəfə ardıcıl çağırıldıqda köhnəlmiş dəyərdən istifadə edə bilər.
// Tənbəl initallaşdırma — yalnız bir dəfə işləyir
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-in əsas sintaksisi olduqca yığcamdır: const [state, setState] = useState(initialValue). İlkin dəyər yalnız ilk render zamanı istifadə olunur; sonrakı renderlərdə React onu nəzərə almır və cari saxlanılan dəyəri qaytarır. İlkin hesablama bahalı əməliyyatlar tələb edirsə, initallaşdırıcı funksiya ötürün: useState(() => computeExpensiveInitial()).
Tənbəl initallaşdırma (lazy initial state) xüsusilə ilkin dəyər localStorage-dan, mürəkkəb məlumat çevrilməsindən və ya URL parametrlərinin pars edilməsindən alındıqda vacibdir. React initallaşdırıcı funksiyanı yalnız bir dəfə — komponent montajı zamanı çağırır ki, bu da sonrakı renderlərdə resurslara qənaət edir. Tənbəl initallaşdırma olmadan bahalı ifadə hər renderdə hesablanacaq, hətta nəticəsi nəzərə alınmasa belə.
| Forma | Nümunə | Nə zaman istifadə etməli |
|---|---|---|
| Birbaşa | useState(0) | Sadə ilkin dəyər |
| Tənbəl | useState(() => compute()) | Bahalı ilkin hesablama |
| Funksional setter | setState(prev => prev + 1) | Əvvəlki əsasında yeniləmə |
| Birbaşa setter | setState(newValue) | Yeni dəyər köhnədən asılı deyil |
// Obyekt vəziyyəti — yeni istinad yaradın
const [user, setUser] = useState(() => {
const saved = localStorage.getItem('user');
return saved ? JSON.parse(saved) : null;
});
useState primitivlərlə (ədədlər, sətirlər, boolean) və istinad növləri ilə (massivlər, obyektlər) eyni dərəcədə yaxşı işləyir. Ancaq vacib bir fərq var: primitivlər üçün React dəyişikliyi dəyərə görə, obyektlər və massivlər üçün isə istinada görə müəyyən edir. Mövcud obyekti yenisini yaratmadan mutasiya etmək yenidən renderə səbəb olmayacaq, çünki istinad eyni qalıb.
Obyektlər və massivlərlə işləyərkən həmişə dəyişdirilmiş məlumatlarla yeni surət yaradın. Obyektlər üçün spread sintaksisindən istifadə edin: setUser(prev => ({...prev, name: newName})). Massivlər üçün — yeni massiv qaytaran metodlar: filter, map, concat və ya element əlavə etmək üçün spread sintaksisi. push, pop, splice kimi mutasiya metodları birbaşa işləməyəcək — React onları nəzərə almayacaq, çünki massivə istinad dəyişməyib.
// ✅ Düzgün: hooklar ən yuxarı səviyyədə
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]);
Bütün React hookları kimi, useState də iki qaydaya tabedir. Birinci: hookları yalnız komponentin ən yuxarı səviyyəsində çağırın — onları şərtlərin, dövrlərin və ya iç-içə funksiyaların daxilində yerləşdirmək olmaz. Bu, hookların hər renderdə eyni ardıcıllıqla çağrılmasını təmin edir ki, bu da React-in daxili bağlı siyahısı üçün kritikdir.
İkinci qayda: hookları yalnız React funksional komponentlərindən və ya xüsusi hooklardan çağırın. useState-i adi funksiyalardan, callback-lərdən və ya sinif komponentlərindən çağırmayın. Bu qaydaların pozulması Invalid hook call xətasına gətirib çıxarır, React bunu icra mərhələsində aşkarlayır.
// ❌ Köhnəlmiş closure problemi
function GoodComponent() {
const [count, setCount] = useState(0);
const [name, setName] = useState('');
// ✅ Funksional yeniləmə ilə düzəldildi
}
// sayğac köhnəlmişdir!
function BadComponent() {
if (isLogged) {
const [user, setUser] = useState(null);
}
}
Ən çox yayılmış səhv — yeni istinadlar yaratmaq əvəzinə obyektlərin və massivlərin birbaşa mutasiyasıdır. Tərtibatçılar sinif komponentlərindən mutasiya üslubuna öyrəşiblər, burada this.state.user.name = 'Yeni ad' işləyirdi (baxmayaraq ki, tövsiyə olunmurdu). Funksional komponentlərdə belə mutasiya sadəcə nəzərə alınmır: React istinadın dəyişdiyini görmür və komponenti yenidən çəkmir.
Köhnəlmiş closure (stale closure) problemi o zaman yaranır ki, useEffect və ya hadisə idarəedicisinə ötürülən callback, callback-in yaradılması anında closure-dan vəziyyətin köhnəlmiş dəyərini “tutur”. Həll yolu — setterin funksional formasından istifadə etmək və ya lazımi dəyərləri useEffect-in asılılıq massivinə daxil etmək. React Documentation — Hooks FAQ (2025) məlumatına görə, köhnəlmiş closure-lar səhv asılılıq massivindən sonra hooklarda ən çox rast gəlinən ikinci səbəbdir.
// ❌ 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);
}, []);
Tez-tez verilən suallar
Bəli, ancaq müəyyən ehtiyatla. Dərin iç-içə obyektlər üçün hər səviyyə yeniləmə zamanı kopyalama tələb edir: setState(prev => ({...prev, nested: {...prev.nested, key: newValue}})). Üç və daha çox iç-içə səviyyəsi olan obyektləriniz varsa, Immer (dəyişməz yeniləmə kitabxanası) və ya vəziyyəti müxtəlif səviyyələr üçün bir neçə useState-ə bölməyi düşünün.
useState o mənada asinxrondur ki, setter çağırışı dəyəri dərhal yeniləmir. React yeniləməni növbəyə qoyur və onu növbəti render zamanı icra edir. setCount(newValue)-dan sonra cari funksiyada count dəyişəni hələ də köhnə dəyəri saxlayır. Yeni dəyər yalnız komponentin növbəti çağırışında əlçatan olacaq. Toplu yeniləmə mexanizmi çoxsaylı çağırışların bir renderdə qruplaşdırılmasını təmin edir.
React Invalid hook call xətası atacaq. Hooklar yalnız React funksional komponentləri və ya xüsusi hooklar (adı use ilə başlayan funksiyalar) daxilində çağırıla bilər. Bu məhdudiyyət hookların implementasiyasına daxildir: onlar vəziyyəti saxlamaq üçün komponentin fiber ağacından istifadə edir və komponentdən kənarda bu ağac əlçatan deyil.
useState sadə müstəqil vəziyyətlər üçün uyğundur (sayğaclar, giriş sahələri, bayraqlar). useReducer vəziyyət bir neçə sahəsi olan mürəkkəb obyekt olduqda, yeniləmə məntiqi hərəkət növündən asılı olduqda və ya növbəti vəziyyət mürəkkəb transformasiya tələb etdikdə daha yaxşıdır. Praktik qayda: üçdən çox əlaqəli vəziyyət sahəniz varsa — useReducer istifadə edin.
Bu, performans üçün edilib. Əgər useState vəziyyəti sinxron yeniləsəydi, hər setter çağırışı dərhal yenidən renderə səbəb olardı ki, bu da bir hadisə idarəedicisi daxilində çoxsaylı yenidən çəkilmələrə gətirib çıxarardı. React-in yeniləmələri qruplaşdırıb bir yenidən render etdiyi toplu yeniləmə optimallaşdırması React 16-da tətbiq edilmiş və React 18-də avtomatik toplu yeniləmə ilə əhəmiyyətli dərəcədə təkmilləşdirilmişdir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun