如今最热门的前端技术,毫无疑问就是React。前端
React起源于Facebook公司的内部项目,他们认为如今的MVC不能知足他们的扩展需求,因为他们的代码库很是庞大,组织也很是复杂,因此每当添加一个新的功能时就变得异常的复杂,因此他们为了解决这个问题,提出了React。web
那么React是什么呢? 其官网上说的是A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES。一个Javascript库,用于构建用户界面。算法
React主要解决什么问题呢?架构
他们的官网上有这么一句话:We built React to solve one problem: building large applications with data that changes over time.app
构建那些会随时间变化的大型应用。dom
在整个web的MVC架构中,你能够认为React是整个视图层,而且是一个高效的视图层。React提供了和以往不同的看待视图层的方式,它以组件开发为基础。对于React而言,你的页面都是由一个个组件构成的,你能够经过分割组件的方式去实现复杂的页面或者某个功能模块。而且这些组件是能够被复用的。ide
React的另外一大特色是:虚拟DOM节点。它让页面的渲染更加的高效,而且比直接操做真实DOM更加的可控。这两大特色使得React有了强大的渲染页面的能力。ui
Virtual DOM 虚拟DOM
传统的web应用,操做DOM通常是直接更新操做的,可是咱们知道DOM更新一般是比较昂贵的。而React为了尽量减小对DOM的操做,提供了一种不一样的而又强大的方式来更新DOM,代替直接的DOM操做。就是Virtual DOM
,一个轻量级的虚拟的DOM,就是React抽象出来的一个对象,描述dom应该什么样子的,应该如何呈现。经过这个Virtual DOM去更新真实的DOM,由这个Virtual DOM管理真实DOM的更新。this
为何经过这多一层的Virtual DOM操做就能更快呢? 这是由于React有个diff算法,更新Virtual DOM并不保证立刻影响真实的DOM,React会等到事件循环结束,而后利用这个diff算法,经过当前新的dom表述与以前的做比较,计算出最小的步骤更新真实的DOM。code
Components 组件
在DOM树上的节点被称为元素,在这里则不一样,Virtual DOM上称为commponent。Virtual DOM的节点就是一个完整抽象的组件,它是由commponents组成。
State 和 Render
React是如何呈现真实的DOM,如何渲染组件,何时渲染,怎么同步更新的,这就须要简单了解下State和Render了。state属性包含定义组件所须要的一些数据,当数据发生变化时,将会调用Render重现渲染,这里只能经过提供的setState方法更新数据。
组件的生命周期
一个React组件的生命周期分为三个部分:实例化、存在期和销毁时。
当组件在客户端被实例化,第一次被建立时,如下方法依次被调用:
一、getDefaultProps
二、getInitialState
三、componentWillMount
四、render
五、componentDidMount
getDefaultProps
对于每一个组件实例来说,这个方法只会调用一次,该组件类的全部后续应用,getDefaultPops 将不会再被调用,其返回的对象能够用于设置默认的 props(properties的缩写) 值。
getInitialState
对于组件的每一个实例来讲,这个方法的调用有且只有一次,用来初始化每一个实例的 state,在这个方法里,能够访问组件的 props。
getInitialState 和 getDefaultPops 的调用是有区别的,getDefaultPops 是对于组件类来讲只调用一次,后续该类的应用都不会被调用,而 getInitialState 是对于每一个组件实例来说都会调用,而且只调一次。
componentWillMount
该方法在首次渲染以前调用,也是再 render 方法调用以前修改 state 的最后一次机会。
render
该方法会建立一个虚拟DOM,用来表示组件的输出。对于一个组件来说,render方法是惟一一个必需的方法。
注意:render方法返回的结果并非真正的DOM元素,而是一个虚拟的DOM.
componentDidMount
该方法不会在服务端被渲染的过程当中调用。该方法被调用时,已经渲染出真实的 DOM,能够再该方法中经过this.getDOMNode()
访问到真实的 DOM。
此时组件已经渲染好而且用户能够与它进行交互,好比鼠标点击,手指点按,或者其它的一些事件,致使应用状态的改变,你将会看到下面的方法依次被调用
一、componentWillReceiveProps
二、shouldComponentUpdate
三、componentWillUpdate
四、render
五、componentDidUpdate
componentWillReceiveProps
组件的 props 属性能够经过父组件来更改,这时,componentWillReceiveProps 未来被调用。能够在这个方法里更新 state,以触发 render 方法从新渲染组件。
shouldComponentUpdate
若是你肯定组件的 props 或者 state 的改变不须要从新渲染,能够经过在这个方法里经过返回 false
来阻止组件的从新渲染,返回 `false 则不会执行 render 以及后面的 componentWillUpdate,componentDidUpdate 方法。
componentWillUpdate
这个方法和 componentWillMount 相似,在组件接收到了新的 props 或者 state 即将进行从新渲染前,componentWillUpdate(object nextProps, object nextState) 会被调用,注意不要在此方法中再去更新 props 或者 state。
componentDidUpdate
这个方法和 componentDidMount 相似,在组件从新被渲染以后,componentDidUpdate(object prevProps, object prevState) 会被调用。能够在这里访问并修改 DOM。
componentWillUnmount
每当React使用完一个组件,这个组件必须从 DOM 中卸载后被销毁,此时 componentWillUnmout 会被执行,完成全部的清理和销毁工做,在 conponentDidMount 中添加的任务都须要再该方法中撤销,如建立的定时器或事件监听器。
当再次装载组件时,如下方法会被依次调用:
一、getInitialState
二、componentWillMount
三、render
四、componentDidMount