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 # 创建新的应 ...
随机推荐
- poj1204 Word Puzzles
Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 12090 Accepted: 4547 S ...
- Android_UiAutomator(安卓UI自动化)环境搭建
一.配置JDK环境变量 1.新建系统变量JAVA_HOME,然后输入引号内的内容(JDK安装目录) "C:\Program Files\Java\jdk1.8.0_51" ...
- GIT每次都要输入用户名和密码的解决方案
三.配置客户端长期存储用户各和密码 长期存储密码: git config --global credential.helper store 缓存用户信息 3600s zb@zb-computer:/h ...
- [DeeplearningAI笔记]序列模型2.6Word2Vec/Skip-grams/hierarchical softmax classifier 分级softmax 分类器
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.6 Word2Vec Word2Vec相对于原先介绍的词嵌入的方法来说更加的简单快速. Mikolov T, Chen ...
- Java集合框架(set)
set继承自collection接口,其子类和子接口如下: set的共同特性:不能添加相同的元素,通常无法记住元素添加的顺序 1.HashSet类 判断两元素相同的标准:1.equals方法返回tru ...
- ZOJ 3774 Fibonacci的K次方和
In mathematics, Fibonacci numbers or Fibonacci series or Fibonacci sequence are the numbers of the f ...
- Anaconda更换版本方式
Conda的环境管理 Conda的环境管理功能允许我们同时安装若干不同版本的Python,并能自由切换.假设我们需要安装Python 3.6,此时,我们需要做的操作如下: # 创建一个名为python ...
- 可编辑表格(Editable Table)
需求分析 1.单击table的每个cell后,给cell加上一个尺寸相当的input; 2.input后把value传给cell的innerHTML; 3.失焦后删除input. HTML <! ...
- json格式的一些常用操作方法
package com.liveyc.restfull.until; import java.util.HashMap; import java.util.Iterator; import java. ...
- NYOJ 129 树的判定 (并查集)
题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...