JavaScript v JSX se složenými závorkami
JSX vám umožňuje psát strukturu podobnou jako je HTML přímo uvnitř JavaScriptového souboru. Díky tomu je rendrovací logika a obsah na jednom místě. Může se stát, že budete potřebovat přidat JavaScriptovou logiku nebo odkázat na nějakou proměnnou uvnitř struktury. V tom případě, můžete využít složené závorky v JSX a dát tak prostor pro JavaScript.
You will learn
- Jak předat řetězec pomocí uvozovek
- How to reference a JavaScript variable inside JSX with curly braces
- Jak zavolat JavaScriptovou funkci uvnitř JSX pomocí složených závorek
- Jak použít JavaScriptový objekt uvnitř JSX pomocí složených závorek
Předávání stringů pomocí uvozovek
Když chcete předat řetězec jako argument v JSX, stačí jej dát do jednoduchých nebo dvojitých uvozovek:
export default function Avatar() { return ( <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> ); }
Zde byly "https://i.imgur.com/7vQD0fPs.jpg" a "Gregorio Y. Zara" předány jako řetězce.
Co když chceze dynamicky měnit src nebo alt? Můžete použít hodnotu z JavaScriptu zaměněním " a " za { a }:
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} /> ); }
Povšimnněte si toho rozdílu mezi className="avatar", který specifikuje "avatar" CSS třídu, která dělá kulatý obrázek, a src={avatar} která řze hodnotu z JavaScriptové proměnné zvané avatar. To se děje díky tomu, že složené závorky dovolují pracovat s JavaScriptem přímo ve struktuře!
Používání složených závorek: Okno do světa JavaScriptu
JSX je speciální způsob jak psát JavaScript. To znamneá, že je možné použít JavaScript uvnitř složených závorek { }. V příkladu níže nejprve dekladujeme promenou pro jméno vědce, name a poté vlotžíme tuto proměnou uvnitř složených záorek do <h1>:
export default function TodoList() { const name = 'Gregorio Y. Zara'; return ( <h1>{name}'s To Do List</h1> ); }
ZKuste změnit hodnotu name z 'Gregorio Y. Zara' na 'Hedy Lamarr'. Všimli jste si jak se nadpis seznamu zmněnil?
Jakákoliv JavaScriptová syntaxe bude fungovat ve složených závorkách, to zahrnuje i volání funkcí jako formatDate():
const today = new Date(); function formatDate(date) { return new Intl.DateTimeFormat( 'en-US', { weekday: 'long' } ).format(date); } export default function TodoList() { return ( <h1>To Do List for {formatDate(today)}</h1> ); }
Kde použít složené závorky
Jsou dva způsoby, jak použít složené závorky v JSX:
- Jako text přímo v JSX tagu: <h1>{name}'s To Do List</h1>funguje, ale<{tag}>Gregorio Y. Zara's To Do List</{tag}>nebude fungovat.
- Jako atribut ihned po =znaku:src={avatar}přečteavatarproměnnou, alesrc="{avatar}"bude předáno jako řetězec"{avatar}".
Používání “dvojitých složených závorek”: CSS a ostatní objekty v JSX
Krome řetězců, čísel a dalších JavaScriptových výrazů, můžete v JSX předávat i objekty. Objekty jsou také označené složenými závorkami, například { name: "Hedy Lamarr", inventions: 5 }. Proto v JSX je třeba obalit objekt dalším párem složených závorek: person={{ name: "Hedy Lamarr", inventions: 5 }}.
Můžete se s tím setkat v případě inline CSS stylů v JSX. React nevyžaduje použití inline stylů (CSS třídy fungují pro většinu případů dobře). V případě, že potřebujete inline styl, je třeba předat objekt style atributu:
export default function TodoList() { return ( <ul style={{ backgroundColor: 'black', color: 'pink' }}> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> ); }
Zkuste změnit hodnoty backgroundColor a color.
Můžete vidět JavaScriptový objekt uvnitř složených závorek v případě, že to napíšete takto:
<ul style={
  {
    backgroundColor: 'black',
    color: 'pink'
  }
}>Příště, až uvidíte {{ a }} v JSX budete vědět, že je jen objekt uvnitř JSX!
Více zábavy s objekty v JavaScriptu a složenými závorkami
Můžete přesunout několik výrazů do jednoho objektu a odkázat na něj v JSX uvnitř složených závorek:
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person.name}'s Todos</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> </div> ); }
V tomto příkladě je person JavaScriptový objekt obsahující řetězec name a theme objekt:
const person = {
  name: 'Gregorio Y. Zara',
  theme: {
    backgroundColor: 'black',
    color: 'pink'
  }
};Komponenta může použít hodnoty z objektu person následovně:
<div style={person.theme}>
  <h1>{person.name}'s Todos</h1>JSX není jen šablonovací jazyk, protože umožňuje kombinovat data a logiku s použitím JavaScriptu.
Recap
Nyní víte skoro všechno o JSX:
- JSX atributy uvnitř uvozovek jsou předány jako řetězce.
- Složené závorky umožňují použít JavaScriptovou logiku a proměnné uvnitř struktury.
- Fungují v JSX nebo ihned za =v atributech.
- {{a- }}není speciální syntaxe, je to pouze objekt obalený složenými závorkami z JSX.
Challenge 1 of 3: Oprava chyby 
Následující kód skončí touto chybovou hláškou: Objects are not valid as a React child:
const person = { name: 'Gregorio Y. Zara', theme: { backgroundColor: 'black', color: 'pink' } }; export default function TodoList() { return ( <div style={person.theme}> <h1>{person}'s Todos</h1> <img className="avatar" src="https://i.imgur.com/7vQD0fPs.jpg" alt="Gregorio Y. Zara" /> <ul> <li>Improve the videophone</li> <li>Prepare aeronautics lectures</li> <li>Work on the alcohol-fuelled engine</li> </ul> </div> ); }
Dokážete najít problém?