JSX 的基本使用

2023-11-06

1、JSX 简介

        通过上一篇博客的 +1 个小应用,我们能体会到,和 Vue 相比代,用 React 写一个这么小的应用比较麻烦,而且代码比较混乱。接触过 Vue 的开发者应该知道,Vue 有两个构建版本,如果单独使用非完整版其实和上述用 React 实现 +1 的小应用相比并不会有多大优势,也就多一个视图自动刷新的便捷性。

        但是 Vue 非完整版可以配合 vue-loader,这使得开发人员可在 .vue 文件中写 <template><script><style>,这些内容最终会被 vue-loader 变成一个构造选项或组件,既可满足用户使用体积小,又能提高开发人员的效率。那 React 有什么类似 vue-loader 的加载器或插件,以提高开发人员的体验 ?— 那就是 JSX。

        JSX 是 JavaScript 的扩展。官方解释:「实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖」。它就是弥补 React 代码相对混乱的问题。

        React 提供了 JSX 来提高开发人员的体验,和 Vue 相似,开发人员只需要在 .js 文件中写一下 html 代码,剩下的就交给 jsx-loader,它会将这些开发人员写的条例相对清晰的代码编译成 React.createElement(...) 形式的代码。React 在早些年间会使用 jsx-loader 来完成转义,但是近几年它被 babel-loader 取代了,而 babel-loader 被 webpack 内置了,所以 React 的开发者不需要安装任何东西。那这个玩意怎么使用呢?

2、如何引入 babel

  • 通过 BootCND 引入 babel:

        引入 babel.min.js 后,需要在每次写 JavaScript 时把 <script>改成<script type="text/babel'">,babel 会自动将 babel 类型的代码进行转译(可以理解为翻译),下面我们结合上 babel 重新实现 +1 的小应用。

<div id="root"></div>
<script src="https://cdn.bootcss.com/react/16.10.2/umd/react.development.js"></script>
<script src="https://cdn.bootcss.com/react-dom/16.10.2/umd/react-dom.development.js"></script>
<script src="https://cdn.bootcss.com/babel-standalone/7.0.0-beta.3/babel.min.js"></script>
<script type="text/babel">    //babel-loader会去翻译这段babel代码,对其解析成js并塞入script对babel标签进行替换
    let num = 0;
    const App = () => (       //App 必须是一个函数,不然手动刷新视图会出问题
        <div className="red"> //不需要 React.createElement('div', {className: 'red'}, [n, React.createElement()])
            {n}               //变量使用 {} 包裹起来即可
            <button
                onClick={() => {
                    num += 1;
                    render();    //变量改变后,需要手动刷新视图
                }}
            >
            +1
            </button>
        </div>
    );
    const render = () => ReactDOM.render(<App />, document.querySelector("#root"));
    render();                           //这里的 <App /> 和 App()类似,现在就可以通过组件的形式对其进行调用了
</script>

        结合上 babel-loader 之后代码简介了不少,所有的标签都可以用 html 标签写,如果你需要插入 js 变量或函数,就用 {} 包裹起来,相比之前创建便签需要使用 React.createElement() 的方式简单太多了。现在和 Vue 相比起来好像还简单了不少,因为所有的东西都是 JavaScript 原有的,而 Vue 要实现变量还需要 data 属性,实现点击函数还需要 v-on 指令。

        但是这种 BootCDN 的方式不太推荐,这是忠告。永远不要再生产环境使用这种 BootCDN 的方式,因为效率太低了,而且它要在用户的机器上下载一个 babel.min.js,它还要在浏览器端把 JSX 翻译成 JS,为什么不在 build 的时候做呢?

  • 使用 create-react-app 的方式

        这个 React 的 create-react-app 命令行和 Vue 的 VueCLI 是同一性质的东西,安装及创建项目的方式如下:

yarn global add create-react-app    //或者npm,由于内容比较大推荐使用 yarn

create-react-app ProjectName    //类似于 Vue 的 vue create ProjectName
//创建完成之后可以到项目目录中运行 yarn start 命令,可以看到 React 的网页就说明项目创建成功了
<div id="root"></div>    //index.html

//App.js
import React from 'react'
const App = () => {    //虽然是js文件,但却可以写babel代码
    return (
        <div>App组件</div>  //babel语法内其实还是调用了React.createElement(),所以需要引入React
    )
}
export default App

//index.js 文件
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App.js'

ReactDOM.render(<App />, document.getElementById('root')); //yarn start 可看到 hi 页面

        上述代码我们可以注意到,在 App.js 文件中写的确实 babel 的代码,这是因为 webpack 让 JS 默认走 babel-loader

  • className 属性。在创建组件的过程中,如果一个标签有 class 属性,则需要写 className="red" 代码,原因是我们写的 jsx 语法最终需要被 bebel-loader 转义成 js,js 中的代码是通过 React.createElement('div', {className:'red'}, [n]) 的方式创建组件的。
  • 插入变量。标签里面的所有 JS 代码都要用 { } 包裹起来.,如果你需要变量 n,那么就用 { } 把 n 包起来,如果你需要对象,那么就要用 { } 把对象包起来,如 { {name:'erha'} }
  • 在创建组件的过程中,内部需要 return 时,一定在 return 后面加上 () 。

3、现在和 Vue 进行对比

        Vue 非完整版有 v-loader 的帮助,可以将 html 转义成 render 函数,而 React 有了 babel-loader 的帮助,也可以在 js 文件中写 html 标签了,现在看来二者在开发的便捷性上不相上下。比如我们可以通过一个 if-else 的例子来分析一下:

//Vue
<template>
    <div>
        <div v-if="n%2===0">n是偶数</div>
        <span v-else>n是奇数</span>
    </div>
</template>

//React
const Component = () => {
    return (    //这个括号千万不能丢了
        <div>
            { n%2===0 ? <div>n是偶数</div> : <span>n是奇数</span> }    //js 语法用 {} 包裹
        </div>
    )
}

//React
const Component = () => {
    const inner = n%2===0 ? <div>n是偶数</div> : <span>n是奇数</span>
    return (
        <div>
            { inner }    //由此可见,React更加灵活,只要是 js代码,怎么写都可以
        </div>
    )
}

        结论:Vue:只能用 Vue 提供的 v-if/v-else 语法写条件判断,但是条例会非常清晰。React:只要是 JavaScript 代码,想怎么写就怎么写,非常灵活,但是条例可能不如 Vue 清晰。再比如循环语句在两种框架中的写法对比:

//在Vue里可以遍历数组和对象
<template>
    <div>
        <div v-for="(n, index) in numbers" :key="index">
            下标{{index}},值为{{n}}
        </div>
    </div>
</template>

//React
const Component = (props) => {
    return (
        <div>
            { props.numbers.map((n,index) => {return <div>下标{index} 值为{n} )}
        </div>
    )
</div>)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSX 的基本使用 的相关文章

随机推荐

  • 在 JavaScript 中使用位运算符

    介绍 虽然 Javascript 中的按位运算符几乎没有受到任何关注 但它们实际上非常强大并且用途广泛 它们被认为可以更快地进行数值计算和转换 我们可以利用它们来替代某些复杂的编码场景 并使我们的代码更具可读性 在本教程结束时 您将基本了解
  • 命令设计模式

    命令模式是行为设计 模式之一 命令设计模式用于实现松耦合在请求 响应模型中 命令模式 In command pattern the request is send to the invoker and invoker pass it to
  • 如何在 CentOS 6 上设置 Apache 虚拟主机

    Status 已弃用 本文介绍不再受支持的 CentOS 版本 如果您当前运行的服务器运行 CentOS 6 我们强烈建议您升级或迁移到受支持的 CentOS 版本 Reason CentOS 6 于 2020 年 11 月 30 日达到生
  • 如何在 Ubuntu 18.04 上安装 Anaconda [快速入门]

    介绍 Anaconda 专为数据科学和机器学习工作流程而设计 是一款开源包管理器 环境管理器以及 Python 和 R 编程语言的分发版 本教程将指导您在 Ubuntu 18 04 服务器上安装 Anaconda 有关本教程的更详细版本以及
  • 如何在 Ubuntu 14.04 上安装和配置 OSSEC 安全通知

    介绍 您如何跟踪服务器上的授权和未经授权的活动 OSSEC 是一种可以安装在服务器上以跟踪其活动的工具 OSSEC 是一种开源 基于主机的入侵检测系统 HIDS 它执行日志分析 完整性检查 Windows 注册表监控 rootkit 检测
  • 如何在 Ubuntu 22.04 上安装和保护 Grafana

    介绍 Grafana是一种开源数据可视化和监控工具 可与来自以下来源的复杂数据集成普罗米修斯 InfluxDB Graphite and 弹性搜索 Grafana 允许您为数据创建警报 通知和临时过滤器 同时还可以通过内置共享功能更轻松地与
  • 如何在 Ubuntu 12.10 上使用 Nginx 设置 HTTP 身份验证

    什么是Red Means 用户需要输入或自定义的行将位于red在本教程中 其余的大部分应该是可复制和粘贴的 关于 Nginx Nginx 发音为 engine x 是一个 HTTP 和反向代理服务器 以及邮件代理服务器 由 Igor Sys
  • 如何在零停机的情况下将 WordPress 从共享主机迁移到云服务器

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 如何在 Ubuntu 22.04 上使用 apt 安装 Java

    介绍 许多软件都需要 Java 和 JVM Java 虚拟机 包括Tomcat Jetty 玻璃鱼 卡桑德拉 and Jenkins 在本指南中 您将使用以下命令安装各种版本的 Java 运行时环境 JRE 和 Java 开发人员工具包 J
  • 如何在 Ubuntu 16.04 上使用 GitLab CI 设置持续集成管道

    介绍 GitLab 社区版是一个自托管的 Git 存储库提供商 具有帮助项目管理和软件开发的附加功能 GitLab 提供的最有价值的功能之一是内置的持续集成和交付工具 称为亚搏体育appGitLab持续集成 在本指南中 我们将演示如何设置
  • Linux 中的导出命令

    在本指南中 我们将了解 Linux 中的导出命令 Export 是 Bash shell 的内置命令 它用于标记要传递给子进程的变量和函数 基本上 变量将包含在子进程环境中 而不会影响其他环境 为了更清楚地了解我们正在讨论的内容 让我们深入
  • 如何在 Ubuntu 20.04 上安装 Node.js

    介绍 Node js是用于服务器端编程的 JavaScript 运行时 它允许开发人员使用 JavaScript 创建可扩展的后端功能 这是许多人在基于浏览器的 Web 开发中已经熟悉的语言 在本指南中 我们将向您展示在 Ubuntu 20
  • 如何在 Ubuntu 13.10 上安装 Hadoop

    先决条件 本教程的唯一先决条件是 VPS乌班图 13 10 x64安装 您需要从命令行执行命令 可以通过以下两种方式之一执行 使用 SSH 访问 Droplet 使用 Digital Ocean Droplet 管理面板中的 控制台访问 什
  • 如何在 CentOS 7 上将 MySQL 数据目录更改到新位置

    介绍 数据库随着时间的推移而增长 有时会超出文件系统上的空间 当它们与操作系统的其余部分位于同一分区时 您也可能会遇到 I O 争用 RAID 网络块存储和其他设备可以提供冗余和其他所需的功能 无论您是要添加更多空间 评估优化性能的方法 还
  • 如何设置 MySQL 主主复制

    Status 已弃用 本教程已被弃用并且不再维护 Reason 本教程介绍了构建多主拓扑的过时方法 在本文最初发表时 MySQL 中尚未实现组复制 请参阅 您可以阅读最新的如何在 Ubuntu 16 04 上配置 MySQL 组复制设置多主
  • 如何在 CentOS 7 上使用 Barman 备份、恢复和迁移 PostgreSQL 数据库

    介绍 PostgreSQL是一个开源数据库平台 因其易于维护 成本效益以及与其他开源技术的简单集成而深受 Web 和移动应用程序开发人员的欢迎 维护 PostgreSQL 环境的一项关键任务是定期备份其数据库 备份是任何组织灾难恢复 DR
  • NGINX 作为 Node 或 Angular 应用程序的反向代理

    反向代理是一种从一个或多个上游服务器为客户端检索资源的服务器 它通常将自己置于专用网络中的防火墙后面 并将客户端请求转发到这些上游服务器 反向代理极大地提高了任何 Web 应用程序的安全性 性能和可靠性 许多用 NodeJS 或 Angul
  • js:使用正则将地理位置脱敏。5个字以内,保留第一个字和最后两个字,其余用*替代;6到9个字则保留最后五个字,其余用*替代;10个字以上则最后五个字的前面四个字代替为*

    需求背景 使用正则将地理位置脱敏 5个字以内 保留第一个字和最后两个字 其余用 替代 6到9个字则保留最后五个字 其余用 替代 10个字以上则最后五个字的前面四个字代替为 解决方法 enAdderssFun text if text len
  • 基于servlet+jsp的在线考试管理系统

    1 1 基于servlet jsp的在线考试管理系统 1 2 程序 编程语言 java 前台 jsp 开发工具 IDEA2020 JDK1 8 mysql5 7 tomat 8 管理账号 admin 密码 123456 请求localhos
  • JSX 的基本使用

    1 JSX 简介 通过上一篇博客的 1 个小应用 我们能体会到 和 Vue 相比代 用 React 写一个这么小的应用比较麻烦 而且代码比较混乱 接触过 Vue 的开发者应该知道 Vue 有两个构建版本 如果单独使用非完整版其实和上述用 R