Vlastní hook
V lekci Efekty jste zařídili, aby oblíbené vydržely: useState s funkcí, která čte z localStorage, a efekt, který do něj ukládá. Teď má aplikace i poznámky a ty mají vydržet také. Mohli byste ty řádky zkopírovat do Poznamky.jsx a změnit klíč. React ale umí něco lepšího: napište je jednou, do vlastní funkce, a zavolejte ji z obou komponent.
Taková funkce je váš vlastní hook: funkce, jejíž název začíná na use a která volá jiné hooky. Tady je jeden malý. Drží true, nebo false, a vrací tuto hodnotu spolu s funkcí, která ji přepne:
import { useState } from "react";
export default function usePrepinac(vychoziHodnota) {
const [zapnuto, setZapnuto] = useState(vychoziHodnota);
function prepni() {
setZapnuto((zapnuto) => !zapnuto);
}
return [zapnuto, prepni];
}Komponenta ho volá stejně jako useState: const [ukazInfo, prepniInfo] = usePrepinac(false);. Hook vrací pole, takže každá komponenta dá oběma hodnotám vlastní názvy.
Tři věci, které je dobré vědět:
- Hook sdílí kód, ne stav. Každá komponenta, která volá
usePrepinac, dostane vlastnízapnuto, stejně jako každé voláníuseState. Když se jedno změní, ostatní ne. - Hook je obyčejný JavaScript bez JSX, takže jeho soubor má příponu
.js:usePrepinac.js. Importujete ho stejně jako komponentu:import usePrepinac from "./usePrepinac.js"; - Název hooku je
usea to, co hook dělá.usePrepinacmá proto český název, stejně jako ostatní vaše funkce. Hook postavený na něčem z prohlížeče si ale nechává jeho anglický název:useLocalStoragepracuje slocalStorageauseFetchz dalšího cvičení sfetch(). Pod stejnými názvy je najdete i v hotových knihovnách.
Váš hook bude useLocalStorage(klic, vychoziHodnota). Funguje jako useState, ale svou hodnotu si pamatuje v localStorage pod klíčem klic. Soubor useLocalStorage.js je připravený: zatím hook jen předává dál, co vrátí useState. Uvnitř potřebuje stejné dvě části jako oblíbené v lekci Efekty, s klic místo "oblibene" a vychoziHodnota místo []. Efekt teď používá i klic, takže jeho závislosti jsou [klic, hodnota].
Jak psát:
Pokyny
Dokončete hook v useLocalStorage.js: dejte useState funkci, která vrátí hodnotu uloženou pod klíčem klic, nebo vychoziHodnota, když nic uložené není, a přidejte efekt, který při každé změně uloží hodnota pod klíčem klic. Pak hook použijte v Program.jsx: importujte ho pomocí import useLocalStorage from "./useLocalStorage.js"; a místo useState([]) napište useLocalStorage("oblibene", []). Hvězdičky teď po kliknutí na Spustit zůstanou.
Stejný hook použijte v Poznamky.jsx pro poznámky, pod klíčem poznamky a s "" na začátku. Něco napište a klikněte na Spustit: poznámky tam pořád jsou, a hvězdičky také.