Functional komponent va Hooks
Zamonaviy React — functional komponentlar va hooks: useState, useEffect, useRef. Class'siz ham hammasi bo'ladi.
Hooks — zamonaviy React
Class'siz state, lifecycle va ref. 2019-yildan beri — React'ning kelajagi.
Dars rejasi
6 ta mavzu1. Functional vs Class
1// ========== CLASS (eski) ==========2class Hisoblagich extends Component {3 state = { son: 0 };4
5 oshir = () => this.setState({ son: this.state.son + 1 });6
7 render() {8 return (9 <div>10 <h1>{this.state.son}</h1>11 <button onClick={this.oshir}>+</button>12 </div>13 );14 }15}16
17// ========== FUNCTIONAL + HOOKS (zamonaviy) ==========18function Hisoblagich() {19 const [son, setSon] = useState(0);20
21 return (22 <div>23 <h1>{son}</h1>24 <button onClick={() => setSon(son + 1)}>+</button>25 </div>26 );27}Qisqa
Ikki barobar kam kod. This yo'q.
Tez
React tezroq optimallashtiradi, bundle kichikroq.
Custom hook
O'z logikangizni qayta ishlatishga osonroq.
2. useState
useState — komponentga «xotira» qo'shadi. Massiv qaytaradi: [qiymat, qiymatniO'zgartiruvchiFunksiya].
1import { useState } from "react";2
3function Misol() {4 // Oddiy qiymatlar5 const [son, setSon] = useState(0);6 const [ism, setIsm] = useState("");7 const [faol, setFaol] = useState(true);8
9 // Obyekt10 const [user, setUser] = useState({ ism: "Ali", yosh: 17 });11
12 // Massiv13 const [royxat, setRoyxat] = useState([]);14
15 const oshir = () => setSon(son + 1);16 const oshir2 = () => setSon(oldin => oldin + 1); // tavsiya17
18 // Obyektni yangilash — albatta spread!19 const yangilash = () => {20 setUser({ ...user, yosh: user.yosh + 1 });21 };22
23 // Massivga qo'shish24 const qoshish = (yangi) => {25 setRoyxat([...royxat, yangi]);26 };27
28 return <div>{son}</div>;29}3. useEffect
useEffect — komponent chizilgandan keyin qandaydir ish qilish uchun. Class'dagi componentDidMount + componentDidUpdate + componentWillUnmount birga.
1import { useEffect, useState } from "react";2
3function Misol() {4 const [son, setSon] = useState(0);5 const [data, setData] = useState(null);6
7 // 1) Har render'da — kam ishlatiladi8 useEffect(() => {9 console.log("Har render");10 });11
12 // 2) Faqat bir marta (mount'da) — componentDidMount'ga o'xshash13 useEffect(() => {14 console.log("Faqat birinchi marta");15 fetch("/api/user").then(r => r.json()).then(setData);16 }, []); // bo'sh massiv17
18 // 3) son o'zgarganda — componentDidUpdate ga o'xshash19 useEffect(() => {20 console.log("Son o'zgardi:", son);21 document.title = `Son: ${son}`;22 }, [son]);23
24 return <button onClick={() => setSon(son + 1)}>{son}</button>;25}1function Soat() {2 const [vaqt, setVaqt] = useState(new Date());3
4 useEffect(() => {5 const timer = setInterval(() => {6 setVaqt(new Date());7 }, 1000);8
9 // Cleanup — komponent o'chganda yoki effect qayta ishga tushganda10 return () => clearInterval(timer);11 }, []);12
13 return <h1>{vaqt.toLocaleTimeString()}</h1>;14}Dependency yo'q
useEffect(fn) — har render'da. Xatarli.
Bo'sh []
useEffect(fn, []) — bir marta, mount'da.
Dependency
useEffect(fn, [x, y]) — x yoki y o'zgarganda.
4. useRef
1import { useRef, useEffect } from "react";2
3function AvtoFocus() {4 const inputRef = useRef(null);5
6 useEffect(() => {7 inputRef.current.focus();8 }, []);9
10 return <input ref={inputRef} placeholder="Avto-focus" />;11}1function RenderHisoblagich() {2 const [son, setSon] = useState(0);3 const renderSoni = useRef(0);4
5 // .current++ — state emas, render chaqirmaydi6 renderSoni.current++;7
8 return (9 <div>10 <p>Son: {son}</p>11 <p>Render: {renderSoni.current} marta</p>12 <button onClick={() => setSon(son + 1)}>Oshir</button>13 </div>14 );15}5. Qoidalar va custom hooks
1// ❌ IF ichida2function Xato({ faol }) {3 if (faol) {4 const [x, setX] = useState(0); // XATO5 }6}7
8// ✅ useState oldin, keyin if9function Togri({ faol }) {10 const [x, setX] = useState(0);11 if (faol) {12 return <div>{x}</div>;13 }14 return null;15}Custom hook — o'z logikangizni «use» prefiksi bilan funksiyaga chiqarish. Qayta ishlatish uchun.
1import { useState, useEffect } from "react";2
3function useLocalStorage(kalit, defaultQiymat) {4 const [value, setValue] = useState(() => {5 const saved = localStorage.getItem(kalit);6 return saved ? JSON.parse(saved) : defaultQiymat;7 });8
9 useEffect(() => {10 localStorage.setItem(kalit, JSON.stringify(value));11 }, [kalit, value]);12
13 return [value, setValue];14}15
16// Ishlatish — useState kabi!17function App() {18 const [ism, setIsm] = useLocalStorage("ism", "");19 const [mavzu, setMavzu] = useLocalStorage("mavzu", "light");20
21 return <input value={ism} onChange={e => setIsm(e.target.value)} />;22}6. Mashhur hooks — umumiy ko'rinish
useContext
Context'dan qiymat olish — prop-drilling'siz.
useReducer
Murakkab state'lar uchun useState'ga muqobil.
useMemo
Og'ir hisoblashlarni keshash.
useCallback
Funksiyani barqaror qilish (optimallashtirish).
useLayoutEffect
useEffect'ga o'xshash, lekin sinxron.
useId
Unique id yaratish (accessibility uchun).
1import { useState, useEffect } from "react";2
3function TodoApp() {4 const [vazifalar, setVazifalar] = useState([]);5 const [filtr, setFiltr] = useState("all");6 const [matn, setMatn] = useState("");7
8 // Yuklash9 useEffect(() => {10 const saved = localStorage.getItem("vazifalar");11 if (saved) setVazifalar(JSON.parse(saved));12 }, []);13
14 // Saqlash15 useEffect(() => {16 localStorage.setItem("vazifalar", JSON.stringify(vazifalar));17 }, [vazifalar]);18
19 const qoshish = (e) => {20 e.preventDefault();21 if (!matn.trim()) return;22 setVazifalar([...vazifalar, {23 id: Date.now(),24 matn: matn.trim(),25 bajarildi: false26 }]);27 setMatn("");28 };29
30 const toggle = (id) => {31 setVazifalar(vazifalar.map(v =>32 v.id === id ? { ...v, bajarildi: !v.bajarildi } : v33 ));34 };35
36 const ochir = (id) => {37 setVazifalar(vazifalar.filter(v => v.id !== id));38 };39
40 const korinadigan = vazifalar.filter(v => {41 if (filtr === "active") return !v.bajarildi;42 if (filtr === "done") return v.bajarildi;43 return true;44 });45
46 return (47 <div className="app">48 <h1>Vazifalar</h1>49 <form onSubmit={qoshish}>50 <input value={matn} onChange={e => setMatn(e.target.value)} />51 <button>Qo'sh</button>52 </form>53
54 <div className="filter">55 {["all", "active", "done"].map(f => (56 <button57 key={f}58 className={filtr === f ? "on" : ""}59 onClick={() => setFiltr(f)}60 >61 {f}62 </button>63 ))}64 </div>65
66 <ul>67 {korinadigan.map(v => (68 <li key={v.id} className={v.bajarildi ? "done" : ""}>69 <input type="checkbox" checked={v.bajarildi}70 onChange={() => toggle(v.id)} />71 <span>{v.matn}</span>72 <button onClick={() => ochir(v.id)}>×</button>73 </li>74 ))}75 </ul>76 </div>77 );78}Kichik test
0 / 51.useState nima qaytaradi?
2.useEffect faqat bir marta ishlashi uchun?
3.Timer tozalash qayerda?
4.Hooks qayerda chaqiriladi?
5.useRef va useState farqi?