JSX is a Javascript HTML Like language that compiles to Javascript React API.
The first motivation of JSX is that reading and writing React elements, are easier.
It permits to:
Babel transpile (ie convert) JSX down to Javascript with React.createElement() calls. 1)
Example that you can run on the Babel online compiler playground
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
where: What is a React Element?
Pro: JSX:
const title = response.potentiallyMaliciousInput;
// This is safe:
const element = <h1>{title}</h1>;
Cons:
Multiple JSX lines should be wrap in parentheses to avoid automatic semicolon insertion
Because Jsx is an expression, you can:
const items = []
for (const [index, value] of elements.entries()) {
items.push(<input value={value} label={index} key={index} />)
}
return (
<div>
{items}
</div>
);
return (
<div>
{elements.map((value, index) => {
return <input value={value} label={index} key={index} />
})}
</div>
);
<div>
{Object.keys(elementsObject).map((key) => {
return <input key={key} type="text" name={key} value={elementsObject[key]}/>
})}
</div>
function getGreeting(user) {
if (user) {
return <h1>Hello, {formatName(user)}!</h1>;
}
return <h1>Hello, Stranger.</h1>;
}
Any valid JavaScript expression can be written inside curly braces in JSX
<ReactElementTagName>
Hello, world!
<ChildReactElement/>
{ console.log("Javascript code is between {}") }
</ReactElementTagName>;
where:
All Jsx attribute have a camelCase name in order to make a difference with html attribute:
You should either use:
but not both in the same attribute.
const element = <div tabIndex="0"></div>;
const element = <img src={user.avatarUrl}></img>;
You declare the type with the JSX.Element
let inputElements: JSX.Element;