O'zbek

React ilovalaringizda maxsus hook'lar yordamida qayta ishlatiladigan mantiq qudratini oching. Tozaroq va qo'llab-quvvatlash oson bo'lgan kod uchun maxsus hook'larni yaratish va ulardan foydalanishni o'rganing.

Maxsus Hook'lar: React'da Qayta Ishlatiladigan Mantiqiy Andozalar

React Hook'lari funksional komponentlarga holat (state) va hayotiy sikl (lifecycle) xususiyatlarini kiritib, React komponentlarini yozish usulimizni inqilob qildi. Ular taklif qiladigan ko'plab afzalliklar orasida, maxsus hook'lar bir nechta komponentlar bo'ylab mantiqni ajratib olish va qayta ishlatish uchun kuchli mexanizm sifatida ajralib turadi. Ushbu blog posti maxsus hook'lar dunyosiga chuqur kirib boradi, ularning afzalliklari, yaratilishi va amaliy misollar bilan qo'llanilishini o'rganadi.

Maxsus Hook'lar nima?

Aslini olganda, maxsus hook - bu "use" so'zi bilan boshlanadigan va boshqa hook'larni chaqira oladigan JavaScript funksiyasidir. Ular sizga komponent mantiqini qayta ishlatiladigan funksiyalarga ajratib olish imkonini beradi. Bu render props, yuqori darajali komponentlar yoki boshqa murakkab andozalarga murojaat qilmasdan, holatli mantiq, yon ta'sirlar yoki boshqa murakkab xatti-harakatlarni komponentlar o'rtasida bo'lishishning kuchli usulidir.

Maxsus Hook'larning Asosiy Xususiyatlari:

Maxsus Hook'lardan Foydalanishning Afzalliklari

Maxsus hook'lar React dasturlashida bir nechta muhim afzalliklarni taqdim etadi:

Birinchi Maxsus Hook'ingizni Yaratish

Keling, maxsus hook yaratishni amaliy misol bilan ko'rib chiqaylik: oyna o'lchamini kuzatuvchi hook.

Misol: useWindowSize

Ushbu hook brauzer oynasining joriy kengligi va balandligini qaytaradi. Shuningdek, u oyna o'lchami o'zgarganda bu qiymatlarni yangilaydi.

import { useState, useEffect } from 'react';

function useWindowSize() {
  const [windowSize, setWindowSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });

  useEffect(() => {
    function handleResize() {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }

    window.addEventListener('resize', handleResize);

    // Remove event listener on cleanup
    return () => window.removeEventListener('resize', handleResize);
  }, []); // Empty array ensures that effect is only run on mount

  return windowSize;
}

export default useWindowSize;

Tushuntirish:

  1. Kerakli Hook'larni import qilish: Biz React'dan useState va useEffect'ni import qilamiz.
  2. Hook'ni Aniqlash: Biz nomlash qoidasiga rioya qilgan holda useWindowSize nomli funksiya yaratamiz.
  3. Holatni Boshlash: Biz useState yordamida windowSize holatini oynaning boshlang'ich kengligi va balandligi bilan boshlaymiz.
  4. Hodisa Tinglovchisini O'rnatish: Biz useEffect yordamida oynaga 'resize' hodisasi tinglovchisini qo'shamiz. Oyna o'lchami o'zgarganda, handleResize funksiyasi windowSize holatini yangilaydi.
  5. Tozalash: Komponent o'chirilganda hodisa tinglovchisini olib tashlash uchun useEffect'dan tozalash funksiyasini qaytaramiz. Bu xotira sizib chiqishining oldini oladi.
  6. Qiymatlarni Qaytarish: Hook oynaning joriy kengligi va balandligini o'z ichiga olgan windowSize obyektini qaytaradi.

Maxsus Hook'ni Komponentda Ishlatish

Endi biz maxsus hook'imizni yaratganimizdan so'ng, uni React komponentida qanday ishlatishni ko'rib chiqaylik.

import React from 'react';
import useWindowSize from './useWindowSize';

function MyComponent() {
  const { width, height } = useWindowSize();

  return (
    

Oyna kengligi: {width}px

Oyna balandligi: {height}px

); } export default MyComponent;

Tushuntirish:

  1. Hook'ni Import Qilish: Biz useWindowSize maxsus hook'ini import qilamiz.
  2. Hook'ni Chaqirish: Biz komponent ichida useWindowSize hook'ini chaqiramiz.
  3. Qiymatlarga Kirish: Biz width va height qiymatlarini olish uchun qaytarilgan obyektni destrukturizatsiya qilamiz.
  4. Qiymatlarni Render Qilish: Biz komponentning UI'sida kenglik va balandlik qiymatlarini render qilamiz.

useWindowSize'dan foydalanadigan har qanday komponent oyna o'lchami o'zgarganda avtomatik ravishda yangilanadi.

Murakkabroq Misollar

Keling, maxsus hook'lar uchun ba'zi ilg'or foydalanish holatlarini o'rganaylik.

Misol: useLocalStorage

Ushbu hook sizga local storage'dan ma'lumotlarni osongina saqlash va olish imkonini beradi.

import { useState, useEffect } from 'react';

function useLocalStorage(key, initialValue) {
  // State to store our value
  // Pass initial value to useState so logic is only executed once
  const [storedValue, setStoredValue] = useState(() => {
    try {
      // Get from local storage by key
      const item = window.localStorage.getItem(key);
      // Parse stored json or if none return initialValue
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      // If error also return initialValue
      console.log(error);
      return initialValue;
    }
  });

  // Return a wrapped version of useState's setter function that ...
  // ... persists the new value to localStorage.
  const setValue = (value) => {
    try {
      // Allow value to be a function so we have same API as useState
      const valueToStore = value instanceof Function ? value(storedValue) : value;
      // Save to local storage
      window.localStorage.setItem(key, JSON.stringify(valueToStore));
      // Save state
      setStoredValue(valueToStore);
    } catch (error) {
      // A more advanced implementation would handle the error case
      console.log(error);
    }
  };

  useEffect(() => {
    try {
      const item = window.localStorage.getItem(key);
      setStoredValue(item ? JSON.parse(item) : initialValue);
    } catch (error) {
      console.log(error);
    }
  }, [key, initialValue]);

  return [storedValue, setValue];
}

export default useLocalStorage;

Foydalanish:

import React from 'react';
import useLocalStorage from './useLocalStorage';

function MyComponent() {
  const [name, setName] = useLocalStorage('name', 'Guest');

  return (
    

Salom, {name}!

setName(e.target.value)} />
); } export default MyComponent;

Misol: useFetch

Ushbu hook API'dan ma'lumotlarni olish mantiqini inkapsulyatsiya qiladi.

import { useState, useEffect } from 'react';

function useFetch(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch(url);
        if (!response.ok) {
          throw new Error(`HTTP xatosi! status: ${response.status}`);
        }
        const json = await response.json();
        setData(json);
        setLoading(false);
      } catch (error) {
        setError(error);
        setLoading(false);
      }
    }

    fetchData();
  }, [url]);

  return { data, loading, error };
}

export default useFetch;

Foydalanish:

import React from 'react';
import useFetch from './useFetch';

function MyComponent() {
  const { data, loading, error } = useFetch('https://jsonplaceholder.typicode.com/todos/1');

  if (loading) return 

Yuklanmoqda...

; if (error) return

Xato: {error.message}

; return (

Sarlavha: {data.title}

Bajarilgan: {data.completed ? 'Ha' : 'Yo\'q'}

); } export default MyComponent;

Maxsus Hook'lar Uchun Eng Yaxshi Amaliyotlar

Maxsus hook'laringiz samarali va qo'llab-quvvatlanadigan bo'lishini ta'minlash uchun ushbu eng yaxshi amaliyotlarga rioya qiling:

Oldini Olish Kerak Bo'lgan Umumiy Xatolar

Ilg'or Andozalar

Maxsus Hook'larni Birlashtirish

Maxsus hook'lar murakkabroq mantiqni yaratish uchun birgalikda birlashtirilishi mumkin. Masalan, olingan ma'lumotlarni avtomatik ravishda local storage'ga saqlash uchun useLocalStorage hook'ini useFetch hook'i bilan birlashtirishingiz mumkin.

Hook'lar O'rtasida Mantiqni Bo'lishish

Agar bir nechta maxsus hook'lar umumiy mantiqqa ega bo'lsa, siz bu mantiqni alohida yordamchi funksiyaga ajratib olib, uni ikkala hook'da ham qayta ishlatishingiz mumkin.

Maxsus Hook'lar bilan Kontekstdan Foydalanish

Maxsus hook'lar global holatga kirish va uni yangilash uchun React Konteksti bilan birgalikda ishlatilishi mumkin. Bu sizga ilovaning global holatidan xabardor bo'lgan va u bilan o'zaro aloqada bo'la oladigan qayta ishlatiladigan komponentlarni yaratishga imkon beradi.

Haqiqiy Dunyo Misollari

Quyida maxsus hook'larning haqiqiy dunyo ilovalarida qanday ishlatilishi mumkinligiga oid ba'zi misollar keltirilgan:

Misol : xaritalash yoki yetkazib berish xizmatlari kabi madaniyatlararo ilovalar uchun useGeolocation hook'i

import { useState, useEffect } from 'react';

function useGeolocation() {
  const [location, setLocation] = useState({
    latitude: null,
    longitude: null,
    error: null,
  });

  useEffect(() => {
    if (!navigator.geolocation) {
      setLocation({
        latitude: null,
        longitude: null,
        error: 'Geolokatsiya bu brauzer tomonidan qo\'llab-quvvatlanmaydi.',
      });
      return;
    }

    const watchId = navigator.geolocation.watchPosition(
      (position) => {
        setLocation({
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
          error: null,
        });
      },
      (error) => {
        setLocation({
          latitude: null,
          longitude: null,
          error: error.message,
        });
      }
    );

    return () => navigator.geolocation.clearWatch(watchId);
  }, []);

  return location;
}

export default useGeolocation;

Xulosa

Maxsus hook'lar toza, qayta ishlatiladigan va yanada qo'llab-quvvatlanadigan React kodini yozish uchun kuchli vositadir. Murakkab mantiqni maxsus hook'larda inkapsulyatsiya qilish orqali siz komponentlaringizni soddalashtirishingiz, kod takrorlanishini kamaytirishingiz va ilovalaringizning umumiy tuzilishini yaxshilashingiz mumkin. Maxsus hook'larni qabul qiling va yanada mustahkam va kengaytiriladigan React ilovalarini yaratish uchun ularning salohiyatini oching.

Mavjud kod bazangizda mantiq bir nechta komponentlar bo'ylab takrorlanayotgan joylarni aniqlashdan boshlang. Keyin, bu mantiqni maxsus hook'larga refaktor qiling. Vaqt o'tishi bilan, siz dasturlash jarayoningizni tezlashtiradigan va kodingiz sifatini yaxshilaydigan qayta ishlatiladigan hook'lar kutubxonasini yaratasiz.

Eng yaxshi amaliyotlarga rioya qilishni, umumiy xatolardan qochishni va maxsus hook'lardan maksimal darajada foydalanish uchun ilg'or andozalarni o'rganishni unutmang. Amaliyot va tajriba bilan siz maxsus hook'lar ustasi va samaraliroq React dasturchisiga aylanasiz.

Maxsus Hook'lar: React'da Qayta Ishlatiladigan Mantiqiy Andozalar | MLOG