React中的JSX

134 阅读2分钟

JSX 是什么

JavaScript xml,JavaScript的语法扩展,将html写在JavaScript中就是JSX。官方定义为类XML语法的ECMAScript扩展。在React中JSX可以看成是React.createElement(component,props,...children)函数的语法糖,最终会被编译为React.createElement()函数调用,并返回一个被称为 “React元素”的普通JavaScript对象。

如何使用一个对象描述DOM结构(createElement对比jsx)

<!-- DOM对象 -->
<div id="appRoot" class="App">
  <h1 class="title">欢迎来到jsx</h1>
  <p>React 是一个帮助你构建页面的UI库</p>
</div>
//目标: 将DOM转换成一个普通的js对象
{
  selection: 'div',
  attrs: {
    id: 'appRoot',
    className: 'App'
  },
  children:[
    {
      selection: 'h1',
      attrs: {
        className: 'title'
      },
      children:[{
        text: '欢迎来到jsx'
      }]
    }
  ]
}
// 使用createElement 函数
React.createElement(
    'div',
    {
      className: 'App',
      id: 'appRoot',
    },
    React.createElement(
      'h1',
      {
        className: 'title',
      },
      '欢迎来到jsx'
    ),
    React.createElement(
      'p',
      null,
      'React 是一个帮助你构建页面的UI库'
    )
  )
// 使用jsx语法
class App extends React.Component {
  render() {
    return (
      <div id="appRoot" class="App">
        <h1 class="title">欢迎来到jsx</h1>
        <p>React 是一个帮助你构建页面的UI库</p>
      </div>
    );
  }
}
  • 我们可以看到,使用React.createElement 会逐层嵌套,对开发来说难以理解维护,而使用jsx语法糖则像写JavaScript一样描述DOM结构(虽然看上去像html,但jsx更偏向于JavaScript,可以看成更加强大的js)

React的jsx对比Vue的template模板

<template>
  <div>
    <span>{{ title }}</span>
    <ul>
      <li v-for="item in list" :key="item">{{ item }}</li>
    </ul>
    <span v-if="isShow">展示</span>
  </div>
</template>
<script>
export default {
  data() {
    return {
      title: "vue",
      list: ["a", "b", "c", "d"],
      isShow: false,
    };
  },
};
</script>
import React, { Component } from "react";
export default class myTest extends Component {
  state = {
    title: "React",
    list: ["a", "b", "c", "d"],
    isShow: false,
  };
  render() {
    const { title, list, isShow } = this.state;
    return (
      <div>
        <span>{title}</span>
        <ul>
          {list.map((item) => {
            return <li key={item}>{item}</li>;
          })}
        </ul>
        {isShow && <span>展示</span>}
      </div>
    );
  }
}
  • 1. 我们可以看到 vue 将视图放在 template 模版内,数据和逻辑则放在 script 标签内。而 React 则将整个视图与逻辑共同存放在称之为“组件”的松散耦合单元,没有人为的将其分离。一个类或者一个函数就是一个组件
  • 2. 在 vue 中可以使用各种指令(例如 v-if,v-for 等),而 React 则是完全的 JavaScript 表达式。React 只是提供一个平台,所有的实现都需要我们通过 js 去实现

JSX 规范(常见)

  • 1. 只能有一个根标签
  • 2. 标签必须闭合
  • 3. 样式类名不要使用 class,而是 className(避免与 es6 中的 class 类定义冲突 s)
  • 4. 内联样式的 style:样式名以驼峰命名法表示, 如 font-size 需写成 fontSize。默认像素单位是 px
  • 5. 标签中混入 js 表达式时使用{}
  • 6. 在 react 中定义虚拟 DOM 时,不要写引号
  • 7. 标签首字母若是小写开头,则将标签转为 html 中同名的元素
  • 8. 标签首字母若是大写开头,react 就去渲染对应的组件
  • 9. 事件名用驼峰命名法,如 onclick 写为 onClick