真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

React性能優(yōu)化

1.shouldComponentUpdate

城中ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!

        一個(gè)組件更新時(shí),無(wú)論是設(shè)置了新的props/調(diào)用了setState方法/調(diào)用forceUpdate方法,React都會(huì)調(diào)用該組件所有子組件的render方法。在組件樹(shù)深度嵌套或render方法十分復(fù)雜的頁(yè)面上這可能會(huì)帶來(lái)延遲。

        組件的render方法有時(shí)候會(huì)在不必要的情況下被調(diào)用。如:在組件渲染過(guò)程中沒(méi)有使用props或state值,或組件的props或state并沒(méi)有在父組件重新渲染時(shí)發(fā)生改變時(shí),重新渲染這個(gè)組件會(huì)得到和已存在的虛擬DOM結(jié)構(gòu)一模一樣的結(jié)構(gòu),這樣的設(shè)計(jì)過(guò)程是沒(méi)有必要的。

        React提供的組件生命周期方法:shouldComponentUpdate可以幫助React正確地判斷是否需要調(diào)用指定組件的render方法。

        shouldComponentUpdate返回false即可以不調(diào)用組件的渲染方法,并使用之前渲染好的虛擬DOM;返回true則是讓React調(diào)用組件的渲染方法并計(jì)算出新的虛擬DOM。默認(rèn)返回true,因此組件總是會(huì)調(diào)用render方法。

        在組件首次渲染時(shí),shouldComponentUpdate方法不會(huì)被調(diào)用。

        shouldComponentUpdate方法接收兩個(gè)參數(shù),即新的props和新的state,以幫助你決定是否重新渲染:

var SurveyEditor = React.createClass({

    shouldComponentUpdate:function (nextProps, nextState) {

        return nextProps.id !== this.props.id;

    }

});

        對(duì)于給定同樣的props和state總是渲染出同樣結(jié)果的組件,我們可以添加React.addons.PureRenderMixin插件來(lái)處理shouldComponentUpdate。

        這個(gè)插件會(huì)重寫(xiě)shouldComponentUpdate方法,并在該方法內(nèi)對(duì)新老props及state進(jìn)行對(duì)比,如果發(fā)現(xiàn)它們完全一致則返回false,如上面的例子。

var EditEssayQuestion = React.createClass({

    mixin: [React.addons.PureRenderMixin],

    propTypes: {

        key: React.PropTypes.number.isRequired,

        onChange: React.PropTypes.func.isRequired,

        onRemove: React.PropTypes.func.isRequired,

        question: React.PropTypes.object.isRequired

    },

    render: function () {

        var description = this.props.question.description || "";

        return (

            

                

                

            

        );

    },

    handleChange: function (ev) {

        var question = merge(this.props.question, { description: ev.target.value });

        this.props.onChange(this.props.key, question);

    },

    handleRemove: function () {

        this.props.onRemove(this.props.key);

    }

});

        如果props或state結(jié)構(gòu)較深或較復(fù)雜,對(duì)比的過(guò)程會(huì)比較緩慢。為減少這種情況帶來(lái)的問(wèn)題,可以考慮使用不可變的數(shù)據(jù)結(jié)構(gòu),比如:Immutable.js,或使用不可變性輔助插件。

    2.不可變性輔助插件

        在需要比較對(duì)象以確認(rèn)是否更新時(shí),使用不可變的數(shù)據(jù)結(jié)構(gòu)能讓shouldComponentUpdate方法變得更加簡(jiǎn)單。

        可以使用React.addons.update來(lái)確保組件的不可變性。React.addons.update接受一個(gè)數(shù)據(jù)結(jié)構(gòu)和一個(gè)配置對(duì)象??梢栽谂渲脤?duì)象中傳入$slice、$push、$unshift、$set、$merge和$apply。

var React = require('react/addons');

var Divider = require('./divider');

var DraggableQuestions = require('./draggable_questions');

var SurveyForm = require('./survey_form');

var EditYesNoQuestion = require('./questions/edit_yes_no_question');

var EditMultipleChoiceQuestion = require('./questions/edit_multiple_choice_question');

var EditEssayQuestion = require('./questions/edit_essay_question');

var SurveyActions = require("../flux/SurveyActions");

var update = React.addons.update;

var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;

var SUPPORTED_QUESTIONS = {

    yes_no: EditYesNoQuestion,

    multiple_choice: EditMultipleChoiceQuestion,

    essay: EditEssayQuestion

};

var SurveyEditor = React.createClass({

    getInitialState: function () {

    return {

        dropZoneEntered: false,

        title: '',

        introduction: '',

        questions: []

    };

},

    render: function () {

        var questions = this.state.questions.map(function (q, i) {

            return SUPPORTED_QUESTIONS[q.type]({

                key: i,

                onChange: this.handleQuestionChange,

                onRemove: this.handleQuestionRemove,

                question: q

            });

        }.bind(this));

    var dropZoneEntered = '';

    if (this.state.dropZoneEntered) {

        dropZoneEntered = 'drag-enter';

    }

        return (

            

                

                    

                    

                        

                            title={this.state.title}

                            introduction={this.state.introduction}

                            onChange={this.handleFormChange}

                        />

                        Questions

                        

                            {questions}

                        

                        

                            className={'drop-zone well well-drop-zone ' + dropZoneEntered}

                            onDragOver={this.handleDragOver}

                            onDragEnter={this.handleDragEnter}

                            onDragLeave={this.handleDragLeave}

                            onDrop={this.handleDrop}

                        >

                            Drag and drop a module from the left

                        

                        

                            

                        

                    

                

            

        );

    },

    handleFormChange: function (formData) {

        this.setState(formData);

    },

    handleDragOver: function (ev) {

        // This allows handleDropZoneDrop to be called

        // https://code.google.com/p/chromium/issues/detail?id=168387

        ev.preventDefault();

    },

    handleDragEnter: function () {

        this.setState({dropZoneEntered: true});

    },

    handleDragLeave: function () {

        this.setState({dropZoneEntered: false});

    },

    handleDrop: function (ev) {

        var questionType = ev.dataTransfer.getData('questionType');

        var questions = update(this.state.questions, {

            $push: [{ type: questionType }]

        });

        this.setState({

            questions: questions,

            dropZoneEntered: false

        });

    },

    handleQuestionChange: function (key, newQuestion) {

        var questions = update(this.state.questions, {

            $splice: [[key, 1, newQuestion]]

        });

        this.setState({ questions: questions });

    },

    handleQuestionRemove: function (key) {

        var questions = update(this.state.questions, {

            $splice: [[key, 1]]

        });

        this.setState({ questions: questions });

    },

    handleSaveClicked: function (ev) {

        SurveyActions.save({

            title: this.state.title,

            introduction: this.state.introduction,

            questions: this.state.questions

        });

    }

});


    3.深入調(diào)查拖慢應(yīng)用的部分

        React.addons.Perf插件能找到添加shouldComponentUpdate的最佳位置。

        首先在Chrome控制臺(tái)中運(yùn)行React.addons.Perf.start();該命令會(huì)啟動(dòng)采集快照。

        然后在頁(yè)面操作后運(yùn)行React.addons.Perf.stop();

        最后再在控制臺(tái)運(yùn)行React.addons.Perf.printWaster();會(huì)輸出列表,列表中包含組件和組件耗費(fèi)時(shí)間。對(duì)于沒(méi)有改變props和state的組件可以設(shè)置shouldComponentUpdate:function(){return false;}

        

    4.鍵(key)

       列表中使用key屬性。作用:給React提供一種除組件類(lèi)之外的識(shí)別子組件的最小變化。

項(xiàng)目地址:https://github.com/backstopmedia/bleeding-edge-sample-app

參考書(shū):《React引領(lǐng)未來(lái)的用戶(hù)界面開(kāi)發(fā)框架》


當(dāng)前標(biāo)題:React性能優(yōu)化
網(wǎng)站鏈接:http://weahome.cn/article/jecoip.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部