要明白JSX的原理,需要先明白如何用 JavaScript 对象来表现一个 DOM 元素的结构?
看下面的DOM结构
<div class='app' id='appRoot'> <h1 class='title'>hello React</h1> <p> React.js </p> </div>
上面这个 HTML 所有的信息我们都可以用 JavaScript 对象来表示:
{ tag: 'div', attrs: { className: 'app', id: 'appRoot'}, children: [ { tag: 'h1', attrs: { className: 'title' }, children: ['hello React'] }, { tag: 'p', attrs: null, children: ['React.js '] } ] }
但是用 JavaScript 写起来太长了,结构看起来又不清晰,用 HTML 的方式写起来就方便很多了。
于是 React.js 就把 JavaScript 的语法扩展了一下,让 JavaScript 语言能够支持这种直接在 JavaScript 代码里面编写类似 HTML 标签结构的语法,这样写起来就方便很多了。编译的过程会把类似 HTML 的 JSX 结构转换成 JavaScript 的对象结构。
下面代码:
import React from 'react' import ReactDOM from 'react-dom' class App extends React.Component { render () { return ( <div className='app' id='appRoot'> <h1 className='title'>hello React</h1> <p> React.js </p> </div> ) } } ReactDOM.render( <App />, document.getElementById('root') )
编译之后将得到这样的代码:
import React from 'react' import ReactDOM from 'react-dom' class App extends React.Component { render () { return ( React.createElement( "div", { className: 'app', id: 'appRoot' }, React.createElement( "h1", { className: 'title' }, "hello React的" ), React.createElement( "p", null, "React.js " ) ) ) } } ReactDOM.render( React.createElement(App), document.getElementById('root') )
React.createElement
会构建一个 JavaScript 对象来描述你 HTML 结构的信息,包括标签名、属性、还有子元素等, 语法为
React.createElement( type, [props], [...children] )
所谓的 JSX 其实就是 JavaScript 对象