AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX

一、什么是JSX

使用JSX声明一个变量(REACT当中的元素):

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

JSX是一种JavaScript的语法扩展。我们推荐在REACT中使用JSX来描述用户界面,JSX乍一看起来可能比较像是模板语言,但事实上完全是JavaScript内部实现的。

二、为什么要使用JSX

传统的MVC是将模板房子其他地方,比如<script>标签或者模板文件,再在JS中通过梦中手段引用模板。按照这种思路,想想多少次我们面对四处分散的模板片段不知所措?纠结模板引擎,纠结模板存放位置,纠结如何引用模板…………下面是一段REACT官方的看法:

We strongly believe that components are the right way to separate concerns rather than "templates" and "display logic." We think that markup and the code that generates it are intimately tied together. Additionally, display logic is often very complex and using template languages to express it becomes cumbersome.

简单来说,REACT认为组件才是王道,而组件是模板紧密关联的,JSX这种语法,就是为了把HTML模板直接嵌入到JS代码里面,这样就做到了模板和组件关联,但是JS不支持这种包含HTML的语法,所有需要通过工具将JSX编译输出程JS代码才能使用。

npm install babel-loader --save-dev

三、载入方式

JSX目前有两种方法载入。

1、内联方式载入

<script type="text/babel">
ReactDOM.render(
<h1>hello landv.cn</h1>,
document.getElementById('example')
);
</script>

2、外联方式载入

即将JSX代码单独放在一个.JSX文件中。

ReactDOM.render(
<h1>hello landv.cn</h1>,
document.getElementById('example')
);

然后在页面上通过下面的方式引入这个.jsx文件。

<script type="text/babel" src="hello.jsx"></script>

四、在jSX中使用表达式

可以任意地在JSX当中使用JavaScript表达式,在JSX当中的表达式要包括在大括号里(个人理解就是写在JS里的HTML里面的JS需要{}大括号)。

// 定义一个函数,返回传入的名字的拼写后的结果
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
// 定义一个数据类型为对象的常量
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
// 使用JSX语法来定义一个html标签(所以element为小写开头)
const element = (
<h1>
Hello, {formatName(user)}!
</h1>
);
// 渲染这个html标签
ReactDOM.render(
element,
document.getElementById('root')
);

注意:

1、我们书写JSX的时候一般都会带上换行和缩进,这样就可以增强代码的可读性。

2、与此同时,我们同样推荐在JSX代码的外面扩上一个小括号,这样可以防止分号自动插入的BUG

五、JSX本身其实也是一种表达式

在编译之后呢,JSX其实会被转换为普通的JavaScript对象。
这也就意味着,你其实在IF或者FOR语句里面使用JSX,将它赋值给变量,当做参数传入,作为返回值都可以:
// 定义一个函数,如果有传参数进来就把名字拼写好返回,否则就返回陌生人
function getGreeting(user) {
if (user) {
return <h1>Hello, {formatName(user)}!</h1>;
}
return <h1>Hello, Stranger.</h1>;
}

六、JSX属性

你可以使用引号来定义以字符串为值的属性:

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

也可以使用大括号来定义以JavaScript表达式为值的属性:

const element = <img src={user.avatarUrl}></img>;
切记使用了大括号包裹的 JavaScript 表达式时就不要再到外面套引号了。JSX 会将引号当中的内容识别为字符串而不是表达式。(不要src="{user.avatarUrl}",会以为src为{user.avatarUrl})

七、JSX嵌套

如果JSX标签是闭合式的,那么你需要在结尾处用/>,就好像XML/HTML一样:
const element = <img src={user.avatarUrl} />;

JXS标签同样可以相互嵌套:(当换行和缩进的时候,使用括号包住它们)

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

警告:

因为JSX的特性更接近JavaScript而不是HTML,所以REACT DOM使用camelCase小驼峰命名来定义属性的名字,而不是使用HTML的属性命名。(概括就是:JSX使用小驼峰命名定义属性的名称)

例如,class编程了className,而tabindex则对应着tabIndex.

八、JSX防注入攻击

你可以放心地在JSX当中使用用户输入:

const title = response.potentiallyMaliciousInput;
// 直接使用是安全的:
const element = <h1>{title}</h1>;

REACT DOM在渲染之前默认会过滤所有传入的值,它可以确保你的引用不会被注入攻击。所有的内容在渲染之前都被转换成了字符串。这样可以有效的防止XSS(跨站脚本)攻击。

九、HTMl转义

REACT会将所有要显示到DOM的字符串转义,防止XSS。所以如果JSX中包含转义后的实体字符串比如&copy:(©)最后显示到DOM中不会被正确显示,因此REACT自动吧&copy;中的特殊字符转义了。有几种解决方法:

  • 直接使用UTF-8字符©
  • 使用对应字符的Unicode编码,查询编码
  • 使用数组组装<div>{['cc ', <span>&copy;</span>, ' 2019']}</div>
  • 直接插入原始的HTML
<div dangerouslySetInnerHTML={{__html: 'cc &copy; 2019'}} />

十、JSX代表Objects

Babel转译器会把JSX转换成一个名为React.createElement()的方法调用。

下面两种代码的作用是完全相同的:

const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);

React. createElement()这个方法首先会进行一些避免BUG的检查,之后返回一个类似下面例子的对象:

// 注意: 以下示例是简化过的(不代表在 React 源码中是这样)
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world'
}
};

这样的对象被成为“REACT元素”。它代码所有你在屏幕上看到的东西。

REACT通过读取这些对象来构建DOM并保持数据内容一致。

十一、注释

在JSX里使用注释也很简单,就是沿用JavaScript,唯一要注意的是在一个组件的子元素位置使用注释要用{}包起来。

var content = (
<Nav>
{/* child comment, put {} around */}
<Person
/* multi
line
comment */
name={window.isLoggedIn ? window.name : ''} // end of line comment
/>
</Nav>
);

十二、自定义HTML属性

如果在JSX中使用的属性不存在与HTML的规范中,这高属性会被忽略。如果使用自定义属性,可以用data-前缀。

可访问性属性的前缀aria-也是支持的。

支持的标签和属性

如果你要使用的某些标签或属性不在这些支持列表里面就可能被REACT忽略,必须哟使用的话可以提ISSue,或者用前面提到的dangerouslySetInerHTML.

十三、属性扩展

有时候你需要给组件设置多个属性,你不想一个个写下这些属性,或者有时候你甚至不知道这些属性的名称,这时候spread attributes的功能就很有用了。

比如:

var props = {};
props.foo = x;
props.bar = y;
var component = <Component {...props} />;

props对象的属性会被设置程Component的属性。

属性也可以被覆盖:

ar props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'

写在后面的属性值会被覆盖前面的属性。

ar props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'

参考资料

  1. React 官方中文文档
  2. React 中文文档
  3. React - JSX语法详解(附样例)

对对对

AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX的更多相关文章

  1. vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录

    一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...

  2. vue学习指南:第一篇 - vue的介绍

    三大主流框架: 1. Vue.js 是目前最火的一个前端框架,react是最流行的前端框架 (react除了开发网站,还可以开发手机app,Vue语法也是可以用于手机App开发的,需要借助于wexx) ...

  3. vue.js学习系列-第一篇(代码)

    <html> <head> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"> ...

  4. vue.js学习系列-第一篇

    VUE系列一 简介    vue是一个兴起的前端js库,是一个精简的MVVM.从技术角度讲,Vue.js专注于 MVVM 模型的 ViewModel 层.它通过双向数据绑定把 View 层和 Mode ...

  5. React第一篇: 搭建React + nodejs + express框架

    前提: 需要安装Node.js (>6)版本 1.cmd进到本地某个目录, 逐行输入以下指令(以下括号为注释) npm install -g create-react-app   (全局安装cr ...

  6. Vue.js学习笔记 第一篇 数据绑定

    双花括号文本插值 先来个最简单的例子,看完之后立马会用Vue了,是不是很有成就感 <!DOCTYPE html> <html> <head> <meta ch ...

  7. Vue学习之路第一篇(学习准备)

    1.开发工具的选择 这个和个人的开发习惯有关,并不做强求,厉害的话用记事本也可以.但是我还是建议用人气比较高的编辑工具,毕竟功能比较全面,开发起来效率比较高. 我之前写前端一直用的是sublimete ...

  8. 第一篇:GCD多线程的概念

    1.什么叫GCD? 简单来说就是:Grand Central Dispatch的简称,中文翻译就是:”牛逼的中枢调度器“ 这是纯C语言,还提供了非常多强大的函数 2.GCD的相对优势: (1)GCD是 ...

  9. [系统资源攻略]IO第一篇-磁盘IO,内核IO概念

    几个基本的概念 在研究磁盘性能之前我们必须先了解磁盘的结构,以及工作原理.不过在这里就不再重复说明了,关系硬盘结构和工作原理的信息可以参考维基百科上面的相关词条--Hard disk drive(英文 ...

随机推荐

  1. NetCore 统一处理 webapi 返回null 转为“”

    数据库中部分表字段允许空值,则代码中实体类对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前端对应字段赋值需要做nu ...

  2. 【转】socket通信-C#实现tcp收发图片音视频等字节流数据

    在日常碰到的项目中,经常碰到需要收发二进制数据的场景.比如要发送一张图片,要发送一首音频,要发送一个压缩包,要发送一个视频等等.这些数据并非字符串,而是二进制字节流数据.那么如何如何使用SharpSo ...

  3. 编写可维护的JavaScript-随笔(七)

    将配置数据从代码中分离出来 代码中有些数据有修改的可能,如果放在函数中的话后期修改的时候会带来一些不必要的风险 需要将配置数据从代码中抽取出来,如果配置数据多的话可以放入一个对象中,然后修改抽取出来的 ...

  4. CSS 标签显示模式

    标签的类型(显示模式) HTML标签一般分为块标签和行内标签两种类型,它们也称块元素和行内元素. 一.块级元素(block-level) 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高 ...

  5. Qt NetWork即时通讯网络聊天室(基于TCP)

    本文使用QT的网络模块来创建一个网络聊天室程序,主要包括以下功能: 1.基于TCP的可靠连接(QTcpServer.QTcpSocket) 2.一个服务器,多个客户端 3.服务器接收到某个客户端的请求 ...

  6. Linux 下的7种文件类型

    普通文件类型 (-)Linux中最多的一种文件类型, 包括 纯文本文件(ASCII):二进制文件(binary):数据格式的文件(data);各种压缩文件.第一个属性为 [-] ,这些文件一般是用一些 ...

  7. VS code key shortcuts for windows

    mac上的快捷键,尽量是选择像我用vs studio上靠近. ctrl+K+S: 显示快捷键列 ctrl+shift+p: 系统配置命令行 ctrl+p:项目中文件列表,选择文件 Alt+M:当前文件 ...

  8. Idea中SpringBoot引入thymeleaf没有提示

    问题描述: 最近使用Idea搭建SpringBoot时,用到了 thymeleaf,但是出现了点问题:输入th: 代码有没有提示. 解决方法: <html lang="en" ...

  9. Mybatis如何插入空字段

    出现异常:SQLException : 无效的类型: 1111 使用Mybatis插入一条记录,某字段设为null,出错 尝试将空的mgr属性插入到数据库,解决办法: 添加setting属性jdbcT ...

  10. python爬取站长之家植物图片

    from lxml import etree from urllib import request import urllib.parse import time import os def hand ...