当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台。

React组件
    React实现了UI=Fn(State)的思想,组件内部有自己的状态和初始的属性,组件在某一个时刻都有一个确定的状态,状态是不断变化的,变化的状态驱动着UI渲染,一切就这么简单。React让UI组件化,一个最小的组件实现,需要一个render方法即可。

 import React, { Component } from 'react'
 var Dialog = React.createClass({
     render: function(){
         return(
             <div>
                 Hello React
            </div>
         )
     }
 })

组件化方便组合重用,组件有自己的生命周期,详情请阅官方文档: http://reactjs.cn/react/docs/component-specs.html

让我们来看看React组件的生命周期:

getDefaultProps: function () {
    return{
        //在组件类创建的时候调用一次,然后返回值被缓存下来。这是第一个触发的方法,返回的值可以用this.props访问,此值在所有实例间共享
    }
}
getInitialState: function () {
    return{
        //在组件挂载之前调用一次。返回值将会作为 this.state 的初始值,这是第二个触发的方法
    }
}
componentWillMount: function(){
    //在初始化渲染执行之前立刻调用,只会调用一次
    //如果在这个方法内调用 setState,render() 将会感知到更新后的 state,将会执行仅一次渲染,尽管 state 改变了。
}
componentWillReceiveProps: function (nextProps){
    //该方法在初始化渲染的时候不会调用
    //在组件接收到新的 props 的时候调用。
    //这个方法里给你在渲染之前根据传入的属性来更新状态的机会
    this.setState({title: nextProps.dialog.get('title')});
}
shouldComponentUpdate: function(nextProps, nextState) {
    //该方法在初始化渲染的时候不会调用, 在使用 forceUpdate 方法的时候也不会。
    //返回布尔值,true表示渲染组件,false表示本次不会运行render渲染调用,默认返回true
    // 在接收到新的 props 或者 state,将要渲染之前调用。
    //如果确定新的 props 和 state 不会导致组件更新,则此处应该 返回 false
}
componentWillUpdate: function (nextProps, nextState) {
    //该方法在初始化渲染的时候不会调用
    //在接收到新的 props 或者 state 之前立刻调用.使用该方法做一些更新之前的准备工作.
    //当shouldComponentUpdate返回true时会在render之前调用.
    //你不能在这个方法中使用 this.setState()。如果需要更新 state 来响应某个 prop 的改变,请使用 componentWillReceiveProps。
}
render: function () {
   //初始化渲染的时候会调用,在第一次初始化渲染的时候不理会shouldComponentUpdate的返回值
   //因为shouldComponentUpdate默认返回true,而第一次初始化渲染时候,shouldComponentUpdate是不会调用的,不管你返回true或false。
   //有点绕,多读几遍。
   //当不是初始化渲染时,如果shouldComponentUpdate返回false,则不会调用render方法。
   //在这里可以使用this.props和this.state来获取数据,请不要在这个方法里改变state
}
componentDidUpdate: function (prevProps, prevState) {
    //该方法在初始化渲染的时候不会调用
    //组件render方法后调用此方法,在组件的更新已经同步到 DOM 中之后立刻被调用,使用该方法可以在组件更新之后操作 DOM 元素。
}
componentDidMount: function(){
   //在初始化渲染执行之后立刻调用,只会调用一次
   //组件已经加载到dom里,在这里可以和浏览器交互,直接操作页面上原始的Dom元素,比如$.ajax调用等等
   window.addEventListener("keydown", this.listenKeyboard, true);
}
componentWillUnmount: function() {
    //在组件从 DOM 中移除的时候立刻被调用。在该方法中执行任何必要的清理,比如无效的定时器,或者清除在 componentDidMount 中创建的 DOM 元素。
    window.removeEventListener("keydown", this.listenKeyboard, true);
}

React组件页面触发结果如下:

第一次页面加载时候组件的生命周期如下:
getDefaultProps -> getInitialState -> componentWillMount -> render ->componentDidMount

如果时在Redux(后面会讲到)里加载组件,则生命周期如下:
getDefaultProps -> getInitialState -> componentWillMount -> render ->componentDidMount
-> componentWillReceiveProps -> shouldComponentUpdate

第二次生命周期:
componentWillReceiverProps -> shouldComponentUpdate -> componentWillUpdate -> render
-> componentDidUpdate

如果shouldComponentUpdate返回false,则 componentWillUpdate -> render -> componentDidUpdate这三个方法不会被触发:
componentWillReceiverProps -> shouldComponentUpdate

父子组件之间通过属性来传递数据,属性可以是普通字符串也可以是回调函数
兄弟组件之间可以给每个组件设置一个ref属性,然后同样可通过属性来传递此ref数据
但是建议不要这么做,这样结合过于紧密,正确的做法应该是通过消息来解决,

该是Flux出场的时候了,Flux是facebook推的一种解决方案,实现这种方案的框架非常之多,
该是Redux出手的时候了,它是Flux的一种实现,它让组件之间的交互,状态的维护变得简单快乐,简单快乐,简单快乐,重要的事重复说三遍。

Redux有一些基本概念
===================================
action:
    事件消息对象,有一个必需的type键,对消息预处理,可以发起ajax请求数据。然后dispatch消息。

 export function dialogAction(data, e) {
     return {
         type: ActionTypes.DIALOG,
         data: data
     }
 }

reduce:  
    订阅感兴趣的消息type,对消息数据进一步的加工 ,返回的state数据即以props传入React 组件

 const initialItem = Immutable.fromJS({
     title: "",
     item: {},
     isVisible: false,
     ok: null,
     cancel: null
 })

 export default function dialog(state = initialItem, action) {
     switch(action.type) {
         case ActionTypes.DIALOG:
             return state.set("title", title).set("isVisible", action.data.isShow).set("ok", action.data.ok).set("cancel", action.data.cancel)
         default:
             return state
     }
 }

component: 
    React组件,接受Redux以props传入的actions和reduce state data,在React组件里用this.props.xxx和this.props.actions.xxx访问

 import React, { Component } from 'react'
 import classNames from 'classnames'

 var DialogBox = React.createClass({
     render: function () {
         let dailogHeader = <div className="grx-modal-dialog-header">
             <input type="image" src="/static/img/dialog/close_00.png"
                 title="关闭"
                 onClick={this.props.actions.dialogAction({isShow: false})}/>
             <h5>
                 {this.state.title}
             </h5>
         </div>
         let dialogBody = <div className="grx-modal-dialog-content">
             {this.props.children}
         </div>
         let dialogFooter = <div>...</div>
         return (
             <div className="grx-modal-dialog-wrap">
                 {overlay}
                 <div className="grx-modal-dialog" style={dialogStyles}>
                     {dailogHeader}
                     {dialogBody}
                     {dialogFooter}
                 </div>
             </div>
         )
     }
 })
 export default DialogBox

====================================
组合reduce
====================================

 import { combineReducers } from 'redux'
 const reducers = combineReducers({
     form,
     items,
     dialog
 })

派发的消息,会挨个传入组合的reduce里,谁对消息感兴趣谁就接受此消息即可。
这样组件之间通过消息通讯,正所谓高内聚低媾合,组件之间不需要彼此知道彼此是谁,我只对数据感兴趣,那么数据怎么和组件关联上的呢,请看下面:

====================================
链接component和reduce
====================================

 import { bindActionCreators } from 'redux'
 import { connect } from 'react-redux'
 import * as AllActions from '../actions'
 export default connect(state => ({
     form: state.form,
     items: state.items,
     dialog: state.dialog,
 }), dispatch => ({
     actions: bindActionCreators(AllActions, dispatch)
 }))(App)

这一步把组件和reduce返回的state链接里起来,也就是说dialog reduce返回的数据,是驱动dialog组件的UI更新,这一步比较关键,好在redux给你做了,这样让状态的管理特别简单快乐,简单快乐,简单快乐。

React和Flux(Redux)
================================
    Redux里用户在页面视图上的交互会触发dom事件,dom事件会派发消息即action,消息除了必需的type之外还可以携带数据,携带的数据可以发起服务器请求获取,然后传给对这个消息感兴趣的reduce,reduce判断自己对某个消息感兴趣后,会对数据进行加工处理,最终返回一个数据对象,即state,返回的state会被Redux作为当前reduce所绑定组件的props传入React组件内部,在这个时候Redux的事件被React的事件接管进入React组件的生命周期内,React组件触发React组件的一系列事件方法,当然包括重要的render方法的调用,从而驱动了UI的更新。

在前端JS的历史舞台终于革命性的出现了一颗闪耀的新星,野心之大前所未见。
    React+Flux让前端(web+mobile)阿猿们从此变的简单快乐,简单快乐,简单快乐。

野心勃勃的React组件生命周期的更多相关文章

  1. React组件生命周期小结

    React组件生命周期小结 下面所写的,只适合前端的React.(React也支持后端渲染,而且和前端有点小区别,不过我没用过.) 相关函数 简单地说,React Component通过其定义的几个函 ...

  2. React—组件生命周期详解

    React—组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...

  3. 1.4 React 组件生命周期

    1.4.1 组件 React 中组件有自己的生命周期方法,简单理解可以为组件从 出生(实例化) -> 激活 -> 销毁 生命周期 hook.通过这些 hook 方法可以自定义组件的特性. ...

  4. React组件生命周期过程说明

    来自kiinlam github94 实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidM ...

  5. React组件生命周期过程说明【转】

    实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 实例化完成后的更新 getI ...

  6. 深入React组件生命周期

    上篇博文使用React开发的一些注意要点对React开发的一些重点进行了简单的罗列总结,虽然也提到了React生命周期,但只略微小结,在此单独写篇React生命周期的总结. 在组件的整个生命周期中,随 ...

  7. 3. React 组件生命周期介绍

            React 中的每个组件都有三个阶段,这三个阶段构成了组件完整的生命周期.组件的生命周期为]); return; } this.setState({name: event.target ...

  8. react组件生命周期过程

    实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 实例化完成后的更新 getI ...

  9. react组件生命周期

    1. Mounting/组建挂载相关 (1)componentWillMount 组件将要挂载.在render之前执行,但仅执行一次,即使多次重复渲染该组件或者改变了组件的state (2)compo ...

随机推荐

  1. sql server项目死活启动不了的问题

    报错没截图, 关键字"sessionfactory",tomacat 能够启动,但是网页打开是错误的 解决:c盘索引文件冲突,删除了 发生数据库c3p0错误,tomcat启动没玩没 ...

  2. 第二章 NIO入门

    传统的同步阻塞式I/O编程 基于NIO的非阻塞编程 基于NIO2.0的异步非阻塞(AIO)编程 为什么要使用NIO编程 为什么选择Netty 第二章 NIO 入门 2.1 传统的BIO编程 2.1.1 ...

  3. 微信webview

    会露出灰色的地步 https://segmentfault.com/q/1010000004295291 有说用iscroll5来解决,但是明显有bug啊 https://segmentfault.c ...

  4. 联合体union和大小端(big-endian、little-endian)

    1.联合体union的基本特性——和struct的同与不同 union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以 ...

  5. 实现View的移动的方法总结

    btw:这篇博客的内容其实算是<Android开发艺术探索>的一篇读书笔记,在书本的知识上加了一点自己的理解,并用自己的话描述出来.<Android开发艺术探索>是一本不错的书 ...

  6. javascript版快速排序和冒泡排序

    var sort = (function () { //快速排序 var quickSort = { partition: function (array, low, high) { if (low ...

  7. cookie详解

    一.cookie详解 (1)设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="userId ...

  8. table表单中的td内容两端对齐

  9. 初始通过 FastClick.notNeeded 方法判断是否需要做后续相关处理

    其实前面几篇文章大家都遇到一些错误,很多时候呢,我并没有直接回复解决方案,不是LZ不想告诉大家,如果不想那就不写这个了,估计博客园啊CSDN啊那么多写博客的,很少有人把现用框架分享出来,既然分享就毫不 ...

  10. Spring 相关jar包详细介绍

    文章转自:http://blog.csdn.net/farawayhome/article/details/6623946 aspectj目录下是在Spring框架下使用aspectj的源代码和测试程 ...