JSX初探

2023-11-09

需求:动态的创建HTML页面,假设有一个布尔变量"editable",为true时创建A界面,为false时创建B界面。
A界面:

<div class="container>
   <span>我可以编辑</span>
   <img src="icon.png"></img>
</div>

B界面:

<div class="container_uneditable>
   <span>不能编辑</span>
   <img src="icon_uneditable.png"></img>
</div>

现有的实现思路有两个:
一、JS动态创建HTML标签

var myDiv = document.createElement('div');
var mySpan = document.createElement('span');
var myImg = document.createElement('img');

if(editable){
    myDiv.className = 'container';
    mySpan.innerHTML = '我可以编辑';
    myImg.src = 'icon.png';
} else {
    myDiv.className = 'container_uneditable';
    mySpan.innerHTML = '不能编辑';
    myImg.src = 'icon_uneditable.png';
}
myDiv.appendChild(mySpan);
myDiv.appendChild(myImg);

优点:灵活
缺点:不够优雅,繁琐

二、模板代码

<template id="my_template">
  <div class="">
       <span></span>
       <img src=""></img>
  </div>
</template>

var myTemplate = document.querySelector('#my_template');
if(editable){
    myTemplate.content.querySelector('div').className = 'container';
    myTemplate.content.querySelector('span').innerHTML = '我可以编辑';
    myTemplate.content.querySelector('img').src = 'icon.png';
} else {
    myTemplate.content.querySelector('div').className = 'container_uneditable';
    myTemplate.content.querySelector('span').innerHTML = '不能编辑';
    myTemplate.content.querySelector('img').src = 'icon_uneditable.png';
}

优点:不用创建标签
缺点:不灵活

有什么方法既可以灵活创建标签,又不繁琐呢?JSX就是解决方案之一。

<script type="text/babel">
        const domContainer = document.querySelector('#容器id');
        var editable = false;
        const ele = (
            <div className={editable ? 'container' : 'container_uneditable'}>
                <span>{editable ? '我可以编辑' : '不能编辑'}</span>
                <img src={editable ? 'icon.png' : 'icon_uneditable.png'}></img>
            </div>
        )
        ReactDOM.render(ele, domContainer);
</script>

下面我们开始正式介绍JSX:
Consider this variable declaration:

const element = <h1>Hello, world!</h1>;

This funny tag syntax is neither a string nor HTML.

It is called JSX, and it is a syntax extension to JavaScript. We recommend using it with React to describe what the UI should look like. JSX may remind you of a template language, but it comes with the full power of JavaScript.

这个有趣的标记语法既不是字符串也不是HTML。它被称作JSX,它是对JS的一种语法扩展。推荐将其和react一起使用以描述界面。JSX可能会让你想起模板语言,但它还具备了JS的所有能力。

一、Why JSX?
React embraces the fact that rendering logic is inherently coupled with other UI logic: how events are handled, how the state changes over time, and how the data is prepared for display.

Instead of artificially separating technologies by putting markup and logic in separate files, React separates concerns with loosely coupled units called “components” that contain both. We will come back to components in a further section, but if you’re not yet comfortable putting markup in JS, this talk might convince you otherwise.

React doesn’t require using JSX, but most people find it helpful as a visual aid when working with UI inside the JavaScript code. It also allows React to show more useful error and warning messages.

为什么使用JSX?
React承认这样一个事实:渲染逻辑天生就会和UI逻辑耦合在一起,而不是强行将标记代码与逻辑代码分割在不同文件。
React用松耦合的单元(即组件,它既包含渲染逻辑,也包含UI逻辑)来分离关注点。
React不强制要求使用JSX,但大部分人发现当你需要在JS代码中编写UI逻辑时它是很有用处的,它也能够帮助React展示更多有用的错误、警告信息。

二、Embedding Expressions in JSX
In the example below, we declare a variable called name and then use it inside JSX by wrapping it in curly braces:

const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>;

ReactDOM.render(
  element,
  document.getElementById('root')
);

在JSX中嵌入表达式
在上面的例子中,我们声明了一个叫做name的变量,然后把它写在花括号中内嵌入JSX中,任何合法的表达式都可以嵌入其中,比如数值运算、函数调用并返回值

三、JSX is an Expression Too
After compilation, JSX expressions become regular JavaScript function calls and evaluate to JavaScript objects.

This means that you can use JSX inside of if statements and for loops, assign it to variables, accept it as arguments, and return it from functions:

function getGreeting(user) {
  if (user) {
    return <h1>Hello, {formatName(user)}!</h1>;
  }
  return <h1>Hello, Stranger.</h1>;
}

JSX也是一种表达式
编译后,JSX表达式变成了一个普通的JS函数调用并且会得到一个JS对象返回值。
这意味着你可以在if,while语句中使用JSX,把它赋值给变量,传值给参数,返回值给函数。

四、Specifying Attributes with JSX
You may use quotes to specify string literals as attributes:

const element = <div tabIndex="0"></div>;

You may also use curly braces to embed a JavaScript expression in an attribute:

const element = <img src={user.avatarUrl}></img>;

用JSX指定属性值
你可以使用双引号指定字符串字面量作为属性值。你也可以使用花括号嵌入JS表达式

五、Specifying Children with JSX
If a tag is empty, you may close it immediately with />, like XML:

const element = <img src={user.avatarUrl} />;

JSX tags may contain children:

const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);

用JSX指定子视图
如果有多层视图,要在外部用括号括起来。

更多详情
参考:https://reactjs.org/docs/introducing-jsx.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSX初探 的相关文章

随机推荐

  • 堆叠注入原理解析

    文章目录 一 堆叠注入原理 二 堆叠注入触发条件 三 题目 一 堆叠注入原理 mysql数据库sql语句的默认结束符是以 结尾 在执行多条SQL语句时就要使用结束符隔开 那么在 结束一条sql语句后继续构造下一条语句 是否会一起执行 因此这
  • Shell脚本调试技巧

    脚本调试的主要工作就是发现引发脚本错误的原因以及脚本源代码中定位错误行 归纳汇总了SHELL脚本的总总方法 供大家学习参考 方式一 通过echo方式 功能 最简单的调试方法 可以在任何怀疑出错的地方用echo打印变量 场合 所有怀疑可能有问
  • 华硕PRIME Z390-P主板设置开启虚拟化技术

    没开虚拟化技术virtual box只能创建32位的系统 开启之后才能创建windows 7 64位系统 参考文章 https shiyousan com post 636245851547291596 https jingyan baid
  • Vue中下载不同文件的几种方式

    当在Vue中需要实现文件下载功能时 我们可以有多种方式来完成 下面将介绍五种常用的方法 1 使用window open方法下载文件
  • 【BZOJ3309】DZY Loves Math

    3309 DZY Loves Math Time Limit 20 Sec Memory Limit 512 MB Submit 411 Solved 161 Submit Status Discuss Description 对于正整数n
  • python面试题_50道Python面试题集锦(附答案)

    Python是目前编程领域最受欢迎的语言 在本文中 我将总结Python面试中最常见的50个问题 每道题都提供参考答案 希望能够帮助你在2019年求职面试中脱颖而出 找到一份高薪工作 这些面试题涉及Python基础知识 Python编程 数
  • Java 导入excel 两个sheet

    import java io File import java io FileInputStream import java io IOException import org apache poi ss usermodel Cell im
  • nexus仓库有jar但是maven 拉取不到jar问题解决

    eclipse在工程上右键 maven gt select maven profile 然后选择profile就好了 方式二 直接使用命令行拉取 mvn f pom xml dependency copy dependencies
  • mac显示文件路径

    在 Mac 上 可以使用 显示文件路径 功能来查看文件的路径 这个功能可以让你看到文件所在文件夹的完整路径 以及文件名 要查看文件路径 你可以在 Finder 中打开文件所在的文件夹 然后按下 Command Shift G 键 输入文件名
  • CCP协议学习

    一 CCP协议基础知识 a CCP CAN Calibration Protocol 中文名为CAN标定协议 是基于CAN总线的一种应用层协议 b CCP可以读取RAM PORTS ROM FLASH 写RAM PORTS FLASH c
  • signalr 控制台做服务端

    服务端 一 新建控制台应用程序 net framework 4 8 SignalRSelfHost 二 引入NuGet包 install package Microsoft AspNet SignalR Core install packa
  • Centos安装配置git

    最简单的安装方式直接使用yaml命令 yum install git all 服务器回应 其实除了安装git之外 也会安装其他需要的依赖文件 yum 安装的git默认是 git version 1 8 3 1 git官网下载压缩包 本地配置
  • JPA快速开发之查询接口Repository

    什么是JPA SpringData是Spring提供的一个数据操作框架 而SpringData JPA则是该框架下基于JPA标准进行数据操作的模块 SpringData JPA简化了持久层代码的操作 只需编写接口即可实现 JPA 全称Jav
  • Python全栈开发【基础-10】流程控制之for循环

    专栏介绍 本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flas
  • JetBrains产品教育版申请

    JetBrains产品教育版申请 Pycharm和IntelliJ都是申请的JetBarins官方edu版 功能上应该和professional一样 虽然咱不一定能用得到pro 以下内容以申请Pycharm为例 事实上 只要能认证成功 所有
  • 蓝牙DA14580学习教程(附开源可编程手环/手表全套学习资料下载地址)

    DA14580学习 DA14580用来干什么 1 超长待机的智能手环 手表和其他智能穿戴设备 2 智能鼠标 键盘 遥控器 触控板 语音和手势识别控制板等 3 计步 如小米手环 活动和睡眠监测器 血压血糖心率监测器 4 多感测器运动电脑平台
  • 数据处理的关键组件:编程与数据加工

    编程是计算机科学中至关重要的一环 它涉及到对数据进行加工与处理的过程 通过编程 我们可以创建算法和程序来操作和转换数据 使其具有意义和价值 在本文中 我们将探讨编程在数据处理中的作用 并提供一些使用中文编写的源代码示例 编程语言是用来编写程
  • spring boot2 与dubbo整合经验

    开始接触spring boot2整合dubbo时 参考了好多文章 都不太完全 导致整合屡次失败 坚信降低门槛才会普及大众 否则技术再好束之高阁也白搭 dubbo配置文件分好几种 xml类 properties类 api配置类 注解类 另外注
  • 目标跟踪算法研究整理

    最近项目有用到目标跟踪的算法 用的还是传统opencv 整理一下 1 基础框架 目标跟踪基础认识 视频图像跟踪算法综述 opencv实现目标跟踪的八种算法 2 CSRT追踪器 CSRT追踪器 官方描述 在具有通道和空间可靠性的判别相关滤波器
  • JSX初探

    需求 动态的创建HTML页面 假设有一个布尔变量 editable 为true时创建A界面 为false时创建B界面 A界面 div class div B界面 div class div 现有的实现思路有两个 一 JS动态创建HTML标签