①React开山篇 :生命周期方法详解

备注:以下代码只是解释, 不能运行, 参考 组件的生命周期 ,和阮一峰老师的 demo 。然后个人总结的.如有错误,欢迎指出!

/**
 * 组件的声明周期 方法,详解,依次调用顺序如下:
 * @type {*|Function}
 */
var MyComponent = React.createClass({

    /**
     * 1.该方法在初始化时,只会被调用一次(并且是最先被调用),
     * 作用: 用于设置 组件的 props 的默认属性, 也可以在挂载的时候,
     *   设置props var data=['1','2']; <MyComponents value={data} />
     *
     *   尽可能的不要调用 setProps(),props 相当于const
     * @returns {{}}
     */
    getDefaultProps: function () {

        console.log('getDefaultProps');

        return {};
    },

    /**
     * 2.该方法个 getDefaultProps 有些类型, 有且只调用一次,在 getDefaultProps 之后执行
     *  作用:用来初始化每个 实例的state,在这个组件的方法里,可以访问组件的 props. 每一个 React的组件,都有自己的state
     *
     *  和props的区别: state 只存在于组件的内部,而props 在所有实例中共享
     *
     *  细节: 每次修改state,都会重新渲染组件,依次调用下列方法:
     *    shouldComponentUpdate
     *    componentWilUpdate
     *    render
     *    componentDidUpdate
     *
     *  但是不要直接修改 this.state 。而要用 setState()方法来修改
     * @returns {{}}
     */
    getInitialState: function () {

        console.log('getInitialState');
        return {};
    },

    /**
     * 3.该方法在首次渲染之前调用【在 getInitialState之后调用】, 也是再 render 方法调用之前修改 state 的最后一次机会。
     *
     */
    componentWillMount: function () {

        console.log('componentWillMount');
    },

    /**
     * 4.该方法会返回一个 virtual DOM(虚拟DOM,并非真实DOM节点)。对于一个组件来说,render方法是唯一必须的方法。 render 方法需要满足以下几点:
     *     1.每个组件都必须要有render方法
     *     2.可以返回 null、false 或 任意React组件
     *     3.只能有一个顶级父组件 
     *     4.只能通过 this.props 和 this.state 来访问数据【不能修改,即不能调用:this.setStats() 或 this.setProps() 】
     *     5.不能修改 DOM的输出
     * @returns {XML}
     */
    render: function () {
        console.log('render');

        return <div></div>;
    },

    /**
     *5.该方法不会在服务端被渲染的过程中调用。该方法被调用时,已经渲染出真实的DOM,可以在方法中通过this.getDOMNode()来访问到真实的DOM。
     * 推荐使用 React.findDOMNode();
     */
    componentDidMount: function () {

        console.log('componentDidMount');

    },

    /*=================以下方法是组件创建成功后的存在期交互方法,如:(click,change等)============================================*/
    /**
     依次调用顺序为:
     1、componentWillReceiveProps
     2、shouldComponentUpdate
     3、componentWillUpdate
     4、render
     5、componentDidUpdate
     */

    /**
     * 1.
     *  不知道对不对,暂时这么理解:
     *   当 props 发生改变,componentWilReceiveProps 会被调用,该方法接受一个参数,即被改变的 props,
     *   用于组件 props 变化之后,更新state
     */
    componentWillReceiveProps: function (nextProps) {
        if (nextProps.checked !== undefined) {
            this.setState({
                checked: nextProps.checked
            })
        }
    },

    /**
     * 2.
     * 作用: 改方法返回  布尔值, 用于判断是否需要调用 render 和后面的 componentWilUpdate componentDidUpdate方法,
     * 如何使用: 当我们确定 组件的 props 或者 state 的改变不需要重新渲染,即可以 重写该方法,返回 false 即可
     */
    shouldComponentUpdate: function (nextProps, nextState) {
        return this.state.checked === nextState.checked;
        //return false 则不更新组件
    },

    /**
     * 3. 该方法 和 componentWillMount类似
     *    componentWillMound 和 componentWillUpdate 的区别:
     *      相同点:  都在是 渲染组件之前调用。
     *      不同点:  componentWillMount 是在初始化调用,而componentWillUpdate 是在存在期间的 交互方法调用
     *
     * 注意事项: 不要在此方法再去更新props 或者  state
     */
    componentWillUpdate: function (object_nextProps, object_netState) {

    },

    /**
     * 该方法和 componentDidMount 类似:
     *   在组件被重新渲染之后调用,
     *  作用: 可以在这里访问,并修改 DOM
     */
    componentDidUpdate: function (object_prevProps, object_prevState) {

    },

    /**
     * 该方法在 组件被销毁时调用.
     *
     * 作用:在componentDidMount添加的任务都需要在该方法中撤销。 比如创建的定时器 或者 事件监听器
     *
     * 当再次装载组件时,以下方法会被依次调用:
     *
     *   1、getInitialState
     *   2、componentWillMount
     *   3、render
     *   4、componentDidMount
     */
    componentWillUnmount: function () {

    },


    
     // 有时候需要从组件中获取真实的 DOM节点, 就需要使用  ref属性
       var Area = React.createClass({
                        render: function(){
                            this.getDOMNode(); //render调用时,组件未挂载,这里将报错

                            return <canvas ref='mainCanvas'>
                        },
                        componentDidMount: function(){
                            var canvas = this.refs.mainCanvas.getDOMNode();
                            //这是有效的,可以访问到 Canvas 节点
                        }

ReactDOM.render(
        <MyComponent/>,
    document.getElementById('example')
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,373评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,732评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,163评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,700评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,036评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,425评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,737评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,421评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,141评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,398评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,908评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,276评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,907评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,018评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,772评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,448评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,325评论 2 261

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • ——亚心 做一朵云啊 ...
    1木子业阅读 123评论 0 0
  • 今天和我叔讨论了一上午今天写点什么,无果,我让他把以前拍的照片发给我,他说他以前电话上有叫我自己翻,翻着翻着翻着发...
    半斤橙子八两叔阅读 120评论 2 0
  • 视唱练耳学科起源于法国,最初只是理论家圭多为教会的唱诗班开设的歌唱训练,成立之初是想解决唱诗班的音准问题和视...
    Mars410阅读 3,918评论 1 1