ReactJS实用技巧(1):JSX与HTML的那些不同
在项目中使用ReactJS也已经有大半年了,收获很多也踩过不少坑。不想把这个系列写成抄书似的罗列,旨在总结些常用的技巧及常见的坑,以帮助初心者快速入门,想系统学习的同学还是多阅读文档。
JSX本质上与HTML并多大没关系,标题所说的不同是指语法上的不同。正因为二者比较相似,初心者才会在很多细节地方混淆。
JSX实际是一种语法糖,最终会转换成JavaScript代码,首先我们看一段React最简单的组件结构:
var HelloReact = React.createClass({
render: function() {
return (<h1 className='title'>Hello React</h1>);
}
});
React.render(<HelloReact />, document.querySelector(#container));
首先我们创建了一个只包含h1标签的组件,并将其保存在名为HelloReact的变量中,之后将其作为标签名,渲染到id为"container"的DOM节点中。
这里要注意的是,组件保存的变量名首字母必须大写,否则无法渲染成功。接下来看下jsx被转义后的语法是什么样的:
var HelloReact = React.createClass({
render: function() {
React.createElement('h1', {className: 'title'}, 'Hello world')
}
});
React.render(<HelloReact />, document.querySelector(#container));
可以看到使用JSX可以大大简化编写难度,这点在多个组件嵌套时更加明显。正因为JSX的存在使得新手对React的学习成本大大降低。
*此文的示例多是React老版本的语法,新版本的React移除了JSXTransformer.js文件,增加了react-dom.js文件。 博主会在之后的博文中详述新版本的语法及工程创建方法,当然最快的方式还是查阅官方更新文档。
下面列出相似但又不同的地方:
类名
HTML
<div class="myStyle"></div>
JSX
<div className="myStyle"></div>
模板
HTML
var name = 'Daryl',
templ = '<p>' + name + '</p>'; //<p>Daryl</p>
JSX
render: function() {
var name = 'Daryl';
return (<p>{name}</p>);
}
在JSX的语法中,大括号括起来的部分会被当做JavaScript代码来解析。不仅仅是在标签之间,在class、style等等属性赋值时均可以使用大括号来进行。需要注意的是,大括号之之间只能写表达式,而不能写判断等语句。
render: function() {
var a = 1;
return (<p>{++a}</p>); //正确
}
render: function() {
var a = 1;
return (<p>{if (true) {a++;}}</p> //报错
}
对于需要判断状态的情况可以多使用逻辑运算符(||、&&等)以及三目运算符来完成。
render: function() {
var status = true;
return (<div className={status ? 'styles1' : 'styles2'}></div>);
}
如果判断的逻辑比较复杂,简单的表达式无法满足要求,还是使用保存于变量中方法。
render: function() {
var nowDate = new Date(),
today = nowDate.getFullYear() + '.' + Number(nowDate.getMonth()+1) + '.' + nowDate.getDate();
return (<p>Today is {today}.</p>); //2016.3.7
}
内嵌样式
HTML
<div style="width:30px;height:30px;background-color:red"></div>
JSX
<div style={{width:30,height:30,backgroundColor:'red'}}></div>
可以看到JSX中的style属性并不是简单的接收一个字符串,那两层大括号是什么意思呢。其本质是接收一个对象作为参数,最外层的大括号是之前说过的用来解析JS代码的区域,而里面的只是个对象而已。
具体的样式属性名称类似jQuery中的驼峰命名方式。同时可以使用以下的写法:
React.create({
render: function() {
return (<div style={styles.container}>
<p style={styles.title}>标题</p>
<p style={styles.content}>内容</p>
</div>);
}
});
var styles = {
container: {
textAlign: 'center'
},
title: {
fontSize: 20,
fontWeight: bold,
color: '#000'
},
content: {
fontSize: 13,
color: 'rgba(0,0,0,0.5)'
}
};
以上这种方式让样式和内容的耦合降低,代码维护也更方便。只不过在使用React开发中,可能更多的人还是习惯使用外联样式表来编写CSS。
其实这种写法应用最多的是在开发React Native项目中,通过StyleSheet创建一个样式集,因为React Native的项目不像普通的WEB工程可以很方便的引入样式表。
事件绑定
HTML
<div onclick="myFunction()"></div>
JSX
React.createClass({
render: function() {
return (<div onClick={this.handlerClick}>点我!</div>);
},
handlerClick: function() {
alert('让你点你就点?');
}
});
在JSX中事件属性都是以驼峰命名的方式,HTML中的内嵌事件的编写方式在JSX语法中是无效的。
列表
列表是现在的web应用中是不可缺少的一种结构。传统的方式通常为请求到数据集,通过JS遍历生成节点,添加到DOM中:
var dataArr = [1,2,3,4,5,6,7],
templ = '';
dataArr.forEach(function(item, index) {
templ += '<div>' + item + '</div>';
});
$('body').append(templ);
如上,是我们使用的一种比较"原始"的方法。React其实是一个状态机,其中数据结构和视图绑定在一起,一切以状态来控制,通过改变数据层触发DOM更改。
虽然在React中也可以直接操作DOM,但是并不提倡,只有在万不得已或者某个东西加入到状态中十分繁琐、代价比较大的情况下才去考虑。
下面我们看下在JSX中是如何渲染列表的:
render: function() {
var dataArr = [1,2,3,4,5,6,7],
jsxArr = [];
dataArr.forEach(function(item, index) {
jsxArr.push(<li>{item}</li>);
});
return (<ul>{jsxArr}</ul>);
}
上例中jsxArr实为一个每项均为JSX标签模板的数组,这段代码反映出React中一个很重要的特性,JSX标签之前的多子节点可以以数组的方式插入,理解这点就能很快地绕过了React中列表的坑。只是在实际开发中我们通常使用下面的方式:
render: function() {
var dataArr = [1,2,3,4,5,6,7];
return (<ul>
{
dataArr.map(function(item, index) {
return (<li>{item}</li>);
});
}
</ul>);
}
当然在列表模板结构比较复杂的情况下,还是建议在return之前生成好,并赋值给某一变量,return时在标签之间插入该变量。
除了上述这些不同点以外,JSX还有着自己独有的某些属性,比如:ref、key等,博主会在之后的博文里阐述用法。
感谢您的浏览,希望能有所帮助。
ReactJS实用技巧(1):JSX与HTML的那些不同的更多相关文章
- ReactJS实用技巧(2):从新人大坑——表单组件来看State
不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...
- Notepad++ 实用技巧
Notepad++是一款开源的文本编辑器,功能强大.很适合用于编辑.注释代码.它支持绝大部分主流的编程语言. 本文主要列举了本人在实际使用中遇到的一些技巧. 快捷键 自定义快捷键 首先,需要知道的是: ...
- javascript实用技巧、javascript高级技巧
字号+作者:H5之家 来源:H5之家 2016-10-31 11:00 我要评论( ) 三零网提供网络编程. JavaScript 的技术文章javascript实用技巧.javascript高级技巧 ...
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示
iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端. 打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面. ...
- iOS开发实用技巧—项目新特性页面的处理
iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...
- IOS 网络浅析-(十三 SDWebImage 实用技巧)
IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...
- NSString的八条实用技巧
NSString的八条实用技巧 有一篇文章写了:iOS开发之NSString的几条实用技巧 , 今天这篇,我们讲讲NSString的八条实用技巧.大家可以收藏起来,方便开发随时可以复制粘贴. 0.首字 ...
- ###《VIM实用技巧》
###<VIM实用技巧> #@author: gr #@date: 2015-11-20 #@email: forgerui@gmail.com <VIM实用技巧>阅读笔记. ...
随机推荐
- Oracle EBS GL 会计科目报错 GL_ACCESS_SET_LEDGERS
1.会计科目设置后,总账中找不到对应账簿 2.原因是新版本系统物化视图有问题,参照metalink解决方案得知原路径 ...
- Oracle EBS OM 取消订单行
DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...
- MySQL案例-mysqld got signal 11
背景:MySQL-5.7.12, debian 8核16G虚拟机, 业务方反馈在某一个时间点, 出现了大量的数据库报错, 之后恢复正常; 场景:开发查看日志后, 发现在某个时间点, 应用断开了所有与数 ...
- MySQL binlog group commit--commit stage
说明: 1.process_commit_stage_queue:调用调用ha_commit_low->innobase_commit进入innodb层依次提交 2. process_after ...
- Python通过Zabbix API获得数据
Zabbix API查询:https://www.zabbix.com/documentation/2.0/manual/appendix/api/api import json,urllib2 fr ...
- Java 基本数据类型 && 位运算
1. Java基本数据类型 1.1 数据类型示意图 类型 字节数 范围 byte 1 -128~127 short 2 -32768~32767 int 4 -231~231-1 long 8 -26 ...
- 在Linux服务器上运行Jupyter notebook server教程
在Linux服务器上运行Jupyter notebook server教程 很多deep learning教程都推荐在jupyter notebook运行python代码,方便及时交互.但只在本地运行 ...
- [python]如何理解uiautomator里面的 child, child_by_text, sibling,及使用场景
如何理解uiautomator里面的 child, child_by_text, sibling,我们借助android原生的uiautomatorviewer抓取的控件来进行理解 以如下图进行详细讲 ...
- <数据结构与算法分析>读书笔记--函数对象
关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇 ...
- ssl,proxy;部分http部分https;80,443,8080;nginx+tomcat;
..... user nobody; worker_processes 8; error_log /opt/logs/nginx/nginx_error.log crit; pid /usr/loca ...