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 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
  • Jak odkázat na JavaScriptovou proměnnou uvnitř JSX pomocí složených závorek
  • 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í řetězců 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 jsou "https://i.imgur.com/7vQD0fPs.jpg" a "Gregorio Y. Zara" předávány jako řetězce.

Co když chcete 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}
    />
  );
}

Všimněte si rozdílu mezi className="avatar", který specifikuje "avatar" CSS třídu, která dělá kulatý obrázek a src={avatar} která načítá hodnotu z JavaScriptové proměnné 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 znamená, že je možné použít JavaScript uvnitř složených závorek { }. V příkladu níže nejprve deklarujeme promenou pro jméno vědce name a poté vložíme tuto proměnou uvnitř složených závorek 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 změnil?

Jakákoliv JavaScriptová syntaxe bude fungovat ve složených závorkách, to zahrnuje i volání funkcí jako je 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:

  1. 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.
  2. Jako atribut ihned po = znaku: src={avatar} přečte avatar proměnnou, ale src="{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 je v JSX 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!

Pitfall

Inline style atributy se píší jako camelCase. Například, HTML <ul style="background-color: black"> bude zapsáno jako <ul style={{ backgroundColor: 'black' }}> ve vaší komponentě.

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, ale 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?