【重点提前说:组件化与虚拟DOM是React.js的核心理念!】
       先抛出一个论题:在React.js中,JSX语法提倡将 HTML 和 CSS 全都写入到JavaScript 中是代码书写规范中的"资本主义复辟”吗?react值得推荐的地方就是组件和virtualdom,前者解决多团队协作复杂前端的问题,后者使dom操作到视图刷新变得现实。对于React.js大家褒贬不一,脑残粉极力捧吹,而黑粉则是一昧的踩低。既然这样,那我们就自己学习使用,来下个定论吧~

一、学习前,你该知道这些有关的基础知识~

一、什么是React.js
                React 是一个用于构建[用户界面]的 JAVASCRIPT 库,t主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)。
                React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。
 二、React有哪些 特点?
              ● 1.声明式设计 −React采用声明范式,可以轻松描述应用。
              ● 2.高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。--虚拟DOM结构
              ● 3.灵活 −React可以与已知的库或框架很好地配合。
              ● 4.JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。
              ● 5.组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
              ● 6.单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单
三、简单的解释几个概念:
              ① 虚拟DOM(Virtual DOM)机制:对于每一个组件,React会在内存中构建一个相对应的DOM树,
                          基于React开发时所有的DOM构造都是通过虚拟DOM进行,每当组件的状态发生变化时,React都会重新构建整个DOM数据。
                          然后将当前的整个DOM树和上一次的DOM树进行对比,得出DOM结构变化的部分(Patchs),然后将这些Patchs再更新到
                          真实DOM中。     
                     优点:避免了当页面数据发生变化时,DOM也被全部更新一遍并进行重新渲染。
                                 整个过程都是在内存中进行,减少了不必要的性能开销,因此是非常高效的。   
              ② JSX语法:
                      定义:JSX=JavaScript XML,是一种在React组件内部构建标签的类XML语法。
                             React在不使用JSX的情况下一样可以工作,但是使用JSX可以提高组件的可读性,增强JS语义,结构清晰,抽象程度高,代码模块化。
                      特点:
                      1、元素名首字母大写
                      2、符合嵌套规则
                      3、可以写入求值表达式
                      4、驼峰式命名
                      5、不能使用javascript原生函数的一些关键词,如for和class。需要替换成htmlFor和className
                      6、HTML语言直接写在 JavaScript 语言之中,不加任何引号,它允许 HTML 与 JavaScript 的混写.。
                      优点:
                     1、JSX 执行更快。
                     2、它是类型安全的,在编译过程中就能发现错误。
                     3、使用 JSX 编写模板更加简单快速。
              ③ JSX 的基本语法规则:
                                                      遇到 HTML 标签(以 < 开头),就用 HTML 规则解析;
                                                  遇到代码块(以 { 开头),就用 JavaScript 规则解析;
            
四、 React.js/Angular.js/Vue.js的对比
            1、数据流(数据绑定)
                ① Angular 使用双向绑定即:界面的操作能实时反映到数据,数据的变更能实时展现到界面。
                ② Vue 也支持双向绑定,默认为单向绑定,数据从父组件单向传给子组件。
                ③  React推崇的是函数式编程和单向数据流
                         即给定原始界面(或数据),施加一个变化,就能推导出另外一个状态(界面或者数据的更新)。
            2、视图渲染
                ① AngularJS的工作原理是:HTML模板将会被浏览器解析到DOM中, DOM结构成为AngularJS编译器的输入
                                                          (NG框架是在DOM加载完成之后, 才开始起作用的)
                ② React 的渲染建立在 Virtual DOM 上,一种在内存中描述 DOM 树状态的数据结构。
                                    当状态发生变化时,React 重新渲染 Virtual DOM,比较计算之后给真实 DOM 打补丁。
                ③ Vue.js 不使用 Virtual DOM 而是使用真实 DOM 作为模板,数据绑定到真实节点。
                
            3、模块化与组件化
                 ① Angular 依赖注入来解决模块之间的依赖问题
                 ② Vue.js  指令只封装 DOM 操作,而组件代表一个自给自足的独立单元 —— 有自己的视图和数据逻辑操作。
                 ③ React构建于组件之上,重要属性props,state。一个组件就是通过这两个属性的值在 render 方法里面生成这个组件对应的 HTML 结构。
             4、语法与代码风格
                  ①Angular 2 依然保留以 HTML 为中心。Angular 2 将 “JS” 嵌入 HTML。
                  ② Vue.js  Vue 也是以 HTML 为中心,将 “JS” 嵌入 HTML,但是进阶之后推荐的是使用 webpack + vue-loader 的单文件组件格式。
                  ③ React 推荐的做法是 JSX + inline style,也就是把 HTML 和 CSS 全都整进 JavaScript

二、React.js的模板语法

一、文件导入
JS文件可以到官网进行下载:

        <script src="js/react.js"></script>
<script src="js/browser.min.js"></script>
<script src="js/react-dom.js"></script>

这里需要注意的是这三个文件必须首先加载!并且react.j文件要放在最前面进行导入! react.js是react.js的核心库。  react-dom.js提供与DOM相关的功能。而 browser.js是将JSX语法转化为JAVASCRIPT语法。

二、模板语法

在文件的body区域,我们只需要写一个简单的DIV ,给它一个ID即可。

之后创建script标签,我们的核心JSX语法就写在标签内部:

这里需要注意的地方是:<script> 标签的 type 属性为 text/babel 。凡是使用 JSX 的地方,都要加上 type="text/babel" 。

tips:    在react 0.14前,浏览器端实现对jsx的编译依赖jsxtransformer.js   在react 0.14后,这个依赖的库改为browser.js。 页面script标签的type也由text/jsx改为text/babel。

接下来我们写一个简单的小案例,利用React.js打印输出语句,代码如下:

 <script type="text/babel">
/*一、基本结构:
ReactDOM.render() 是react中的最基本的方法,作用是将模板转为HTML语言,并将其插入到DOM节点中。
*/
ReactDOM.render(//render:渲染的意思
<h1>你好,React!</h1>,
//必须使用JavaScript原生的getElementByID方法,不能使用jQuery来选取DOM节点;
document.getElementById("example1")
)
</script>

使用上面语句就可以打印输出语句“你好,React!”,这就实现了简单的案例。

接下来我们介绍一下,React.js中的CSS样式书写方式,与原生分离式写法有很大不同:

① React 推荐使用内联样式!(使用小驼峰法则)
② React 会在指定元素数字后自动添加 px 。

 <script type="text/babel">
var myStyle ={ //传入一个样式数组
fontSize: 100,
color: 'red'
};
var testStyle ={
width:800,
heigth:500,
backgroundColor:"yellow"
};
ReactDOM.render(
<div style = {testStyle}>
<h1 style = {myStyle}>这段文字使用了内联样式</h1>
</div>,
document.getElementById('example')
)
</script>

显示效果如下:

接下来我们在模板插入 JavaScript 变量,以数组为例,看一下会是什么效果?

 <script type="text/babel">
var arr = [
<h1 key="1">这是数组元素1</h1>,
<h2 key="2">这是数组元素2</h2>,
<h3 key="3">这是数组元素3</h3>,
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById("example")
) </script>

代码的运行结果如下:

以上我们可以看到JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员。


三、React.js中的组件

一、什么是组件?

组件化思想在React.js中很重要,eact 允许将代码封装成组件,然后像插入普通 HTML标签一样,在网页中插入这个组件。

二、组件的创建以及输出

 创建:
var HelloMessage = React.createClass({
render:function (){
return
}
})
输出:使用伪标签 实例化组件类并输出信息 <HelloMessage />

下面我们创建一个组件来实现一个简单的功能:

 <script type="text/babel">
var HelloMessage = React.createClass({
render: function() {
return <h1>这是一个自定义组件---{this.props.name}---{this.props.age}</h1>
// <p>这是个测试标签</p>;
}
});
//输出组件
ReactDOM.render(
            
         <HelloMessage name = "这是组件的name属性!"   age = "这是组件的age属性!"/>,
            //在调用组件的时候,如果想要多次调用组件,也需要给组件设置一个根标签
        <div>
              <HelloMessage name="这是组件的name属性!" />
              <HelloMessage age="这是组件的age属性!" />
            </div>,
         document.getElementById('example')
        );
</script>

上面代码运行结果如下:

在上述代码中,如果我们将 <p>这是个测试标签</p> 放开控制台会报错如下:

原因是因为组件类只能包含一个顶层标签(根标签),可以嵌套标签例如我们可以将上述组件类写成如下格式:

        var HelloMessage = React.createClass({
render: function() {
return <h1>
这是一个自定义组件---{this.props.name}---{this.props.age}
<p>这是个测试标签</p>
</h1>
}
});

运行时就不会再报错,结果如下所示:

在声明与调用组件的时候我们需要注意以下几点:

注意:
     ① 自定义的 React组件类名以大写字母开头,使用大驼峰法则命名!
     ② 所有的组件都必须拥有自己的render!
   ③ 组件类只能包含一个顶层标签(根标签),可以嵌套标签!
     ④ 组件可以任意加入属性,其属性属可以在组件类的 this.props.对象上获取。(组件的所有子节点)
        Tips: 在添加属性时,
               class 属性需要写成 className ,
                for 属性需要写成 htmlFor ,
               这是因为 class 和 for 是 JavaScript 的保留字

复合组件:创建多个组件来合成一个组件,即把父组件的不同功能点进行分离

 <script type="text/babel">
var BaseModule = React.createClass({
render:function(){
return(
<div>
<Module title={this.props.title} />
{/* <h2>作品:{this.props.title}</h2>*/}
<p>作者:{this.props.author}</p>
</div>
)
}
});
var Module = React.createClass({
render:function(){
return(
<h2>{this.props.title}</h2>
)
}
});
ReactDOM.render(
<BaseModule title="围城" author="钱钟书" />,
document.getElementById('container')
);
</script>

上述复合组件运行结果如下:


好了。第一篇React的介绍就先这么多了,通过这些实例我们也大致了解了React所谓混写的概念以及其便捷性,和Vue等框架孰优孰劣现在还不能太早下定论,在以后的几篇文章里我们将会更深一步的了解下它们的异同再做比较。

【每天半小时学框架】——React.js的模板语法与组件概念的更多相关文章

  1. react.js插件开发,x-dailog弹窗浮层组件

    react.js插件开发,x-dailog弹窗浮层组件 我认为,每一个组件都应该有他自带的样式和属性事件回调配置.所以我会给x-dialog默认一套简单的样式,和各种默认的配置项.所有react插件示 ...

  2. Flask框架 请求与响应 & 模板语法

    目录 Flask框架 请求与响应 & 模板语法 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) F ...

  3. 前端框架React Js入门教程【精】

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...

  4. React.js 小书 Lesson2 - 前端组件化(一):从一个简单的例子讲起

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson2 转载请注明出处,保留原文链接和作者信息. 很多课程一上来就给大家如何配置环境.怎么写 Re ...

  5. React.js 小书 Lesson11 - 配置组件的 props

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson11 转载请注明出处,保留原文链接和作者信息. 组件是相互独立.可复用的单元,一个组件可能在不 ...

  6. react系列(一)JSX语法、组件概念、生命周期介绍

    JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的 ...

  7. 前端框架之Vue(2)-模板语法

    Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解 ...

  8. Django框架(五) Django之模板语法

    什么是模板 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板 模板语法分类 模板语法之变量:语法为 {{ 变量名 }}: 在 Django 模板中遍历复杂数据结构的关键是句点字 ...

  9. 【React 6/100】 React原理 | setState | JSX语法转换 | 组件更新机制

    ****关键字 | setState | JSX语法转换 | 组件更新机制 组件更新机制 setState() 的两个作用 修改state 更新组件 过程:父组件重新渲染时,也会重新渲染子组件,但只会 ...

随机推荐

  1. windows 结束进程的详细过程

    windows上如何结束进程的详细过程,下面附详细,图文说明 在cmd下,输入  netstat   -ano|findstr  8080      //说明:查看占用8080端口的进程 在cmd下, ...

  2. 如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

    从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 ...

  3. uva 10391

    这个题,单纯做出来有很多种方法,但是时间限制3000ms,因此被TL了不知道多少次,关键还是找对最优解决方法,代码附上: #include<bits/stdc++.h> using nam ...

  4. spring框架总结(03)重点介绍(Spring框架的第二种核心掌握)

    1.Spring的AOP编程 什么是AOP?  ----- 在软件行业AOP为Aspect Oriented Programming  也就是面向切面编程,使用AOP编程的好处就是:在不修改源代码的情 ...

  5. 如何在linux下检测内存泄漏

    之前的文章应用 Valgrind 发现 Linux 程序的内存问题中介绍了利用Linux系统工具valgrind检测内存泄露的简单用法,本文实现了一个检测内存泄露的工具,包括了原理说明以及实现细节. ...

  6. Python实战之网络编程socket学习笔记及简单练习

    sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET IPv4(默认) socket.AF_IN ...

  7. PDO浅谈之php连接mysql

    一.首先我们先说一下什么是pdo?  百科上说 PDO扩展为PHP访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数 ...

  8. 深度学习入门篇--手把手教你用 TensorFlow 训练模型

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:付越 导语 Tensorflow在更新1.0版本之后多了很多新功能,其中放出了很多用tf框架写的深度网络结构(https://git ...

  9. win10 删除设备和驱动器中你不要的图标

    设备和驱动器可能有很多你不想要的东西,360云盘,百度网盘,微云-- 删除设备和驱动器中的百度云图标,360网盘图标,要去注册表 运行 regedit 点开 HKEY_CURRENT_USER\SOF ...

  10. 数据挖掘 ID3

    本文讲的是数据挖掘中的ID3,这个有很多人做了,我也没有说什么改善,只是要考试,用我考试记录的来写,具有很大主观性,如果看到有觉得不对或感觉不好,请关掉浏览器或和我说,请不要生气或发不良的言论. 决策 ...