Introducing JSX
1 2 | <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> world <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> |
The above syntax is not a string or html, it is called JSX
, which is a javascript syntax extension. JSX creates react elements, which are used to describe the structure of the UI output.
JSX Syntax
The syntax for writing JSX is quite simple, as it is based on XML syntax:
1 2 | <span class="token operator"><</span> nodename <span class="token operator">></span> content <span class="token operator"><</span> <span class="token operator">/</span> nodename <span class="token operator">></span> |
where nodename is the name of the tag, it can be the available html tags or we define it.
JSX is not html, so ReactDOM will use camelCase
to declare properties instead of HTML attributes, eg class
of html will be className
of JSX:
1 2 | <span class="token operator"><</span> div className <span class="token operator">=</span> <span class="token string">"sidebar"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div |
Why JSX?
Using JSX in reactJS is optional. However, there are many reasons why we want to use it rather than just using js, for example:
- JSX has a syntax similar to XML, so it is easier to define and manage complex structured components.
- JSX is closer to JS, doesn’t change the semantics of JS
Embedding Expressions in JSX
We can embed any JS expression in JSX by using curly braces {}
. For example, we define a variable as name
and use it in JSX:
1 2 3 4 5 6 7 8 | <span class="token keyword">const</span> name <span class="token operator">=</span> <span class="token string">'Thanos'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> ReactDOM <span class="token punctuation">.</span> <span class="token function">render</span> <span class="token punctuation">(</span> element <span class="token punctuation">,</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">'root'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Or another example, embed JS function formatName(user)
in <h1>
tag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">function</span> <span class="token function">formatName</span> <span class="token punctuation">(</span> <span class="token parameter">user</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> user <span class="token punctuation">.</span> firstName <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> user <span class="token punctuation">.</span> lastName <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> user <span class="token operator">=</span> <span class="token punctuation">{</span> firstName <span class="token operator">:</span> <span class="token string">'Tha'</span> <span class="token punctuation">,</span> lastName <span class="token operator">:</span> <span class="token string">'Nos'</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token function">formatName</span> <span class="token punctuation">(</span> user <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> ReactDOM <span class="token punctuation">.</span> <span class="token function">render</span> <span class="token punctuation">(</span> element <span class="token punctuation">,</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">'root'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
JSX is an Expression Too
JSX itself is also an expression, which means we can use it in common logic like if else, loop, assign to variable, return value …
1 2 3 4 5 6 7 | <span class="token keyword">function</span> <span class="token function">getGreeting</span> <span class="token punctuation">(</span> <span class="token parameter">user</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> user <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token function">formatName</span> <span class="token punctuation">(</span> user <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> Stranger <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Specifying Attributes with JSX
We can use double quotes to specify string literals:
1 2 | <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> div tabIndex <span class="token operator">=</span> <span class="token string">"0"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token punctuation">;</span> |
Or curly braces to embed js expression in attribute:
1 2 | <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> img src <span class="token operator">=</span> <span class="token punctuation">{</span> user <span class="token punctuation">.</span> avatarUrl <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> img <span class="token operator">></span> <span class="token punctuation">;</span> |
Specifying Children with JSX
With a blank tag, we can close immediately with />
, as with XML:
1 2 | <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> img src <span class="token operator">=</span> <span class="token punctuation">{</span> user <span class="token punctuation">.</span> avatarUrl <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">;</span> |
To define a sub-tag for JSX, we can write the following:
1 2 3 4 5 6 7 | <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token operator"><</span> h2 <span class="token operator">></span> Good to see you here <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> h2 <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
JSX Prevents Injection Attacks
1 2 3 4 | <span class="token keyword">const</span> title <span class="token operator">=</span> response <span class="token punctuation">.</span> potentiallyMaliciousInput <span class="token punctuation">;</span> <span class="token comment">// This is safe:</span> <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> h1 <span class="token operator">></span> <span class="token punctuation">{</span> title <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> |
We can embed user input data into JSX without fear of injection related problems. Because by default the React DOM will escape values embedded in JSX, converting all to strings before they are rendered. This is to prevent the risk of an XSS (cross-site-scripting) attack.
Rendering Element
Rendering an Element into the DOM
Suppose we have 1 div tag:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> root <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> |
We call it the root DOM because everything inside it will be managed by the React DOM. Apps built with React only usually have only 1 root DOM node. If the case of adding React to an already existing app, we can have as many DOM root as we want.
To render the React element into a root DOM, we will use ReactDOM.render()
1 2 3 | <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> world <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token punctuation">;</span> ReactDOM <span class="token punctuation">.</span> <span class="token function">render</span> <span class="token punctuation">(</span> element <span class="token punctuation">,</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">'root'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Updating the Rendered Element
React elements are immutable. That is, we cannot change child elements or their properties after being initialized. Each react element is like a scene in the movie, it represents the UI at a certain time, so to update the UI there is only a way to add a new element, then pass ReactDOM.render()
Check out the example below:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">function</span> <span class="token function">tick</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> element <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> h1 <span class="token operator">></span> Hello <span class="token punctuation">,</span> world <span class="token operator">!</span> <span class="token operator"><</span> <span class="token operator">/</span> h1 <span class="token operator">></span> <span class="token operator"><</span> h2 <span class="token operator">></span> It is <span class="token punctuation">{</span> <span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">toLocaleTimeString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> h2 <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> ReactDOM <span class="token punctuation">.</span> <span class="token function">render</span> <span class="token punctuation">(</span> element <span class="token punctuation">,</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">'root'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">setInterval</span> <span class="token punctuation">(</span> tick <span class="token punctuation">,</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
ReactDOM will render a new element every 1 second.
React Only Updates What’s Necessary
ReactDOM will compare element (and its children) with the old element before it, and update only the necessary DOMs:
Although above we create a new element every time we call the tick
function, only the modified nodes will be updated by ReactDOM.
Summary
This article aims to introduce 2 of the main concepts of ReactJS: JSX and Rendering . Thank you for your time.
Source: