美文网首页
React——JSX

React——JSX

作者: 机智小铛铛i | 来源:发表于2018-05-24 09:54 被阅读18次

    “在 JavaScript 写的标签的”语法叫 JSX

    JSX原理

    每个 DOM 元素的结构都可以用 JavaScript 的对象来表示。一个 DOM 元素包含的信息其实只有三个:标签名,属性,子元素。

    <div class='box' id='content'>
      <div class='title'>Hello</div>
      <button>Click</button>
    </div>
    

    上边的这段HTML所有信息我们都可以用合法的js对象来表示

    {
      tag: 'div',
      attrs: { className: 'box', id: 'content'},
      children: [
        {
          tag: 'div',
          arrts: { className: 'title' },
          children: ['Hello']
        },
        {
          tag: 'button',
          attrs: null,
          children: ['Click']
        }
      ]
    }
    

    React.js 把 JavaScript 的语法进行了拓展,让 JavaScript 语言能够支持这种直接在 JavaScript 代码里面编写类似 HTML 标签结构的语法。编译的过程会把类似 HTML 的 JSX 结构转换成 JavaScript 的对象结构。
    例如:

    class Header extends Component{
        render(){
            return(
                <div>
                    <h1 className='title'>React 小书</h1>
                </div>
            )
        }
    }
    

    经过编译后会变成:

    class Header extends Component {
      render () {
        return (
         React.createElement(
            "div",
            null,
            React.createElement(
              "h1",
              { className: 'title' },
              "React 小书"
            )
          )
        )
      }
    }
    

    React.createElement 会构建一个 JavaScript 对象来描述你 HTML 结构的信息,包括标签名、属性、还有子元素等。这样的代码就是合法的 JavaScript 代码了。所以使用 React 和 JSX 的时候一定要经过编译的过程。
    所谓的 JSX 其实就是 JavaScript 对象。

    ReactDOM.render(
        <Header />,
        document.getElementById('root')
    )
    

    ReactDOM.render 功能就是把组件渲染并且构造 DOM 树,然后插入到页面上某个特定的元素上(在这里是 id 为 root 的 div 元素)。

    转换过程
    为什么不直接从 JSX 直接渲染构造 DOM 结构,而是要经过中间这么一层呢?

    第一个原因是,当我们拿到一个表示 UI 的结构和信息的对象以后,不一定会把元素渲染到浏览器的普通页面上,我们有可能把这个结构渲染到 canvas 上,或者是手机 App 上。所以这也是为什么会要把 react-dom 单独抽离出来的原因,可以想象有一个叫 react-canvas 可以帮我们把 UI 渲染到 canvas 上,或者是有一个叫 react-app 可以帮我们把它转换成原生的 App(实际上这玩意叫 ReactNative)。

    第二个原因是,有了这样一个对象。当数据变化,需要更新组件的时候,就可以用比较快的算法操作这个 JavaScript 对象,而不用直接操作页面上的 DOM,这样可以尽量少的减少浏览器重排,极大地优化性能。

    总结

    1. JSX 是 JavaScript 语言的一种语法扩展,长得像 HTML,但并不是 HTML。
    2. React.js 可以用 JSX 来描述你的组件长什么样的。
    3. JSX 在编译的时候会变成相应的 JavaScript 对象描述。
    4. react-dom 负责把这个用来描述 UI 信息的 JavaScript 对象变成 DOM 元素,并且渲染到页面上。

    相关文章

      网友评论

          本文标题:React——JSX

          本文链接:https://www.haomeiwen.com/subject/dytdjftx.html