petehunt
12 years ago
3 changed files with 103 additions and 0 deletions
@ -0,0 +1,95 @@ |
|||
--- |
|||
id: docs-jsx-is-not-html |
|||
title: JSX is not HTML |
|||
description: Differences between JSX and HTML. |
|||
layout: docs |
|||
prev: api.html |
|||
--- |
|||
|
|||
JSX looks like HTML but there are some important differences you may run into. |
|||
|
|||
## Whitespace removal |
|||
|
|||
JSX doesn't follow the same whitespace elimination rules as HTML. JSX removes all the whitespaces between two curly braces expressions. If you want to have a white space, a work-around is to add `{' '}`. |
|||
|
|||
```javascript |
|||
<div>{this.props.name} {' '} {this.props.surname}</div> |
|||
``` |
|||
|
|||
This behavior is still being debated. Follow [Issue #65](https://github.com/facebook/react/issues/65) to be updated on the situation. |
|||
|
|||
## HTML Entities |
|||
|
|||
You can insert HTML entities within literal text in JSX: |
|||
|
|||
```javascript |
|||
<div>First · Second</div> |
|||
``` |
|||
|
|||
If you want to display an HTML entity within a dynamic content, you will run into double escaping issues as React escapes all the strings you are displaying in order to prevent a wide range of XSS attacks by default. |
|||
|
|||
```javascript |
|||
// Bad: It displays "First · Second" |
|||
<div>{'First · Second'}</div> |
|||
``` |
|||
|
|||
There are various ways to work-around this issue. The easiest one is to write unicode character directly in Javascript. You've got to make sure that the file is saved as UTF-8 and that the propers UTF-8 directives are set so the browser will display it correctly. |
|||
|
|||
```javascript |
|||
<div>{'First · Second'}</div> |
|||
``` |
|||
|
|||
A safer alternative is to find the <a href="http://www.fileformat.info/info/unicode/char/b7/index.htm">unicode number corresponding to the entity</a> and use it inside of a Javascript string. |
|||
|
|||
```javascript |
|||
<div>{'First \u00b7 Second'}</div> |
|||
<div>{'First ' + String.fromCharCode(183) + ' Second'}</div> |
|||
``` |
|||
|
|||
You can use mixed arrays with strings and JSX elements. |
|||
|
|||
```javascript |
|||
<div>{['First ', <span>·</span>, ' Second']}</div> |
|||
``` |
|||
|
|||
In last resort, you always have the ability to insert raw HTML inside of the div. |
|||
|
|||
```javascript |
|||
<div dangerouslySetInnerHTML={{'{{'}}__html: 'First · Second'}} /> |
|||
``` |
|||
|
|||
## Comments |
|||
|
|||
JSX supports both single-line and multi-lines Javascript comments within a tag declaration: |
|||
|
|||
```javascript |
|||
<div // This is a single line comment: |
|||
/* |
|||
And a multiline |
|||
comment |
|||
*/ |
|||
/> |
|||
``` |
|||
|
|||
As of React 0.3, there is no good way to insert comments within the children section. [Issue #82](https://github.com/facebook/react/issues/82) is tracking progress to enable the following way to write comments: |
|||
|
|||
```javascript |
|||
// Note: The following is not implemented yet! |
|||
<div> |
|||
{/* This is a comment */} |
|||
</div> |
|||
``` |
|||
|
|||
## Custom HTML attributes |
|||
|
|||
If you pass properties to native HTML elements that do not exist in the HTML specification, React will not render them. If you want to use a custom attribute, you should prefix it with `data-`. |
|||
|
|||
```javascript |
|||
<div data-custom-attribute="foo" /> |
|||
``` |
|||
|
|||
[Web Accessibility](http://www.w3.org/WAI/intro/aria) attributes starting with `aria-` will be rendered properly. |
|||
|
|||
```javascript |
|||
<div aria-hidden={true} /> |
|||
``` |
Loading…
Reference in new issue