Importování a exportování komponent
Krása komponent spočívá v jejich znovupoužitelnosti, můžete vytvořit komponentu, která je složená z dalších komponent. Občas dává smysl, že jakmile začnete přidávat více a více komponent, je dobré je rozdělit do více souborů. Toto vede ke snazšímu čtení kódu a větší znovupoužitelnosti jednotlivých komponent.
You will learn
- Co je to kořenová komponenta
- Jak importovat a exportovat komponenty
- Kdy použít výchozí a kdy jmenný import a export
- Jak importovat a exportovat vícero komponent z jednoho souboru
- Jak rozdělit komponenty do dalších souborů
Kořenová komponenta
V kapitole Vaše první komponenta, byly vytvořeny komponenty Profile
a Gallery
, která ji rendruje:
function Profile() { return ( <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> ); } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
V tomto příkladě jsou komponenty v kořenovém souboru jménem App.js
. V Create React App, je aplikace umístěna do src/App.js
. V závislosti na projektu může být kořenová komponenta v úplně jiném souboru. Pokud používáte framework s navigací založenou na souborovém systému, jako je třeba Next.js, bude vaše kořenová komponenta jiná pro každou stránku.
Export a import komponent
Představte si, že chcete na úvodní stránce zobrazit seznam učebnic. Nebo vložit seznam profilů někam jinam. Teď dává smysl přesunout Gallery
a Profile
mimo kořenový soubor. Tyto komponenty tak budou více modulární a znovupoužitelné i v dalších souborech. Komponenty můžete přesouvat pomocí těchto tří kroků:
- Vytvořte nový JS soubor pro komponenty.
- Exportujte vaši funkcionální komponentu z tohoto souboru (použitím buď výchozího nebo jmenného exportu).
- Importujte ji do souboru, kde se chystáte tuto komponentu použít (použitím korespondující techniky pro import výchozí nebo jmenný import).
Obě komponenty, Profile
a Gallery
, byly přesunuty mimo soubor App.js
do nového souboru Gallery.js
. Nyní můžete upravit App.js
aby importoval Gallery
z Gallery.js
:
import Gallery from './Gallery.js'; export default function App() { return ( <Gallery /> ); }
Všimněte si, jak je tento příklad rozdělen do dvou souborů:
Gallery.js
:- Definuje
Profile
komponentu, která je použita pouze uvnitř tohoto souboru a není exportována. - Exportuje
Gallery
komponentu jako výchozí export.
- Definuje
App.js
:- Importuje
Gallery
přes výchozí import zGallery.js
. - Exportuje kořenovou komponentu
App
jako výchozí export.
- Importuje
Deep Dive
Máme dva hlavní způsoby jak exportovat hodnoty v JavaScriptu, výchozí a jmenný export. Prozatím jsme v našich příkladech používali pouze výchozí exporty. V jednom souboru můžeme použít jeden nebo oba způsoby. Soubor může mít pouze jeden výchozí export, ale může mít několik jmenných exportů.
Druh exportu komponenty určuje jak ji musíte naimportovat. V případě, že se pokusíte importovat výchozí export jako jmenný, dostanete error! Tato tabulka vám pomůže s určením typu:
Syntaxe | Výraz pro export | Výraz pro import |
---|---|---|
Výchozí | export default function Button() {} | import Button from './Button.js'; |
Jmenný | export function Button() {} | import { Button } from './Button.js'; |
S výchozím importem můžete za klíčové slovo import
vložit jakékoliv jméno. Například můžete napsat import Banana from './Button.js'
a stále dostane výchozí export. Na rozdíl od jmenných importů, kde musí jméno odpovídat na obou stranách. Proto se jim říká jmenné importy!
Výchozí export se většinou používá pokud soubor exportuje pouze jednu komponentu. Naopak jmenný export se používá tam, kde se exportuje více komponent nebo hodnot z jednoho souboru. Nehledě jaký programátorský styl preferujete, dávejte komponentám a souborům které je obsahují smysluplné názvy. Bezejmenná komponenta, například export default () => {}
, je nežádoucí protože je těžké ji debugovat.
Exportování a importování vícero komponent ze stejného souboru
Co když chceme zobrazit pouze Profile
namísto galerie? Komponentu Profile
lze také vyexportovat. Pozor, soubor Gallery.js
již má výchozí export a nemůže mít dva výchozí exporty. Můžete vytvořit nový soubor s výchozím exportem, nebo můžete přidat jmenný export pro komponentu Profile
. Soubor může mít pouze jeden výchozí export, ale může mít vícero jmenných exportů!
Nejprve exportujte Profile
z Gallery.js
použitím jmenného exportu (bez klíčového slova default
):
export function Profile() {
// ...
}
Poté importujte Profile
z Gallery.js
do App.js
použitím jmenného importu (se složenými závorkami):
import { Profile } from './Gallery.js';
Nakonec vyrenderujte <Profile />
v komponentě App
:
export default function App() {
return <Profile />;
}
Nyní, Gallery.js
obsahuje dva exporty, výchozí Gallery
a jmenný Profile
. App.js
importuje oba dva. Zkuste upravit <Profile />
na <Gallery />
a zpět v následujícím příkladu:
import Gallery from './Gallery.js'; import { Profile } from './Gallery.js'; export default function App() { return ( <Profile /> ); }
Nyní používáte mix výchozích a jmenných exportů:
Gallery.js
:- Exportuje komponentu
Profile
jako jmenný exportProfile
. - Exportuje komponentu
Gallery
jako výchozí export.
- Exportuje komponentu
App.js
:- Importuje
Profile
jako jmenný importProfile
zGallery.js
. - Importuje
Gallery
jako výchozí import zGallery.js
. - Exportuje kořenovou komponentu
App
jako výchozí export.
- Importuje
Recap
Na této stránce jste se naučili:
- Co je to soubor s kořenovou komponentou
- Jak importovat a exportovat komponentu
- Kdy a jak použít výchozí a jmenný import a export
- Jak exportovat vícero komponent z jednoho souboru
Challenge 1 of 1: Další rozdělení komponent
Nyní, Gallery.js
exportuje obě komponenty Profile
a Gallery
což je trochu matoucí.
Přesuňte komponentu Profile
do vlastního souboru Profile.js
a změňte komponentu App
tak, aby rendrovala obě komponenty <Profile />
a <Gallery />
v tomto pořadí.
Můžete použít buďto výchozí nebo jmenný export pro Profile
, ale ujistěte se, že použijete korespondující syntaxi pro import v obou souborech App.js
a Gallery.js
! Můžete se podívat na tabulku z rozboru výše:
Syntaxe | Výraz pro export | Výraz pro import |
---|---|---|
Výchozí | export default function Button() {} | import Button from './Button.js'; |
Jmenný | export function Button() {} | import { Button } from './Button.js'; |
// Přesuň mne do Profile.js! export function Profile() { return ( <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" /> ); } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
Jakmile to zvládnete s jedním typem exportu, zkuste to i s druhým.