Szukaj…


Uwagi

JSX jest krokiem preprocesora, który dodaje składnię XML do JavaScript. Z pewnością możesz używać React bez JSX, ale JSX sprawia, że React jest o wiele bardziej elegancki.

Podobnie jak XML, tagi JSX mają nazwę, atrybuty i elementy podrzędne. Jeśli wartość atrybutu jest ujęta w cudzysłów, jest to ciąg znaków. W przeciwnym razie zawiń wartość w nawiasy klamrowe, a wartość jest dołączonym wyrażeniem JavaScript.

Zasadniczo JSX zapewnia tylko cukier syntaktyczny dla funkcji React.createElement(component, props, ...children) .

Tak więc następujący kod JSX:

class HelloMessage extends React.Component {
  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

ReactDOM.render(<HelloMessage name="Kalo" />, mountNode);

Kompiluje do następującego kodu JavaScript:

class HelloMessage extends React.Component {
  render() {
    return React.createElement(
      "div",
      null,
      "Hello ",
      this.props.name
    );
  }
}

ReactDOM.render(React.createElement(HelloMessage, { name: "Kalo" }), mountNode);

Podsumowując, zauważ, że następujący wiersz w JSX nie jest ciągiem ani HTML :

const element = <h1>Hello, world!</h1>;

Nazywa się JSX i jest rozszerzeniem składni JavaScript . JSX może przypominać język szablonów, ale ma pełną moc JavaScript.

Zespół React mówi w swoich dokumentach, że zaleca używanie go do opisania, jak powinien wyglądać interfejs użytkownika.

Rekwizyty w JSX

Istnieje kilka różnych sposobów określania rekwizytów w JSX.

Wyrażenia JavaScript

Możesz przekazać dowolne wyrażenie JavaScript jako rekwizyt, otaczając je {} . Na przykład w tym JSX:

<MyComponent count={1 + 2 + 3 + 4} />

Wewnątrz MyComponent wartość props.count będzie wynosić 10 , ponieważ wyrażenie 1 + 2 + 3 + 4 jest oceniane.

Jeśli instrukcje i pętle nie są wyrażeniami w JavaScript, więc nie można ich używać bezpośrednio w JSX.


Literały smyczkowe

Oczywiście możesz również podać dowolny string literal jako prop . Te dwa wyrażenia JSX są równoważne:

<MyComponent message="hello world" />

<MyComponent message={'hello world'} />

Gdy przekazujesz literał ciąg, jego wartość nie ma kodu HTML. Zatem te dwa wyrażenia JSX są równoważne:

<MyComponent message="&lt;3" />

<MyComponent message={'<3'} />

To zachowanie zwykle nie jest istotne. Wspomniano tu tylko o kompletności.


Wartość domyślna rekwizytów

Jeśli nie podasz żadnej wartości dla rekwizytu, domyślnie będzie to true . Te dwa wyrażenia JSX są równoważne:

<MyTextBox autocomplete />

<MyTextBox autocomplete={true} />

Jednak zespół React mówi w swoich dokumentach, że stosowanie tego podejścia nie jest zalecane , ponieważ można go pomylić z obiektem ES6 skróconym {foo} który jest skrótem od {foo: foo} zamiast {foo: true} . Mówią, że to zachowanie jest tylko po to, aby pasowało do zachowania HTML.


Rozłóż atrybuty

Jeśli masz już rekwizyty jako obiekt i chcesz przekazać je w JSX, możesz użyć ... jako operatora rozkładania, aby przekazać cały obiekt rekwizytów. Te dwa elementy są równoważne:

function Case1() {
  return <Greeting firstName="Kaloyab" lastName="Kosev" />;
}

function Case2() {
  const person = {firstName: 'Kaloyan', lastName: 'Kosev'};
  return <Greeting {...person} />;
}

Dzieci w JSX

W wyrażeniach JSX, które zawierają zarówno znacznik otwierający, jak i zamykający, zawartość między tymi znacznikami jest przekazywana jako specjalna prop: props.children . Istnieje kilka różnych sposobów przekazywania dzieci:

Literały smyczkowe

Możesz umieścić ciąg między tagami otwierającymi i zamykającymi, a props.children będą właśnie tym ciągiem. Jest to przydatne w przypadku wielu wbudowanych elementów HTML. Na przykład:

<MyComponent>
    <h1>Hello world!</h1>
</MyComponent>

Jest to poprawne JSX, a props.children w MyComponent będzie po prostu <h1>Hello world!</h1> .

Zauważ, że HTML jest nieskalowany , więc ogólnie możesz pisać JSX tak, jak piszesz HTML.

Należy pamiętać, że w tym przypadku JSX:

  • usuwa białe znaki na początku i na końcu linii;
  • usuwa puste linie;
  • nowe linie przylegające do znaczników są usuwane;
  • nowe wiersze występujące w środku literałów łańcuchowych są skondensowane w jednym miejscu.

JSX Children

Jako elementy potomne możesz podać więcej elementów JSX. Jest to przydatne do wyświetlania zagnieżdżonych komponentów:

<MyContainer>
  <MyFirstComponent />
  <MySecondComponent />
</MyContainer>

Możesz mieszać ze sobą różne typy dzieci, dzięki czemu możesz używać literałów łańcuchowych razem z dziećmi JSX . Jest to kolejny sposób, w jaki JSX jest podobny do HTML, więc jest to zarówno poprawny JSX, jak i prawidłowy HTML:

<div>
  <h2>Here is a list</h2>
  <ul>
    <li>Item 1</li>
    <li>Item 2</li>
  </ul>
</div>

Zauważ, że składnik React nie może zwrócić wielu elementów React, ale jedno wyrażenie JSX może mieć wiele elementów potomnych . Jeśli więc chcesz, aby komponent renderował wiele rzeczy, możesz zawinąć je w div jak w powyższym przykładzie.


Wyrażenia JavaScript

Możesz przekazać każde wyrażenie JavaScript jako dziecko, umieszczając je w {} . Na przykład te wyrażenia są równoważne:

<MyComponent>foo</MyComponent>

<MyComponent>{'foo'}</MyComponent>

Jest to często przydatne do renderowania listy wyrażeń JSX o dowolnej długości. Na przykład renderuje listę HTML:

const Item = ({ message }) => (
  <li>{ message }</li>
);

const TodoList = () => {
  const todos = ['finish doc', 'submit review', 'wait stackoverflow review'];
  return (
    <ul>
      { todos.map(message => (<Item key={message} message={message} />)) }
    </ul>
  );
};

Pamiętaj, że wyrażenia JavaScript mogą być mieszane z innymi typami dzieci.


Funkcje jak dzieci

Zwykle wyrażenia JavaScript wstawione do JSX będą traktowane jako ciąg znaków, element React lub lista tych rzeczy. Jednak props.children działa tak jak każdy inny rekwizyt, ponieważ może przekazywać dowolne dane, a nie tylko te, które React wie, jak renderować. Na przykład, jeśli masz niestandardowy komponent, możesz go oddzwonić jako props.children :

const ListOfTenThings = () => (
  <Repeat numTimes={10}>
    {(index) => <div key={index}>This is item {index} in the list</div>}
  </Repeat>
);

// Calls the children callback numTimes to produce a repeated component
const Repeat = ({ numTimes, children }) => {
  let items = [];
  for (let i = 0; i < numTimes; i++) {
    items.push(children(i));
  }
  return <div>{items}</div>;
};

Elementy podrzędne przekazane do niestandardowego komponentu mogą być dowolne, o ile ten komponent przekształca je w coś, co React może zrozumieć przed renderowaniem. To użycie nie jest powszechne, ale działa, jeśli chcesz rozszerzyć możliwości JSX.


Ignorowane wartości

Zauważ, że false , null , undefined i true są poprawnymi dziećmi. Ale po prostu nie renderują. Wszystkie te wyrażenia JSX będą renderowane w ten sam sposób:

<MyComponent />

<MyComponent></MyComponent>

<MyComponent>{false}</MyComponent>

<MyComponent>{null}</MyComponent>

<MyComponent>{true}</MyComponent>

Jest to niezwykle przydatne do warunkowego renderowania elementów React. Ten JSX renderuje tylko jeśli showHeader ma wartość true:

<div>
  {showHeader && <Header />}
  <Content />
</div>

Jednym ważnym zastrzeżeniem jest to, że niektóre wartości „fałszywe”, takie jak liczba 0 , są nadal renderowane przez React. Na przykład ten kod nie będzie zachowywać się tak, jak można się spodziewać, ponieważ 0 zostanie wydrukowane, gdy props.messages będzie pustą tablicą:

<div>
  {props.messages.length &&
    <MessageList messages={props.messages} />
  }
</div>

Jednym ze sposobów rozwiązania tego jest upewnienie się, że wyrażenie przed && jest zawsze logiczne:

<div>
  {props.messages.length > 0 &&
    <MessageList messages={props.messages} />
  }
</div>

Na koniec należy pamiętać, że jeśli chcesz, aby na wyjściu pojawiła się wartość typu false , true , null lub undefined , musisz najpierw przekonwertować ją na ciąg znaków:

<div>
  My JavaScript variable is {String(myVariable)}.
</div>


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow