react是什么

react是开发出来用来促进UI交互的,创建带有状态的、可复用的UI组件的IU库

react不仅可以在浏览器端使用,还可以在服务器端使用,还可以两端一起使用。

react的底层概念:运用的是virtual DOM(虚拟DOM),然后根据UI组件的状态变化,有选择的渲染DOM的节点树,尽可能的操作最少的DOM来更新组件。

虚拟DOM是怎么工作的

1.在Web开发中,需要将数据的变化实时反映到UI上,就需要对DOM进行操作,但是复杂频繁的DOM操作会产生性能瓶颈。所以DOM就引入了虚拟DOM的机制。

实际上,在React中,render方法得到的实际上不是真实的DOM节点,而仅仅是轻量级的JavaScript对象,我们称之为虚拟DOM.

2.虚拟DOM是React的一大亮点,具有批处理(batching)和高效的Diff算法。无需担心性能问题而毫无顾忌的随时刷新整个页面,由虚拟DOM来确保只对界面上真正变化的部分进行实际的DOM操作。

了解React虚拟DOM的机制就可以更好的理解React组件的生命周期,而且对于进一步优化React组件的生命周期。

如果没有虚拟DOM,就相当于重置innerHTML,在数据变动比较大的情况下,比较合理,但是如果只有一小部分数据变化时,也要重置整个innerHTML,这就造成了很大的浪费。

两者的比较

innerHTML: render html string + 重新创建所有的DOM元素

virtual DOM: render Virtual DOM + diff + 必要的DOM更新。

3.和DOM操作比起来,js计算还是非常便宜的。Virtual DOM + diff 显然要比render string慢,但是后面的DOM操作就比较便宜了。

DOM完全不属于JavaScript,也不在JavaScript引擎中,JavaScript实际上是一个独立的引擎,而DOM其实是浏览器引出的一组让JavaScript操作HTML文档的API而已,在即时编译的时代下,调用DOM的开销是很大的,而Virtual DOM的执行完全都在JavaScript引擎中,不存在这个开销。

4.React.js相对于直接操作原生DOM有很大的性能优势,很大程度上归功于虚拟DOM的batching和diff,batching把所有的DOM操作搜集起来,一次性提交给真实的DOM,

什么是虚拟DOM

React中,将真实的DOM抽象成一个JavaScript对象,也就是虚拟DOM,比如构造一个虚拟的DOM.

var element = {
element: 'ul',
props: {
id: 'list'
},
children: [
{element:'li',props:'li1',children:['这是第一个li']},
{element:'li',props:'li2',children:['这是第二个li']}
]
} //element.js
function Element(tagName,props,children){
this.tagName = tagName;
this.props = props;
this.children = children;
} module.exports = function(tagName,props,children){
return new Element(tagName,props,children)
} var el = require('./element');
var ul = el('ul',{id:'ulist'},[
el('li',{id:'list1'},['1list']),
el('li',{id:'list2'},['list2'])
])
//ul只是一个JavaScript对象表示的DOM结构,页面上并没有这个结构,可以根据这个ul构建真正的<ul>
Element.prototype.render = function(){
var d = document.createElement(tagName);
//获取props
var props = this.props;
for (key in props) {
var propValue = props[key];
d.setAttribute(key,propValue);
} //获取children
var children = this.children || [];
children.forEach(function(child){
// if (child instanceof Element){
// tnode = child.render();
// }
// else{
// tnode = document.createTextNode(child);
// }
var childEl = (child instanceof Element) ? child.render():document.createTextNode(child)
d.appendChild(childEl);
})
return d;
} var ulRoot = ul.render();
document.body.appendChild(ulRoot);
//ulRoot是真正的DOM节点,把它塞入文档中,这样body里面就有了真正的<ul>的DOM结构。

在React中,也有一个render函数,当React中有state转移的过程,所以每次state有变化之后,就会触发render函数,重新构造一个虚拟DOM树,对比新旧DOM树的差别,记录下差别,然后只针对差异部分对应的真实DOM进行操作。先总结到这里,下一篇博客,详细讲解Diff算法。

React的思想的更多相关文章

  1. React 设计思想

    https://github.com/react-guide/react-basic React 设计思想 译者序:本文是 React 核心开发者.有 React API 终结者之称的 Sebasti ...

  2. [转] React同构思想

    React比较吸引我的地方在于其客户端-服务端同构特性,服务端-客户端可复用组件,本文来简单介绍下这一架构思想. 出于篇幅原因,本文不会介绍React基础,所以,如果你还不清楚React的state/ ...

  3. React设计思想

    熟悉一个新技术的关键是熟悉他的特色和理念 React框架本身和我们常用的JavaScript MVC框架,如:AngularJS,Backbone,Ember等,没有直接的可比性.在React的官方博 ...

  4. React 同构思想

    作者:yangchunwen React比较吸引我的地方在于其客户端-服务端同构特性,服务端-客户端可复用组件,本文来简单介绍下这一架构思想. 出于篇幅原因,本文不会介绍React基础,所以,如果你还 ...

  5. 浅谈React编程思想

    React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...

  6. React 编程思想翻译及学习笔记

    第一步:把UI图按组件层次结构拆分开 FilterableProductTable (橙色): 包含整个例子 SearchBar (蓝色): 接收所有用户输入 ProductTable (绿色): 基 ...

  7. React 核心思想之声明式渲染

    React 发展很快,概念也多,本文目的在于帮助初学者理清 React 核心概念. React 及 React 生态 React 的核心概念只有 2 点: 声明式渲染(Declarative) 基于组 ...

  8. [译]Thinking in React

    编者按 使用React的思想来构建应用对我在实际项目中以及帮助他人解决实际问题时起到了很大作用,所以我翻译此文来向那些正在或即将陷入React或React-Native深坑的同胞们表示慰问.网上已经有 ...

  9. 【原】react中如何使用jquery插件

    react的思想是虚拟dom,提倡最好较少dom的操作,可是我们在写网页的时候,有些复杂的交互还是离不开jquery插件的.而且当你把jquery直接拿来用的时候,你会发觉会报错,要么是找不到那个插件 ...

随机推荐

  1. inetdev_init && inetdev_destroy

    inetdev_init为传入设备分配和绑定ip控制块,查看其调用关系如下: fs_initcall(inet_init)---->inet_init---->ip_init----> ...

  2. linux驱动基础系列--Linux mmc sd sdio驱动分析

    前言 主要是想对Linux mmc子系统(包含mmc sd sdio)驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.块设备驱动.设备模型等也不进行详细说明原 ...

  3. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  4. Win10打开照片提示“无效的注册表值”解决方法

    1.点开开始菜单,右键单击,选择“以管理员运行”[键盘win键+R]输入PowerShell. 2.输入Get-AppxPackage *photo* | Remove-AppxPackage后回车. ...

  5. 2015多校第6场 HDU 5354 Bipartite Graph CDQ,并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5354 题意:求删去每个点后图是否存在奇环(n,m<=1e5) 解法:很经典的套路,和这题一样:h ...

  6. 在ubuntu上配置LAMP架构

    1. 安装MySQL /* ubuntu默认进入系统是普通用户 所以在真实工作中,我们会得到root的授权. 所以我们需要用sudo做一切只有root才能完成的操作. */ [root@LAMP ~] ...

  7. C语言比较巧妙的字符串分割程序

    在解析字符串时,能够解析的给出每个字符串的长度.内容.以及每个字符串的第一个字符的地址. short i; ; //切割之后的字符串的个数 ,ItemLen[],Idx[], ThCommandLen ...

  8. leetcode 121 122 123 . Best Time to Buy and Sell Stock

    121题目描述: 解题:记录浏览过的天中最低的价格,并不断更新可能的最大收益,只允许买卖一次的动态规划思想. class Solution { public: int maxProfit(vector ...

  9. hdu 4632(区间dp)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65535 K (Java/ ...

  10. 【原创】IIS7.5优化,支持同时10万个请求

    背景 IIS7.5是微软推出的最新平台IIS,性能也较以前有很大的提升,但是默认的设置配不适合很大的请求.但是我们可以根据实际的需要进行IIS调整,使其性能更佳,支持同时10万个请求. 以下方案,通过 ...