Slovenščina

Odklenite moč logike za večkratno uporabo v vaših React aplikacijah s hooki po meri. Naučite se ustvarjati in uporabljati hooke po meri za čistejšo in lažje vzdrževano kodo.

Hooki po meri: Vzorci za večkratno uporabo logike v Reactu

React Hooki so revolucionirali način, kako pišemo React komponente, z uvedbo stanja in funkcij življenjskega cikla v funkcijske komponente. Med številnimi prednostmi, ki jih ponujajo, izstopajo hooki po meri kot močan mehanizem za ekstrahiranje in ponovno uporabo logike med več komponentami. Ta objava se bo poglobila v svet hookov po meri, raziskovala njihove prednosti, ustvarjanje in uporabo s praktičnimi primeri.

Kaj so hooki po meri?

V bistvu je hook po meri JavaScript funkcija, ki se začne z besedo "use" in lahko kliče druge hooke. Omogočajo vam, da logiko komponente ekstrahirate v funkcije za večkratno uporabo. To je močan način za deljenje logike s stanjem, stranskih učinkov ali drugih kompleksnih vedenj med komponentami, ne da bi se zatekali k render props, komponentam višjega reda ali drugim zapletenim vzorcem.

Ključne značilnosti hookov po meri:

Prednosti uporabe hookov po meri

Hooki po meri ponujajo več pomembnih prednosti pri razvoju v Reactu:

Ustvarjanje vašega prvega hooka po meri

Prikažimo ustvarjanje hooka po meri s praktičnim primerom: hook, ki sledi velikosti okna.

Primer: useWindowSize

Ta hook bo vrnil trenutno širino in višino okna brskalnika. Prav tako bo te vrednosti posodobil, ko se velikost okna spremeni.

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);

    // Odstrani poslušalca dogodkov ob čiščenju
    return () => window.removeEventListener('resize', handleResize);
  }, []); // Prazen seznam zagotavlja, da se učinek izvede samo ob priklopu

  return windowSize;
}

export default useWindowSize;

Razlaga:

  1. Uvoz potrebnih hookov: Uvozimo useState in useEffect iz Reacta.
  2. Definicija hooka: Ustvarimo funkcijo z imenom useWindowSize, ki ustreza konvenciji poimenovanja.
  3. Inicializacija stanja: Uporabimo useState za inicializacijo stanja windowSize z začetno širino in višino okna.
  4. Nastavitev poslušalca dogodkov: Uporabimo useEffect za dodajanje poslušalca dogodka 'resize' na okno. Ko se velikost okna spremeni, funkcija handleResize posodobi stanje windowSize.
  5. Čiščenje: Iz useEffect vrnemo funkcijo za čiščenje, ki odstrani poslušalca dogodkov, ko se komponenta odklopi. To preprečuje uhajanje pomnilnika.
  6. Vračanje vrednosti: Hook vrne objekt windowSize, ki vsebuje trenutno širino in višino okna.

Uporaba hooka po meri v komponenti

Zdaj, ko smo ustvarili naš hook po meri, poglejmo, kako ga uporabiti v React komponenti.

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

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

  return (
    

Širina okna: {width}px

Višina okna: {height}px

); } export default MyComponent;

Razlaga:

  1. Uvoz hooka: Uvozimo hook po meri useWindowSize.
  2. Klic hooka: Kličemo hook useWindowSize znotraj komponente.
  3. Dostop do vrednosti: Z destrukturiranjem vrnjenega objekta dobimo vrednosti width in height.
  4. Upodobitev vrednosti: Vrednosti širine in višine upodobimo v uporabniškem vmesniku komponente.

Vsaka komponenta, ki uporablja useWindowSize, se bo samodejno posodobila, ko se velikost okna spremeni.

Bolj kompleksni primeri

Raziščimo nekaj naprednejših primerov uporabe hookov po meri.

Primer: useLocalStorage

Ta hook vam omogoča enostavno shranjevanje in pridobivanje podatkov iz lokalne shrambe (local storage).

import { useState, useEffect } from 'react';

function useLocalStorage(key, initialValue) {
  // Stanje za shranjevanje naše vrednosti
  // Posreduj začetno vrednost v useState, da se logika izvede samo enkrat
  const [storedValue, setStoredValue] = useState(() => {
    try {
      // Pridobi iz lokalne shrambe po ključu
      const item = window.localStorage.getItem(key);
      // Razčleni shranjen json ali, če ga ni, vrni initialValue
      return item ? JSON.parse(item) : initialValue;
    } catch (error) {
      // Če pride do napake, prav tako vrni initialValue
      console.log(error);
      return initialValue;
    }
  });

  // Vrne ovito različico nastavitvene funkcije useState, ki ...
  // ... ohrani novo vrednost v localStorage.
  const setValue = (value) => {
    try {
      // Dovolimo, da je vrednost funkcija, da imamo enak API kot useState
      const valueToStore = value instanceof Function ? value(storedValue) : value;
      // Shrani v lokalno shrambo
      window.localStorage.setItem(key, JSON.stringify(valueToStore));
      // Shrani stanje
      setStoredValue(valueToStore);
    } catch (error) {
      // Naprednejša implementacija bi obravnavala primer napake
      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;

Uporaba:

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

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

  return (
    

Pozdravljen, {name}!

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

Primer: useFetch

Ta hook inkapsulira logiko za pridobivanje podatkov iz API-ja.

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 napaka! 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;

Uporaba:

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

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

  if (loading) return 

Nalaganje...

; if (error) return

Napaka: {error.message}

; return (

Naslov: {data.title}

Dokončano: {data.completed ? 'Da' : 'Ne'}

); } export default MyComponent;

Najboljše prakse za hooke po meri

Da bi zagotovili, da so vaši hooki po meri učinkoviti in vzdrževani, sledite tem najboljšim praksam:

Pogoste napake, ki se jim je treba izogibati

Napredni vzorci

Sestavljanje hookov po meri

Hooke po meri je mogoče sestavljati skupaj za ustvarjanje bolj kompleksne logike. Na primer, lahko združite hook useLocalStorage s hookom useFetch, da samodejno shranite pridobljene podatke v lokalno shrambo.

Deljenje logike med hooki

Če si več hookov po meri deli skupno logiko, lahko to logiko ekstrahirate v ločeno pomožno funkcijo in jo ponovno uporabite v obeh hookih.

Uporaba Contexta s hooki po meri

Hooke po meri je mogoče uporabiti v povezavi z React Contextom za dostop in posodabljanje globalnega stanja. To vam omogoča ustvarjanje komponent za večkratno uporabo, ki se zavedajo in lahko sodelujejo z globalnim stanjem aplikacije.

Primeri iz resničnega sveta

Tukaj je nekaj primerov, kako se lahko hooki po meri uporabljajo v resničnih aplikacijah:

Primer: hook useGeolocation za medkulturne aplikacije, kot so zemljevidi ali dostavne službe

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: 'Ta brskalnik ne podpira geolokacije.',
      });
      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;

Zaključek

Hooki po meri so močno orodje za pisanje čistejše, bolj ponovno uporabne in lažje vzdrževane React kode. Z inkapsulacijo kompleksne logike v hooke po meri lahko poenostavite svoje komponente, zmanjšate podvajanje kode in izboljšate celotno strukturo svojih aplikacij. Sprejmite hooke po meri in odklenite njihov potencial za gradnjo bolj robustnih in razširljivih React aplikacij.

Začnite z identifikacijo področij v vaši obstoječi kodi, kjer se logika ponavlja med več komponentami. Nato to logiko refaktorirajte v hooke po meri. Sčasoma boste zgradili knjižnico hookov za večkratno uporabo, ki bo pospešila vaš razvojni proces in izboljšala kakovost vaše kode.

Ne pozabite slediti najboljšim praksam, izogibati se pogostim napakam in raziskovati napredne vzorce, da boste kar najbolje izkoristili hooke po meri. Z vajo in izkušnjami boste postali mojster hookov po meri in učinkovitejši razvijalec Reacta.