React.js学习之理解JSX和组件
在开启JSX的学习旅程前,我们先了解一下React的基本原理。React本质上是一个"状态机",它只关心两件事:更新DOM和响应事件,React不处理Ajax、路由和数据存储,也不规定数据组织的方式。它不是一个MVC的框架,只是MVC里的"V"。
在每次状态改变时,使用JavaScript重新渲染整个页面会异常慢,这应该归咎于读取和更新DOM的性能问题。React使用虚拟DOM实现了一个非常强大的渲染系统,在React中对DOM只更新不读取。React以渲染函数为基础,读取当前的状态,将其转换为目标页面的一个虚拟表现,它采用了非常高效的算法,计算出虚拟页面当前版本和新版本的差异,基于这些差异对DOM进行必要的最少更新。
React的优势在于最小化重绘,并避免了不必要的DOM操作。
1 初识JSX
JSX(JavaScript XML),是一种在React组件内部构建标签的类XML语法。相比JS中嵌入HTML标签,JSX有以下几个明显的特征:
1.JSX是一种句法变换——每一个JSX节点都对应一个JavaScript函数;
2.JSX既不提供也不需要运行时库;
3.JSX并没有改变或添加JavaScript的语义——它只是简单的函数调用。
使用JSX的好处:更加熟悉,更加语义化,更加直观,抽象化,关注点分离。
2 JSX练习
2.1 定义一个自定义组件
React中通过React.createClass定义自定义组件。React组件实现了一个render()方法,该方法接受输入数据并返回要显示的内容。本例采用了类XML语法JSX。render()方法通过this.props来获取传递给组件的输入数据。
var HelloWorld = React.createClass({
render: function () {
return <div>hello {this.props.name}</div>
}
});
ReactDOM.render(
<HelloWorld name="wulei"/>,
document.getElementById('example')
);
使用react-tools编译后的js代码如下:
var HelloWorld = React.createClass({displayName: "HelloWorld",
render: function () {
return React.createElement("div", null, "hello ", this.props.name)
}
});
ReactDOM.render(
React.createElement(HelloWorld, {name: "wulei"}),
document.getElementById('example')
);
对比会发现,使用JSX后代码变得更熟悉且简洁。
2.2 使用动态值
JSX将两个花括号之间的内容渲染为动态值,花括号指明了一个JavaScript的上下文环境,在花括号中的内容会被进行求值,求值得到的结果会被渲染为标签中的若干节点。对于简单值,比如文本或者数字,可以直接引用对应的变量;对于更复杂的逻辑,可以将其转换为一个函数进行求值。
var dynamicText = "test Me!";
var HelloWorld = React.createClass({
getName: function () {
return "wulei";
},
render: function () {
return <div>hello {this.getName()}, {dynamicText}</div>
}
});
ReactDOM.render(
<HelloWorld name="wulei"/>,
document.getElementById('example')
);
2.3 子节点
React将开始标签与结束标签之间的所有子节点保存在一个名为this.props.children的特殊组件属性中。例如在HelloWorld组件中,我们可以把<HelloWorld>标签中的子节点渲染出来,这里我们可以像使用HTML元素一样使用HelloWord组件。
var HelloWorld = React.createClass({
getName: function () {
return "wulei";
},
render: function () {
return <div>hello {this.props.children}</div>
}
});
ReactDOM.render(
<HelloWorld name="wulei">I am child!</HelloWorld>,
document.getElementById('example')
);
运行结果可以看到子节点被成功地渲染。

2.4 属性
与HTML类似,JSX中以内联的方式设置节点属性,同时还提供了将属性设置为动态JavaScript变量的便利,设置动态属性方法同2.2动态值。
2.5 非DOM属性
JSX提供了三个特殊的非DOM属性:
键(key):独一无二,确保在渲染周期保持一致,使得React能够更智能地决定该重用一个组件还是销毁并重新创建一个新的组件进而提升渲染性能。
引用(ref):允许父组件在render方法外保持对子组件的一个引用。
设置原始的HTML(dangerouslySetInnerHTML):将HTML内容设置为字符串。
2.6 事件
事件名统一用驼峰形式表示,如onChange,onClick。
var HelloWorld = React.createClass({
getName: function () {
return "wulei";
},
handleClick: function(event){
alert("clicked!");
},
render: function () {
return <div onClick={this.handleClick}>hello {this.props.children}</div>
}
});
ReactDOM.render(
<HelloWorld name="wulei">I am child!</HelloWorld>,
document.getElementById('example')
);
2.7 样式
React把所有的内联样式都规范化为驼峰形式,与JavaScript中DOM的style属性一致。
3 需要注意的问题
1.React可以渲染HTML标签(strings)或React组件(classes),要渲染HTML标签,只需在JSX里使用小写字母开头的标签名;要渲染React组件,只需创建一个以大写字母开头的本地变量。
2.由于JSX会转换为原生的JavaScript,因此有一些关键词不建议作为JSX标签的属性名,如for(用htmlFor替代)和class(用className替代)。
2.在使用条件判断时,在JSX的花括号中直接加入if语句会渲染出无效的JavaScript。
解决方法:1>使用三目运算符,2>设置一个变量并在属性中引用它,3>将逻辑转换到函数中,4>使用&&运算符。
React.js学习之理解JSX和组件的更多相关文章
- React.js学习
React.js学习之环境搭建 1 工欲善其事必先利其器:前端开发工具 1.1 WebStorm和Sublime Text Sublime Text:作为代码编辑器,Sublime Text的优点如下 ...
- React.js学习笔记(一):组件协同与mixin
组件协同: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...
- react.js学习之路一
今天新老大来了,我们要学习他使用的框架react.js,现在是两眼一抹黑,对于我这个前端菜鸟来说,是真正的重新开始,好了,不说那么多了,开始随便记录我的学习,之后再整理内容. (1)对于react来说 ...
- Vue.js学习与理解
Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不 ...
- React.js学习知识小结(一)
学习React也有半个月了吧,这里对所学的基础知识做个简单的总结.自己先是跟着官方文档学,差不多学了四五天,也跟着入门教程做了一个简单的小栗子.然后跟着阮一峰老师的教程上手了几个小Demo,后来在网上 ...
- react.js学习之路四
针对学习react.js中,我感觉最大的疑惑点就是bind(this)的绑定和指向问题了,我被这个问题弄的头昏,有时候调用组件的时候,直接显示undefined,不存在这个组件,当时的心情是崩溃的,整 ...
- react.js学习之路三
学习react.js,知识点整理: 1.props和state: props是相对于父级来说,固定的不会改变的内容.一般会先定义一个变量,则在父级中进行引用, var user = "liu ...
- React.js学习小结
最近一段时间都在学习React.js,感觉还不错,现在把自己的一些学习笔记记录一下,留着以后学习查看. 0.React全家桶(技术栈) 1.React主体 2.WebPack:grunt.gulp自动 ...
- React.js 学习笔记
React.js React.js 是时下最流行的前端 JavaScript 框架之一. 创建工程 # 安装 CLI $ npm install -g create-react-app # 创建新的应 ...
随机推荐
- Google protocol buffer的配置和使用(Linux&&Windows)
最近自己的服务器做到序列化这一步了,在网上看了下,序列化的工具有boost 和google的protocol buffer, protocol buffer的效率和使用程度更高效一些,就自己琢磨下把他 ...
- socket--粘包
参考博客:http://www.cnblogs.com/kex1n/p/6502002.html 一.粘包现象 在上一篇的socket传输大数据文章中,我们可以顺利的接发数据,似乎做的不错,可以接收了 ...
- Kubernetes 1.5通过Ceph实现有状态容器
在上一篇博文,我们通过kubernetes的devlopment和service完成了sonarqube的部署.看起来已经可用,但是仍然有一个很大的问题.我们知道,像mysql这种数据库是需要保存数据 ...
- libc、glibc与gcc
转http://blog.163.com/dragon_sjl@126/blog/static/100473339201107101517380/ 1.gcc(gnu collect compiler ...
- 非法字符:"\ufeff"
Eclipse项目导入IDEA可能遇到这样的问题 ,原因就是: 带BOM的UTF-8」和「无BOM的UTF-8」 方法一.用Notepad++把文件转成无BOM的UTF-8 另存为,替换原来的文件 方 ...
- 重构改善既有代码设计--重构手法11:Move Field (搬移字段)
你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段. 动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...
- 垂直居中vertical-align
vertical-align对一些特定显示样式(例如单元格显示方式:table-cell)的元素才会起作用. div{display:table-cell; vertical-align:middle ...
- 数据库-Core Data
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 数据库-Core Data 技术博客htt ...
- 【洛谷P2014】选课
题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...
- [AHOI2012]树屋阶梯 题解(卡特兰数)
[AHOI2012]树屋阶梯 Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营. ...