Overview
TypeScript 2.6 added support for JSX fragments. Within .tsx
files, you can now use the new <>...</>
syntax to create a fragment.
Motivation Behind JSX Fragments
In React, it’s a common pattern to return multiple elements from a component. For instance, let’s say we want to render multiple list items within the following component:
|
|
However, in our ListItems
component, we cannot simply return multiple adjacent JSX elements like this:
|
|
Adjacent JSX elements must be wrapped in an enclosing element, so we could add a wrapping div
element:
|
|
Unfortunately, adding such a wrapper breaks the structure of our list. Our ListItems
component currently renders the following DOM elements:
|
|
Note that the <div>
doesn’t belong in there. We can get rid of it by using the JSX fragment syntax instead:
|
|
A fragment lets us group multiple JSX elements without adding an extra wrapper node. Now, our List
component renders the expected markup:
|
|
Alternatively, we could’ve explicitly written React.Fragment
instead of using the new JSX syntax:
|
|
The two versions of our ListItems
component are equivalent and render exactly the same output (given that we compile our JSX for use with React).
Compiling JSX Fragments with TypeScript
Here’s our ListItems
component with the new JSX syntax again:
|
|
If we compile the .tsx
file with --jsx react
(and --target es2015
), the following JavaScript is emitted:
|
|
The compiler replaces the short fragment syntax by a call to the React.createElement()
method and passes it React.Fragment
as the first argument.
If we compiled our ListItems
component with --jsx preserve
(and --target es2015
) instead, our JSX would be emitted unchanged, set aside { 留出 } whitespace:
|
|