Magyar

Fedezze fel az újrafelhasználható logika erejét React alkalmazásaiban az egyedi hookok segítségével. Tanulja meg, hogyan hozhat létre és használhat egyedi hookokat a tisztább, könnyebben karbantartható kód érdekében.

Egyedi Hookok: Újrafelhasználható Logikai Minták a Reactben

A React Hookok forradalmasították a React komponensek írásmódját azáltal, hogy állapot- és életciklus-funkciókat vezettek be a funkcionális komponensekbe. A sok előnyük közül az egyedi hookok kiemelkednek, mint egy hatékony mechanizmus a logika kinyerésére és újrafelhasználására több komponens között. Ez a blogbejegyzés mélyen elmerül az egyedi hookok világában, feltárva azok előnyeit, létrehozását és használatát gyakorlati példákkal.

Mik azok az Egyedi Hookok?

Lényegében az egyedi hook egy JavaScript függvény, amely a "use" szóval kezdődik, és más hookokat is meghívhat. Lehetővé teszik, hogy a komponenslogikát újrafelhasználható függvényekbe vonjuk ki. Ez egy hatékony módja az állapotot kezelő logika, mellékhatások vagy más bonyolult viselkedések megosztásának a komponensek között anélkül, hogy render propokhoz, magasabb rendű komponensekhez vagy más bonyolult mintákhoz folyamodnánk.

Az Egyedi Hookok Főbb Jellemzői:

Az Egyedi Hookok Használatának Előnyei

Az egyedi hookok számos jelentős előnyt kínálnak a React fejlesztésben:

Az Első Egyedi Hook Létrehozása

Szemléltessük egy egyedi hook létrehozását egy gyakorlati példával: egy hook, amely az ablak méretét követi.

Példa: useWindowSize

Ez a hook a böngészőablak aktuális szélességét és magasságát adja vissza. Az értékeket frissíti is, amikor az ablakot átméretezik.

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;

Magyarázat:

  1. Szükséges Hookok Importálása: Importáljuk a useState-et és a useEffect-et a Reactből.
  2. A Hook Definiálása: Létrehozunk egy useWindowSize nevű függvényt, betartva az elnevezési konvenciót.
  3. Állapot Inicializálása: A useState segítségével inicializáljuk a windowSize állapotot az ablak kezdeti szélességével és magasságával.
  4. Eseményfigyelő Beállítása: A useEffect segítségével egy átméretezési eseményfigyelőt adunk az ablakhoz. Amikor az ablakot átméretezik, a handleResize függvény frissíti a windowSize állapotot.
  5. Tisztítás: Egy tisztító függvényt adunk vissza a useEffect-ből, hogy eltávolítsuk az eseményfigyelőt, amikor a komponens lecsatolódik. Ez megakadályozza a memóriaszivárgásokat.
  6. Visszatérési Értékek: A hook a windowSize objektumot adja vissza, amely az ablak aktuális szélességét és magasságát tartalmazza.

Az Egyedi Hook Használata egy Komponensben

Most, hogy létrehoztuk az egyedi hookunkat, nézzük meg, hogyan használhatjuk egy React komponensben.

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

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

  return (
    

Ablak szélessége: {width}px

Ablak magassága: {height}px

); } export default MyComponent;

Magyarázat:

  1. A Hook Importálása: Importáljuk a useWindowSize egyedi hookot.
  2. A Hook Meghívása: Meghívjuk a useWindowSize hookot a komponensen belül.
  3. Értékek Elérése: Destrukturáljuk a visszakapott objektumot, hogy megkapjuk a width és height értékeket.
  4. Értékek Renderelése: Rendereljük a szélesség és magasság értékeket a komponens felhasználói felületén.

Bármely komponens, amely a useWindowSize-t használja, automatikusan frissülni fog, amikor az ablak mérete megváltozik.

Bonyolultabb Példák

Nézzünk meg néhány haladóbb felhasználási esetet az egyedi hookokra.

Példa: useLocalStorage

Ez a hook lehetővé teszi az adatok egyszerű tárolását és lekérését a helyi tárhelyről (local storage).

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;

Használat:

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

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

  return (
    

Szia, {name}!

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

Példa: useFetch

Ez a hook egységbe zárja az adatok API-ból való lekérésének logikáját.

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 hiba! státusz: ${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;

Használat:

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

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

  if (loading) return 

Betöltés...

; if (error) return

Hiba: {error.message}

; return (

Cím: {data.title}

Befejezve: {data.completed ? 'Igen' : 'Nem'}

); } export default MyComponent;

Bevált Gyakorlatok Egyedi Hookokhoz

Annak érdekében, hogy az egyedi hookjai hatékonyak és karbantarthatók legyenek, kövesse ezeket a bevált gyakorlatokat:

Elkerülendő Gyakori Hibák

Haladó Minták

Egyedi Hookok Komponálása

Az egyedi hookok egymással kombinálhatók bonyolultabb logika létrehozásához. Például egy useLocalStorage hookot egy useFetch hookkal kombinálva automatikusan a helyi tárhelyre mentheti a lekért adatokat.

Logika Megosztása Hookok Között

Ha több egyedi hook közös logikát használ, akkor ezt a logikát ki lehet vonni egy külön segédfüggvénybe, és mindkét hookban újra fel lehet használni.

Context Használata Egyedi Hookokkal

Az egyedi hookok a React Context-tel együtt használhatók a globális állapot eléréséhez és frissítéséhez. Ez lehetővé teszi olyan újrafelhasználható komponensek létrehozását, amelyek ismerik és kölcsönhatásba léphetnek az alkalmazás globális állapotával.

Valós Példák

Íme néhány példa arra, hogyan használhatók az egyedi hookok valós alkalmazásokban:

Példa: useGeolocation hook kultúrák közötti alkalmazásokhoz, mint például térképészeti vagy kézbesítési szolgáltatások

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: 'A helymeghatározást ez a böngésző nem támogatja.',
      });
      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;

Összegzés

Az egyedi hookok egy hatékony eszköz a tisztább, újrafelhasználhatóbb és karbantarthatóbb React kód írásához. A bonyolult logika egyedi hookokba zárásával egyszerűsítheti a komponenseit, csökkentheti a kódduplikációt és javíthatja az alkalmazásai általános szerkezetét. Használja ki az egyedi hookokat, és fedezze fel a bennük rejlő potenciált, hogy robusztusabb és skálázhatóbb React alkalmazásokat építsen.

Kezdje azzal, hogy azonosítja azokat a területeket a meglévő kódbázisában, ahol a logika ismétlődik több komponensben. Ezután alakítsa át ezt a logikát egyedi hookokká. Idővel egy olyan újrafelhasználható hook-könyvtárat fog felépíteni, amely felgyorsítja a fejlesztési folyamatot és javítja a kód minőségét.

Ne felejtse el követni a bevált gyakorlatokat, elkerülni a gyakori buktatókat, és felfedezni a haladó mintákat, hogy a legtöbbet hozza ki az egyedi hookokból. Gyakorlással és tapasztalattal az egyedi hookok mesterévé és hatékonyabb React fejlesztővé válhat.