1)使用 JSX 的好处

1.提供更加语意化且易懂的标签

与html对比

<!--HTML写法-->
<form class="messageBox">
<textarea></textarea>
<button type="submit"></button>
</form> //jsx写法
<MessageBox />

1.1命令式 对比 声明式
React 思路认为使用 Component 比起模版(Template)和显示逻辑(Display Logic)更能实现关注点分离的概念,而搭配 JSX 可以实现声明式Declarative (注重 what to),而非命令式 Imperative (注重 how to)的程序编写方式

//命令式写法
if(userLikes()) {
if(!hasBlueLike()) {
removeGrayLike();
addBlueLike();
}
} else {
if(hasBlueLike()) {
removeBlueLike();
addGrayLike();
}
} //声明式写法
if(this.state.liked) {
return (<BlueLike />);
} else {
return (<GrayLike />);
}

2.更加简洁

虽然最终 JSX 会转换成 JavaScript,但使用 JSX 可以让程序看起来更加简洁,

//以下为使用 JSX
<a href="https://facebook.github.io/react/">Hello!</a> //不使用jsx
// React.createElement(元件/HTML标签, 元件属性,以对象表示, 子元件)
React.createElement('a', {href: 'https://facebook.github.io/react/'}, 'Hello!')

3.结合原生 Js 语法

// const 为常数
const lists = ['JavaScript', 'Java', 'Node', 'Python'];
class HelloMessage extends React.Component {
render() {
return (
<ul>
{lists.map((result, index) => {
return (<li key={index}>{result}</li>);
})}
</ul>);
}
}

2)JSX 用法摘要

1.环境设定与使用方式

1.1jsx使用方式

  1. 使用 browserify 或 webpack 等 CommonJS bundler 并整合babel 预处理
  2. 于浏览器端做解析

1.2加载 JSX 方式

两种加载方式:

//内嵌
<script type="text/babel">
ReactDOM.render(
<div>hello react!!</div>,
document.getElementById('example')
);
</script> //从外部引入
<script type="text/jsx" src="main.jsx"></script>

2.标签用法

JSX 标签非常类似 XML ,可以直接书写。一般 Component 命名首字大写,HTMLTags 小写。

//以下是一个建立 Component 的 class
class HelloMessage extends React.Component {
render() {
return (
<div>
<p>Hello React!</p>
<MessageList />
</div>
);
}
}

3.转换成 Js

JSX 最终会转换成浏览器可以读取的 JavaScript
转换规则

React.createElement(
string/ReactClass, // 表示 HTML 元素或是 React Component
[object props], // 属性值,用对象表示
[children] // 接下来参数皆为元素子元素
)

解析前(特别注意在 JSX 中使用 JavaScript 表达式时使用 {} 括起,如下方范例的 text ,里面对应的是变数。若需希望放置一般文字,请加上 '' )

var text = 'Hello React';
<h1>{text}</h1>
<h1>{'text'}</h1>

解析完后

另外要特别要注意的是由于 JSX 最终会转成 JavaScript 且每一个 JSX 节点都对应到一个 JavaScript 函数,所以在 Component 的 render 方法中只能回传一个根节点(Root Nodes)。

例如:若有多个 <div> 要 render 请在外面包一个Component 或 <div> 、 <span> 元素。

var text = 'Hello React';
React.createElement("h1", null, "Hello React!");

4.注解(注释)

由于 JSX 最终会编译成 JavaScript,注解也一样使用 // 和 /**/ 当做注解方式

// 单行注解
/*
多行注解
*/ var content = (
<List>
{/* 若是在子元件注解要加 {} */}
<Item
/* 多行
注解
喔 */
name={window.isLoggedIn ? window.name : ''} // 单行注解
/>
</List>
);

5.属性

在 HTML 中,我们可以通过标签上的属性来改变标签外观样式,在 JSX 中也可以。
【注意】class 和 for 由于为 JavaScript 保留关键字用法,因此在 JSX中使用 className 和 htmlFor 替代。

class HelloMessage extends React.Component {
render() {
return (
<div className="message">
<p>Hello React!</p>
</div>
);
}
}

5.1Boolean 属性

在 JSX 中预设只有属性名称但没设值为 true

//例如以下第一个 input 标签disabled 虽然没设值,但结果和下面的 input 为相同
<input type="button" disabled />;
<input type="button" disabled={true} />; //反之,若是没有属性,则预设预设为 false :
<input type="button" />;
<input type="button" disabled={false} />;

6.扩展属性

在 ES6 中使用 ... 是迭代对象的意思,可以把所有对象对应的值迭代出来设定属性,但要注意后面设定的属性会盖掉前面相同属性:

var props = {
style: "width:20px",
className: "main",
value: "yo",
}
<HelloMessage {...props} value="yo" />
// 等于以下
React.createElement("h1", React._spread({}, props, {value: "yo"}
), "Hello React!");

7.自定义属性

若是希望使用自定义属性,可以使用 data- :

<HelloMessage data-attr="xd" />

8.显示 HTML

通常为了避免信息安全问题,我们会过滤掉 HTML,若需要显示的话可以使用:

<div>{{_html: '<h1>Hello World!!</h1>'}}</div>

9.样式使用

在 JSX 中使用外观样式方法如下,第一个 {} 是 JSX 语法,第二个为JavaScript 对象。与一般属性值用 - 分隔不同,为驼峰式命名写法:

<HelloMessage style={{ color: '#FFFFFF', fontSize: '30px'}} />

10.事件处理

事件处理为前端开发的重头戏,在 JSX 中通过 inline 事件的绑定来监听并处理事件(注意也是驼峰式写法)

<HelloMessage onClick={this.onBtn} />

更多事件处理参考:https://reactjs.org/docs/events.html#supported-events

三、jsx简化教程的更多相关文章

  1. Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程

    Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程 引言:原本机子上已经装好了win7+Ubuntu Kylin 由win7引导,而不是Ubuntu的grub引导的双系统(安装 ...

  2. 技能|三次简化一张图:一招理解LSTM/GRU门控机制

    作者 | 张皓 引言 RNN是深度学习中用于处理时序数据的关键技术, 目前已在自然语言处理, 语音识别, 视频识别等领域取得重要突破, 然而梯度消失现象制约着RNN的实际应用.LSTM和GRU是两种目 ...

  3. mysql进阶(三)游标简易教程

    mysql游标简易教程 从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎.InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键 ...

  4. Python基础(三):简化除法判断、分析apache访问日志、扫描存活主机、利用多线程实现ssh并发访问

    一.简化除法判断 目标: 编写mydiv.py脚本,主要要求如下: 提示用户输入一个数字作为除数 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该输入数字 如果用 ...

  5. 从头開始学 RecyclerView(三) 封装简化

    前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...

  6. 【转载】Gradle学习 第三章:教程

    转载地址:http://ask.android-studio.org/?/article/15 3.1. Getting Started 入门The following tutorials intro ...

  7. U盘装系统系列三—-ghost系统安装教程

    前面和大家分享了如何用老毛桃U盘启动盘制作工具把U盘制作启动盘,接下来说下制作好启动盘之后如何安装ghost系统.首先我们准备好ghost镜像复制到U盘中:然后用U盘启动:选择[01]后按Enter键 ...

  8. WorkerMan 入门学习之(三)基础教程-Timer类的使用

    1.ServerTimer.php 代码: <?php /** * 定时器学习 */ require_once __DIR__ . '/Workerman/Autoloader.php'; us ...

  9. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

随机推荐

  1. VS2010如何进行程序调试

    VS2010如何进行程序调试 一.前言 对于初步学习C++的朋友,程序的调试是一项必备的技能.尤其是像C++这样难学的语言,程序调试的基本方法更是至关重要.毕竟,谁也不想自己幸幸苦苦一天敲出来的代码就 ...

  2. HBase查询速度慢原因排查

    问题:通过HBase访问服务在HBase中查询 ASSET_NORMAL 表速度很慢 如下,查询一条数据需要2.970s时间: 如下,统计总条数需要14.675s时间: HBase访问服务部署了3个节 ...

  3. ROS学习笔记INF-重要操作列表

    该笔记将重要操作的步骤进行列表,以便查询: 添加消息 在包中的msg文件夹中创建msg文件 确保package.xml中的如下代码段被启用: <build_depend>message_g ...

  4. Day10 - A - Rescue the Princess ZOJ - 4097

    Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Helti ...

  5. 设备树DTS 学习: uboot 传递 dtb 给 内核

    背景 得到 dtb 文件以后,我们需要想办法下载到 板子中,并给 Linux 内核使用. (高级版本的 uboot也有了 自己使用设备树支持,我们这里不讨论 uboot 使用的设备树) Linux 内 ...

  6. pygame库的学习

    第一天:我学习了如何设置窗口和加载图片,以及加载音乐.这个库真的很有意思啊,打算py课设就拿这个写了. 代码: import pygamefrom sys import exit pygame.ini ...

  7. Windows 10工程版本泄露全新设计的操作中心圆角样式

    早些时候微软错误地向Windows 10所有测试通道推送内部工程版本,该版本构建后尚未经过微软内部测试. 当然本身微软也没准备推送所以该版本里很多新功能未被关闭,而成功升级的用户则可以立即查看这些功能 ...

  8. C语言版数据结构算法

    C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu ...

  9. CC3200 飞行计划

    CC3200 飞行计划 2016-01-25 CC3200 资源 CC3200_JTAG调试 CC3200-Uniflash 烧写程序 Mosquitto搭建MQTT 服务器 [示例] CC3200_ ...

  10. 安装数据库Typical path for xclock: /usr/X11R6/bin/xclock 错误问题

    [oracle@localhost database]$ ./runInstaller Starting Oracle Universal Installer... Checking Temp spa ...