diff --git a/beta/src/pages/learn/writing-markup-with-jsx.md b/beta/src/pages/learn/writing-markup-with-jsx.md index c66348161..ef1b86d26 100644 --- a/beta/src/pages/learn/writing-markup-with-jsx.md +++ b/beta/src/pages/learn/writing-markup-with-jsx.md @@ -1,323 +1,322 @@ ---- -title: Writing Markup with JSX ---- - - - -JSX is a syntax extension for JavaScript that lets you write HTML-like markup inside a JavaScript file. Although there are other ways to write components, most React developers prefer the conciseness of JSX, and most codebases use it. - - - - - -* Why React mixes markup with rendering logic -* How JSX is different from HTML -* How to display information with JSX - - - -## JSX: Putting markup into JavaScript {/*jsx-putting-markup-into-javascript*/} - -The Web has been built on HTML, CSS, and JavaScript. For many years, web developers kept content in HTML, design in CSS, and logic in JavaScript—often in separate files! Content was marked up inside HTML while the page's logic lived separately in JavaScript: - -![HTML and JavaScript living in separate files](/images/docs/illustrations/i_html_js.svg) - -But as the Web became more interactive, logic increasingly determined content. JavaScript was in charge of the HTML! This is why **in React, rendering logic and markup live together in the same place—components!** - -![JavaScript functions sprinkled with markup](/images/docs/illustrations/i_jsx.svg) - -Keeping a button's rendering logic and markup together ensures that they stay in sync with each other on every edit. Conversely, details that are unrelated, such as the button's markup and a sidebar's markup, are isolated from each other, making it safer to change either of them on their own. - -Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called JSX to represent that markup. JSX looks a lot like HTML, but it is a bit stricter and can display dynamic information. The best way to understand this is to convert some HTML markup to JSX markup. - - - -[JSX and React are two separate things](/blog/2020/09/22/introducing-the-new-jsx-transform.html#whats-a-jsx-transform) you _can_ use independently of each other. - - - -## Converting HTML to JSX {/*converting-html-to-jsx*/} - -Suppose that you have some (perfectly valid) HTML: - -```html -

Hedy Lamarr's Todos

-Hedy Lamarr - -``` - -And you want to put it into your component: - -```js -export default function TodoList() { - return ( - // ??? - ) -} -``` - -If you copy and paste it as is, it will not work: - - - - -```js -export default function TodoList() { - return ( - // This doesn't quite work! -

Hedy Lamarr's Todos

- Hedy Lamarr - - ); -} -``` - -```css -img { height: 90px } -``` - -
- -This is because JSX is stricter and has a few more rules than HTML! If you read the error messages above, they'll guide you to fix the markup, or you can follow the guide below. - - - -Most of the times, React's on-screen error messages will help you find where the problem is. Give them a read if you get stuck! - - - -## The Rules of JSX {/*the-rules-of-jsx*/} - -### 1. Return a single root element {/*1-return-a-single-root-element*/} - -To return multiple elements from a component, **wrap them with a single parent tag**. - -For example, you can use a `
`: - -```js {1,11} -
-

Hedy Lamarr's Todos

- Hedy Lamarr - -
-``` - - -If you don't want to add an extra `
` to your markup, you can write `<>` and `` instead: - -```js {1,11} -<> -

Hedy Lamarr's Todos

- Hedy Lamarr - - -``` - -This empty tag is called a *[React fragment](TODO)*. React fragments let you group things without leaving any trace in the browser HTML tree. - - - -JSX looks like HTML, but under the hood it is transformed into plain JavaScript objects. You can't return two objects from a function without wrapping them into an array. This explains why you also can't return two JSX tags without wrapping them into another tag or a fragment. - - - -### 2. Close all the tags {/*2-close-all-the-tags*/} - -JSX requires tags to be explicitly closed: self-closing tags like `` must become ``, and wrapping tags like `
  • oranges` must be written as `
  • oranges
  • `. - -This is how Hedy Lamarr's image and list items look closed: - -```js {2-6,8-10} -<> - Hedy Lamarr - - -``` - -### 3. camelCase all most of the things! {/*3-camelcase-salls-most-of-the-things*/} - -JSX turns into JavaScript and attributes written in JSX become keys of JavaScript objects. In your own components, you will often want to read those attributes into variables. But JavaScript has limitations on variable names. For example, their names can't contain dashes or be reserved words like `class`. - -This is why, in React, many HTML and SVG attributes are written in camelCase. For example, instead of `stroke-width` you use `strokeWidth`. Since `class` is a reserved word, in React you write `className` instead, named after the [corresponding DOM property](https://developer.mozilla.org/en-US/docs/Web/API/Element/className): - -```js {4} -Hedy Lamarr -``` - -You can [find all these attributes in the React DOM Elements](TODO). If you get one wrong, don't worry—React will print a message with a possible correction to the [browser console](https://developer.mozilla.org/docs/Tools/Browser_Console). - - - -For historical reasons, [`aria-*`](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) and [`data-*`](https://developer.mozilla.org/docs/Learn/HTML/Howto/Use_data_attributes) attributes are written as in HTML with dashes. - - - -### Pro-tip: Use a JSX Converter {/*pro-tip-use-a-jsx-converter*/} - -Converting all these attributes in existing markup can be tedious! We recommend using a [converter](https://transform.tools/html-to-jsx) to translate your existing HTML and SVG to JSX. Converters are very useful in practice, but it's still worth understanding what is going on so that you can comfortably write JSX on your own. - -Here is your final result: - - - -```js -export default function TodoList() { - return ( - <> -

    Hedy Lamarr's Todos

    - Hedy Lamarr -
      -
    • Invent new traffic lights
    • -
    • Rehearse a movie scene
    • -
    • Improve the spectrum technology
    • -
    - - ); -} -``` - -```css -img { height: 90px } -``` - -
    - - - -Now you know why JSX exists and how to use it in components: - -* React components group rendering logic together with markup because they are related. -* JSX is similar to HTML, with a few differences. You can use a [converter](https://transform.tools/html-to-jsx) if you need to. -* Error messages will often point you in the right direction to fixing your markup. - - - - - - - -### Convert some HTML to JSX {/*convert-some-html-to-jsx*/} - -This HTML was pasted into a component, but it's not valid JSX. Fix it: - - - -```js -export default function Bio() { - return ( -
    -

    Welcome to my website!

    -
    -

    - You can find my thoughts here. -

    - And pictures of scientists! -

    - ); -} -``` - -```css -.intro { - background-image: linear-gradient(to left, violet, indigo, blue, green, yellow, orange, red); - background-clip: text; - color: transparent; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; -} - -.summary { - padding: 20px; - border: 10px solid gold; -} -``` - -
    - -Whether to do it by hand or using the converter is up to you! - - - - - -```js -export default function Bio() { - return ( -
    -
    -

    Welcome to my website!

    -
    -

    - You can find my thoughts here. -

    - And pictures of scientists! -

    -
    - ); -} -``` - -```css -.intro { - background-image: linear-gradient(to left, violet, indigo, blue, green, yellow, orange, red); - background-clip: text; - color: transparent; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; -} - -.summary { - padding: 20px; - border: 10px solid gold; -} -``` - -
    - -
    - +--- +title: Pisanie kodu w JSX +--- + + + +JSX to rozszerzenie składni JavaScriptu, które pozwala używać znaczników podobnych do tych w HTML-u wewnątrz pliku javascriptowego. Większość deweloperów korzysta z niego ze względu na zwięzłość, mimo że istnieją inne sposoby na tworzenie komponentów. + + + + + +* Dlaczego React miesza znaczniki z logiką renderowania +* Czym JSX różni się od HTML-u +* Jak wyświetlić informacje za pomocą JSX-a + + + +## JSX: Wrzucanie znaczników do JavaScriptu {/*jsx-putting-markup-into-javascript*/} + +Sieć WWW z grubsza została zbudowana przy pomocy HTML-u, CSS-a i JavaScriptu. Przez wiele lat deweloperzy trzymali treść w HTML-u, wygląd w CSS-ie i logikę w JavaScripcie - często każda z tych rzeczy była w osobnym pliku! Treść była opisywana znacznikami wewnątrz HTML-u, a logika strony była w osobnym skrypcie JavaScriptowym: + +![HTML i JavaScript trzymane w osobnych plikach](/images/docs/illustrations/i_html_js.svg) + +Jednak z czasem strony WWW stały się bardziej interaktywne, a logika częściej stanowiła o zawartości. JavaScript stał się odpowiedzialny za HTML! To dlatego **w Reakcie logika renderowania i znaczniki żyją w tym samym miejscu - w komponencie!** + +![Funkcje javascriptowe przeplatane kodem znaczników](/images/docs/illustrations/i_jsx.svg) + +Trzymanie logiki renderowania przycisku razem z jego kodem znaczników daje nam pewność, że będą zsynchronizowane przy każdej edycji. Z drugiej strony, detale, które nie są ze sobą powiązane, jak np. kody przycisku i paska bocznego, są od siebie odseparowane, dzięki czemu bezpieczniej jest modifykować każde z nich. + +Każdy komponent reactowy jest funkcją javascriptową, która może zwracać strukturę renderowaną przez Reacta do przeglądarki. Komponenty te używają rozszerzenia składni zwanego JSX, za pomocą którego określają strukturę kodu. JSX wygląda bardzo podobnie do HTML-u, jednak jest nieco bardziej restrykcyjny, a ponadto może wyświetlać dynamiczną zawartość. Najłatwiej będzie to zrozumieć, kiedy przepiszemy fragment kodu HTML-owego na JSX. + + + +[JSX i React to dwie różne rzeczy](/blog/2020/09/22/introducing-the-new-jsx-transform.html#whats-a-jsx-transform), których _można_ używać niezależnie. + + + +## Przekształcanie HTML-u w JSX {/*converting-html-to-jsx*/} + +Załóżmy, że mamy taki (całkowicie poprawny) kod HTML: + +```html +

    Lista zadań Hedy Lamarr

    +Hedy Lamarr +
      +
    • Wynaleźć nową sygnalizację świetlną +
    • Przećwiczyć scenę do filmu +
    • Usprawnić technologię rozpraszania widma +
    +``` + +I chcemy wrzucić go do poniższego komponentu: + +```js +export default function TodoList() { + return ( + // ??? + ) +} +``` + +Jeśli zwyczajnie skopiujesz kod taki, jaki jest, nie zadziała: + + + +```js +export default function TodoList() { + return ( + // Nie chce działać! +

    Lista zadań Hedy Lamarr

    + Hedy Lamarr +
      +
    • Wynaleźć nową sygnalizację świetlną +
    • Przećwiczyć scenę do filmu +
    • Usprawnić technologię rozpraszania widma +
    + ); +} +``` + +```css +img { height: 90px } +``` + +
    + +Dzieje się tak, ponieważ składnia JSX jest nieco bardziej restrykcyjna i ma więcej reguł niż HTML! Błędy, które pojawiają się przy powyższym kodzie, powinny naprowadzić cię na to, jak go naprawić. Jeśli nie, czytaj dalej. + + + +W większości przypadków błędy wyświetlane przez Reacta naprowadzą cię na źródło problemu. Jeśli coś nie działa, postępuj zgodnie z instrukcjami! + + + +## Zasady składni JSX {/*the-rules-of-jsx*/} + +### 1. Zwróć pojedynczy element główny {/*1-return-a-single-root-element*/} + +Aby komponent zwrócił kilka elementów, **musimy je opakować w pojedynczy komponent główny**. + +Możesz, na przykład, użyć znacznika `
    `: + +```js {1,11} +
    +

    Lista zadań Hedy Lamarr

    + Hedy Lamarr +
      + ... +
    +
    +``` + + +Jeśli nie chcesz wstawiać dodatkowego `
    ` do struktury, zamiast tego możesz użyć pary `<>` oraz ``: + +```js {1,11} +<> +

    Lista zadań Hedy Lamarr

    + Hedy Lamarr +
      + ... +
    + +``` + +Ten pusty znacznik nazywamy *[fragmentem reactowym](TODO)*. Fragmenty pozwalają grupować rzeczy bez zostawiania śladu w drzewie HTML przesłanym do przeglądarki. + + + +Składnia JSX wygląda jak HTML, ale pod spodem jest transformowana do zwykłych obiektów javascriptowych. Nie można przecież zwrócić w funkcji dwóch obiektów bez uprzedniego opakowania ich w tablicę. Dlatego właśnie nie można zwrócić dwóch znaczników JSX bez opakowywania ich w jeden główny znacznik lub fragment. + + + +### 2. Zamknij wszystkie znaczniki {/*2-close-all-the-tags*/} + +JSX wymaga, by wszystkie znaczniki były jawnie zamknięte: samozamykające się znaczniki jak `` musimy zapisać jako ``, a znaczniki opakowujące jak `
  • pomarańcze` musimy zapisać jako `
  • pomarańcze
  • `. + +Tak wyglądałoby zdjęcie Hedy Lamarr i jej lista zadań z domkniętymi znacznikami: + +```js {2-6,8-10} +<> + Hedy Lamarr +
      +
    • Wynaleźć nową sygnalizację świetlną
    • +
    • Przećwiczyć scenę do filmu
    • +
    • Usprawnić technologię rozpraszania widma
    • +
    + +``` + +### 3. Wszystko Większość rzeczy musi być zapisana camelCasem! {/*3-camelcase-salls-most-of-the-things*/} + +JSX przekształcany jest w JavaScript, a atrybuty zapisane w JSX-ie stają się kluczami obiektów javascriptowych. W swoich własnych komponentach zwykle będziemy chcieli odczytywać wartości tych atrybutów pod postacią zmiennych. Jednak JavaScript ma pewne ograniczenia co do nazw zmiennych. Na przykład, nazwy nie mogą zawierać myślników ani być słowami zarezerwowanymi, jak `class`. + +To dlatego w Reakcie wiele atrybutów HTML-owych i SVG zapisujemy camelCasem. Dla przykładu, zamiast pisać `stroke-width`, piszemy `strokeWidth`. Z uwagi na fakt, że `class` jest słowem zarezerwowanym, w Reakcie zapisujemy go jako `className`, idąc w ślady za nomenklaturą [odpowiadającej mu właściwości DOM](https://developer.mozilla.org/en-US/docs/Web/API/Element/className): + +```js {4} +Hedy Lamarr +``` + +[Wszystkie te atrybuty znajdziesz w elementach React DOM](TODO). Jeśli zdarzy ci się pomylić, nie martw się - React wyświetli w [konsoli przeglądarki](https://developer.mozilla.org/docs/Tools/Browser_Console) błąd z instrukcją, jak naprawić problem. + + + +Ze względów historycznych atrybuty [`aria-*`](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) oraz [`data-*`](https://developer.mozilla.org/docs/Learn/HTML/Howto/Use_data_attributes) piszemy tak, jak w HTML-u, czyli z myślnikami. + + + +### Wskazówka: Używaj konwertera JSX {/*pro-tip-use-a-jsx-converter*/} + +Konwertowanie wszystkich tych atrybutów w odpowiedni kod znaczników jest żmudne! Zalecamy korzystanie z [konwertera](https://transform.tools/html-to-jsx), który pomoże przekształcić istniejący kod HTML i SVG w JSX. Tego typu konwertery są pomocne w praktyce, jednak warto wiedzieć, co tak naprawdę dzieje się pod spodem, aby umieć pisać JSX samodzielnie. + +Oto nasz rezultat końcowy: + + + +```js +export default function TodoList() { + return ( + <> +

    Lista zadań Hedy Lamarr

    + Hedy Lamarr +
      +
    • Wynaleźć nową sygnalizację świetlną
    • +
    • Przećwiczyć scenę do filmu
    • +
    • Usprawnić technologię rozpraszania widma
    • +
    + + ); +} +``` + +```css +img { height: 90px } +``` + +
    + + + +Teraz już wiesz, po co istnieje składnia JSX i jak jej używać w komponentach: + +* Komponenty reactowe grupują w sobie logikę renderowania ze strukturą elementów, ponieważ obie rzeczy są ze sobą powiązane. +* JSX jest podobny do HTML-u, z kilkoma różnicami. Jeśli zajdzie potrzeba, możesz skorzystać z [konwertera](https://transform.tools/html-to-jsx). +* Błędy wyświetlane na ekranie czy w konsoli przeglądarki zwykle poprowadzą cię do rozwiązania problemów z kodem. + + + + + + + +### Przepisz kod HTML na JSX {/*convert-some-html-to-jsx*/} + +Pewien kod HTML został wklejony do komponentu, jednak nie jest zgodny ze składnią JSX. Napraw go: + + + +```js +export default function Bio() { + return ( +
    +

    Witaj na mojej stronie!

    +
    +

    + Wrzucam na nią swoje przemyślenia. +

    + I zdjęcia naukowców! +

    + ); +} +``` + +```css +.intro { + background-image: linear-gradient(to left, violet, indigo, blue, green, yellow, orange, red); + background-clip: text; + color: transparent; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.summary { + padding: 20px; + border: 10px solid gold; +} +``` + +
    + +Od ciebie zależy, czy poprawisz go ręcznie, czy przepuścisz przez konwerter! + + + + + +```js +export default function Bio() { + return ( +
    +
    +

    Witaj na mojej stronie!

    +
    +

    + Wrzucam na nią swoje przemyślenia. +

    + I zdjęcia of naukowców! +

    +
    + ); +} +``` + +```css +.intro { + background-image: linear-gradient(to left, violet, indigo, blue, green, yellow, orange, red); + background-clip: text; + color: transparent; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.summary { + padding: 20px; + border: 10px solid gold; +} +``` + +
    + +
    +
    \ No newline at end of file