在开启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和组件的更多相关文章

  1. React.js学习

    React.js学习之环境搭建 1 工欲善其事必先利其器:前端开发工具 1.1 WebStorm和Sublime Text Sublime Text:作为代码编辑器,Sublime Text的优点如下 ...

  2. React.js学习笔记(一):组件协同与mixin

    组件协同: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  3. react.js学习之路一

    今天新老大来了,我们要学习他使用的框架react.js,现在是两眼一抹黑,对于我这个前端菜鸟来说,是真正的重新开始,好了,不说那么多了,开始随便记录我的学习,之后再整理内容. (1)对于react来说 ...

  4. Vue.js学习与理解

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不 ...

  5. React.js学习知识小结(一)

    学习React也有半个月了吧,这里对所学的基础知识做个简单的总结.自己先是跟着官方文档学,差不多学了四五天,也跟着入门教程做了一个简单的小栗子.然后跟着阮一峰老师的教程上手了几个小Demo,后来在网上 ...

  6. react.js学习之路四

    针对学习react.js中,我感觉最大的疑惑点就是bind(this)的绑定和指向问题了,我被这个问题弄的头昏,有时候调用组件的时候,直接显示undefined,不存在这个组件,当时的心情是崩溃的,整 ...

  7. react.js学习之路三

    学习react.js,知识点整理: 1.props和state: props是相对于父级来说,固定的不会改变的内容.一般会先定义一个变量,则在父级中进行引用, var user = "liu ...

  8. React.js学习小结

    最近一段时间都在学习React.js,感觉还不错,现在把自己的一些学习笔记记录一下,留着以后学习查看. 0.React全家桶(技术栈) 1.React主体 2.WebPack:grunt.gulp自动 ...

  9. React.js 学习笔记

    React.js React.js 是时下最流行的前端 JavaScript 框架之一. 创建工程 # 安装 CLI $ npm install -g create-react-app # 创建新的应 ...

随机推荐

  1. selenium - javascript - 滚动条

    虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法.在这种情况下,就可以借助JavaScript来控制浏览器的滚动条.WebDriver提供了execu ...

  2. 图像BMP格式介绍

    1 图像BMP格式说明 BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选 ...

  3. UESTC--1727

    原题链接:http://acm.uestc.edu.cn/problem.php?pid=1727 分析:用 l[i] 记录第 i 层楼有多少物品需要往上继续搬运,如果某层楼没有物品,但是更上面还有, ...

  4. poj2115 C Looooops

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29262   Accepted: 8441 Descr ...

  5. 树莓派更改vnc分辨率

    参考链接:https://raspberrypi.stackexchange.com/questions/56421/how-to-increase-resolution-on-latest-rasp ...

  6. UVA-11582 数学

    UVA-11582 题意: 求f[a^b]%n ,其中f是斐波那契数列,1<=n<=1000,0<=a,b<=2^64; 代码: //这题重点是要发现 f[i]%n会出现循环, ...

  7. 让块元素在同一行显示的方法: float 和inline-block

    float: 定义:按照一个指定的方向移动,遇到父级的边界或者相邻的浮动元素就会停下来(不完全脱离文档流) 值: left.right.none 特点: 1.浮动的块元素可以在一行显示,宽度是被内容撑 ...

  8. 前端PHP入门-022-重点日期函数之获取本地化时间戳函数.md

      在实际的工作中我们还需要经常用到指定某个时间生成 例如:需要找到昨天到今天此时此刻的注册用户. 我们需要做两件事情: 得到当前的时间unix时间戳.用time()函数就可以直接搞定 那么昨天指定时 ...

  9. HashMap源码翻译

    /* * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...

  10. 分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客

    前言 由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react.数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的.re ...