Writing Markup with JSX
Last updated
Last updated
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.
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
JavaScript
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.
Sidebar.js
React component
Form.js
React component
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. They’re often used together, but you can use them independently of each other. JSX is a syntax extension, while React is a JavaScript library.
Suppose that you have some (perfectly valid) HTML:
And you want to put it into your component:
If you copy and paste it as is, it will not work:
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 time, React’s on-screen error messages will help you find where the problem is. Give them a read if you get stuck!
To return multiple elements from a component, wrap them with a single parent tag.
For example, you can use a <div>
:
If you don’t want to add an extra <div>
to your markup, you can write <>
and </>
instead:
This empty tag is called a Fragment. Fragments let you group things without leaving any trace in the browser HTML tree.
JSX requires tags to be explicitly closed: self-closing tags like <img>
must become <img />
, and wrapping tags like <li>oranges
must be written as <li>oranges</li>
.
This is how Hedy Lamarr’s image and list items look closed:
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:
You can find all these attributes in the list of DOM component props. If you get one wrong, don’t worry—React will print a message with a possible correction to the browser console.
For historical reasons, aria-*
and data-*
attributes are written as in HTML with dashes.
Converting all these attributes in existing markup can be tedious! We recommend using a converter 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:
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 if you need to.
Error messages will often point you in the right direction to fixing your markup.