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 # 创建新的应 ...
随机推荐
- 三元组ADT (数据结构C语言版) C++实现
很久没用C语言,都忘了C语言中没有引用参数,下面的代码中用到了C语言没有的引用参数. 首先是一些表示状态的全局变量 common.h #define TRUE 1 #define FALSE 0 #d ...
- Rabbitmq -- rpc
一.前言 MQ本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发送到RabbitMQ后不会知道消费者(C)处理成功或者失败(甚至连有没有消费者来处理这条消息都不知道).但实际的应用场景中 ...
- 前端PHP入门-021-重点日期函数之日期验证函数
checkdate可以判断一个输出的日期是否有效. 在实际的工作中,我们需要经常用于检测常用于用户提交表单的数据验证. 函数的语法格式如下: bool checkdate ( int month,in ...
- AngularJs编辑器
问题:在使用过程中遇到的问题就是:angularJS绑定不上值.后来找到一种可以用的方式. html页 <div class="all"> <script typ ...
- VC6完整项目代码升级到VS2010
VC6完整项目代码升级到VS2010,有需要请联系我,专业C++开发,邮箱153786575@qq.com
- <LC刷题二>回文字符串判断之leetcode125&234
其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...
- ③ 设计模式的艺术-09.组合(Composite)模式
使用组合模式的场景 类图当中有三个类,一个是Component(节点的统一接口),它的目的是为了统一节点的操作.接下来的两个实现类,一个则是非叶子节点(Composite),它可以有子节点.另外一个则 ...
- 【洛谷 P3227】 [HNOI2013]切糕(最小割)
题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...
- 2017ACM暑期多校联合训练 - Team 2 1011 HDU 6055 Regular polygon (数学规律)
题目链接 **Problem Description On a two-dimensional plane, give you n integer points. Your task is to fi ...
- 机器学习-kNN(1)
一 kNN算法简介 kNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类对应的关系.输入 ...