I'm new to React and I'm trying to figure out the purpose/use of <MyComponent></MyComponent> vs <MyComponent />. I can't seem to find information on anything except self-closing tags.
I've created a basic tab scroller as a JSFiddle using the self-closing <MyComponent /> and subsequent props, and I'm wondering if there's a better way to write in React than what I've done.
class TabScroller extends React.Component {
render() {
return (
<div className="tabScroller">
<div className="NavList">
<TabNav handleClick={this.handleNavClick} />
<TabList
tabs={this.state.tabs}
activeTab={this.state.activeTab}
scrollPosition={this.state.scrollPosition}
handleClick={this.handleTabClick}
/>
</div>
<TabContent content={this.state.tabs[this.state.activeTab].content} />
</div>
);
}
}
// ========================================
ReactDOM.render(
<TabScroller />,
document.getElementById('root')
);
All tags must be closed, either with the self-closing format or with a corresponding closing tag ( </MyComponent> ). Note: Every React component can be self-closing: <div /> . <div></div> is also an equivalent.
js error "Expected corresponding JSX closing tag" occurs when we forget to close a tag in our JSX code. To solve the error use a self closing tag, e.g. <input /> and make sure the order of opening and closing tags is correct in your JSX code. Here is an example of how the error occurs: App.js. Copied!
The Services and Landscape routes are missing the closing tag. They can self-close, or have the closing tag added.
No. HTML 4. x doesn't have any concept of self closing tags.
In React's JSX, you only need to write <MyComponent></MyComponent>
when the component has child components, like this:
<MyComponent>
<Child />
<Child />
<Child />
</MyComponent>
If there is nothing between <MyComponent>
and </MyComponent>
, then you can write it either <MyComponent/>
or <MyComponent></MyComponent>
(but <MyComponent/>
is generally preferred). Details in Introducing JSX.
Just as a side note, you'd access those children in your component via the special props.children
property. More in JSX in Depth: Children in JSX.
Note that this is very much not like HTML or XHTML. It's its own (similar) thing with different rules. For instance, in HTML, <div/>
is exactly the same thing as <div>
: A start tag, for which you must eventually have an end tag. Not so JSX (or XHTML). The rules for HTML are that void elements (elements that never have markup content, such as br
or img
) can be written with or without /
before >
and they never get an ending tag, but non-void elements (like div
) must always have an ending tag (</div>
), they cannot be self-closing. In JSX (and XHTML), they can be.
The purpose of self-closing tags is simply the fact that it is more compact. This is especially useful when said component doesn't have any children that you typically wrap around a parent.
So usually for leaf components (i.e compoents that do not have any children), you use the self-closing syntax. Like: <Component />
. And even if it has props, you can do: <Component foo="bar" />
.
However, remember that children
is a prop, so you could technically do:
<Component children={<span>foo</span>} />
but I find it less readable and advise against it (read disclaimer below).
To summarize, these are equivalent:
<Component />
= <Component></Component>
<Component foo="bar" />
= <Component foo="bar"></Component>
<Component children={<span>foo</span>}></Component>
=
<Component><span>foo</span></Component>
You can use whichever approach you prefer. Though praxis is to use the short-hand version when there are no children.
Disclaimer: While defining childen
prop by its object key value will technically work, doing so is strongly discouraged as it disrupts the API as it is meant to be used. Use this version only if confident in what you are doing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With