JavaScript w JSX a nawiasy klamrowe
JSX pozwala na pisanie kodu podobnego do HTML-a wewnątrz pliku javascriptowego, umożliwiając trzymanie logiki renderowania i treści jednym miejscu. Czasem jednak zachodzi potrzeba, by w kodzie znaczników dodać nieco logiki javascriptowej lub odnieść się do dynamicznej własności. W takiej sytuacji możemy użyć nawiasów klamrowych, otwierając tym samym okno do świata JavaScriptu.
W tej sekcji dowiesz się
- Jak przekazywać tekst w cudzysłowie
- Jak odwoływać się do zmiennej javascriptowej w JSX za pomocą nawiasów klamrowych
- Jak wywołać funkcję javascriptową w JSX za pomocą nawiasów klamrowych
- Jak używać obiektów javascriptowych w JSX za pomocą nawiasów klamrowych
Przekazywanie tekstu w cudzysłowie
Kiedy chcemy przekazać do komponentu atrybut tekstowy, umieszczamy wartość w pojedynczym lub podwójnym cudzysłowie:
export default function Avatar() { return ( <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> ); }
W powyższym kodzie wartości "https://i.imgur.com/7vQD0fPs.jpg"
oraz "Gregorio Y. Zara"
są przekazywane jako tekst.
Lecz co jeśli wartości dla src
lub alt
mają być dynamiczne? Możemy w takiej sytuacji użyć wartości z JavaScriptu, zastępując parę "
i "
nawiasami klamrowymi {
i }
:
export default function Avatar() { const avatar = 'https://i.imgur.com/7vQD0fPs.jpg'; const description = 'Gregorio Y. Zara'; return ( <img className="avatar" src={avatar} alt={description} /> ); }
Zwróć uwagę na różnicę pomiędzy właściwością className="avatar"
, która określa użycie klasy CSS-owej o nazwie "avatar"
służącej do zaokrąglenia obrazka, a src={avatar}
, która przekazuje wartość zmiennej javascriptowej o nazwie avatar
. Dzieje się tak, ponieważ nawiasy klamrowe pozwalają korzystać z JavaScriptu w samym kodzie znaczników!
Używanie nawiasów klamrowych: okno na świat JavaScriptu
Składnia JSX to jedynie inny sposób zapisu kodu javascriptowego. Oznacza to, że możemy z powodzeniem używać w niej samego JavaScriptu, pod warunkiem, że otoczymy go nawiasami klamrowymi { }
. W poniższym przykładzie najpierw deklarujemy nazwę naukowca, name
, a następnie osadzamy ją w nawiasach klamrowych wewnątrz znacznika <h1>
:
export default function TodoList() { const name = 'Gregorio Y. Zara'; return ( <h1>{name} - lista zadań</h1> ); }
Spróbuj zmienić wartość zmiennej name
z 'Gregorio Y. Zara'
na 'Hedy Lamarr'
. Widzisz, jak zmienia się tytuł listy zadań?
Pomiędzy nawiasami klamrowymi można umieszczać dowolne wyrażenie z języka JavaScript, nawet wywołania funkcji, jak np. formatDate()
:
const today = new Date(); function formatDate(date) { return new Intl.DateTimeFormat( 'en-US', { weekday: 'long' } ).format(date); } export default function TodoList() { return ( <h1>Lista zadań na dzień {formatDate(today)}</h1> ); }
Gdzie używać nawiasów klamrowych
W składni JSX można używać nawiasów klamrowych na dwa sposoby:
- Jako treść bezpośrednio wewnątrz znacznika JSX-owego:
<h1>{name} - lista zadań</h1>
działa, ale<{tag}>Gregorio Y. Zara - lista zadań</{tag}>
już nie. - Jako atrybuty, zaraz po znaku
=
:src={avatar}
przekaże wartość zmiennejavatar
, alesrc="{avatar}"
już przekaże tekst{avatar}
.
Używanie “podwójnych klamerek”: CSS i inne obiekty w JSX
Poza tekstem, liczbami i innymi wyrażeniami javascriptowymi, w JSX można przekazywać także obiekty. W JavaScripcie obiekty same w sobie mają zapis używający klamer, np. { name: "Hedy Lamarr", inventions: 5 }
. Z tego powodu, aby przekazać obiekt w JSX-ie, musisz otoczyć go kolejną parą nawiasów klamrowych: person={{ name: "Hedy Lamarr", inventions: 5 }}
.
Możesz spotkać się z tym zapisem przy okazji stylów CSS użytych bezpośrednio w kodzie JSX. React nie wymaga pisania styli w kodzie (dla większości przypadków wystarczą zwykłe klasy CSS-owe), ale jeśli potrzebujesz przekazać style w kodzie, przekaż obiekt do atrybutu style
:
export default function TodoList() { return ( <ul style={{ backgroundColor: 'black', color: 'pink' }}> <li>Usprawnić wideotelefon</li> <li>Przygotować wykłady o aeronautyce</li> <li>Opracować silnik napędzany alkoholem</li> </ul> ); }
Spróbuj zmienić wartości backgroundColor
i color
.
Aby obiekt javascriptowy w klamrach stał się jeszcze bardziej widoczny, możesz zapisać to tak:
<ul style={
{
backgroundColor: 'black',
color: 'pink'
}
}>
Następnym razem, gdy zobaczysz w JSX-ie parę {{
i }}
, przypomnij sobie, że to nic więcej jak zwykły obiekt zapisany wewnątrz JSX-owych nawiasów klamrowych!
Zabawa z obiektami javascriptowymi i klamrami
Możesz przenieść kilka wyrażeń do jednego obiektu, a następnie odwołać się do nich w JSX-ie wewnątrz nawiasów klamrowych:
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person.name} - lista zadań</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Usprawnić wideotelefon</li> <li>Przygotować wykłady o aeronautyce</li> <li>Opracować silnik napędzany alkoholem</li> </ul> </div> ); }
W tym przykładzie obiekt person
zawiera tekst w polu name
oraz zagnieżdżony obiekt motywu theme
:
const person = {
name: 'Gregorio Y. Zara',
theme: {
backgroundColor: 'black',
color: 'pink'
}
};
Komponent może używać tych wartości z obiektu person
w następujący sposób:
<div style={person.theme}>
<h1>{person.name} - lista zadań</h1>
JSX jako język szablonów jest bardzo minimalistyczny, dlatego pozwala na swobodną organizację danych i logiki za pomocą kodu JavaScript.
Powtórka
Teraz wiesz już niemal wszystko na temat składni JSX:
- Atrybuty JSX-owe zapisane w cudzysłowie są przekazywane jako tekst.
- Nawiasy klamrowe pozwalają dodać logikę i zmienne javascriptowe do kodu znaczników.
- Można je stosować w treści znacznika JSX-owego lub bezpośrednio po
=
w atrybutach. {{
i}}
to nie specjalna składnia - to obiekt javascriptowy opatulony w nawiasy klamrowe z JSX-a.
Wyzwanie 1 z 3: Napraw błąd
Poniższy kod rzuca błędem o treści Objects are not valid as a React child
(pol. Obiekty nie są prawidłowymi potomkami w Reakcie.):
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person} - lista zadań</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Usprawnić wideotelefon</li> <li>Przygotować wykłady o aeronautyce</li> <li>Opracować silnik napędzany alkoholem</li> </ul> </div> ); }
Potrafisz znaleźć problem z tym kodem?