<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        React 組件渲染和更新的實現(xiàn)代碼示例

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:00:45
        文檔

        React 組件渲染和更新的實現(xiàn)代碼示例

        React 組件渲染和更新的實現(xiàn)代碼示例:最近一直寫React,慢慢就對里面的一些實現(xiàn)很好奇。最好奇的就是自定義標簽的實現(xiàn)和this.setState的實現(xiàn)。這里不分析JSX是如何解析的,所有組件都用ES5方式編寫。 組件渲染 渲染時候,我們會調(diào)用render方法。類似下面這樣: var SayHi = Rea
        推薦度:
        導(dǎo)讀React 組件渲染和更新的實現(xiàn)代碼示例:最近一直寫React,慢慢就對里面的一些實現(xiàn)很好奇。最好奇的就是自定義標簽的實現(xiàn)和this.setState的實現(xiàn)。這里不分析JSX是如何解析的,所有組件都用ES5方式編寫。 組件渲染 渲染時候,我們會調(diào)用render方法。類似下面這樣: var SayHi = Rea

        這是我畫的React對象上的一些屬性和方法。

        當(dāng)調(diào)用render方法時,render會去調(diào)用一個map方法,根據(jù)傳入?yún)?shù)的不同,把被render的對象分為以下三類:
        * 文本
        * 原生
        * 自定義標簽

        文本

        對于文本,React會實例化一個文本節(jié)點的對象,并且調(diào)用該對象的mount方法。在這個mount方法中,把文本放到一個span中,調(diào)用容器組件的innerHTML,進行渲染。

        原生標簽

        對于原生標簽,React會實例化一個處理原生標簽的對象,并且調(diào)用該對象的mount方法。在這個mount方法中,拼接一個字符串,并且不斷遞歸上面的map方法,最后把拼接好的字符串放到容器組件的innerHTML中,進行渲染。

        自定義標簽

        這個應(yīng)該是大家最好奇的。自定義標簽雖然叫標簽,其實就是一個類。實例化一個處理自定義標簽的對象后,首先React會處理自定義標簽的生命周期方法,然后再次遞歸調(diào)用子組件的render方法進而調(diào)用map方法,直至把自定義標簽分解為前兩種標簽。

        更新

        首先,我們統(tǒng)一一下認識。在React里調(diào)用this.setState()會使得組件更新,調(diào)用this.state = {}只會更改本組件的狀態(tài),但是不會使得組件更新。

        如果我要更新一個組件,我會這樣寫。

        var SayHi = React.createClass({
         getInitialState: function() {
         return {verb: 'say:'};
         },
         componentWillMount: function() {
         console.log('I will mount');
         },
         componentDidMount: function() {
         console.log('I have mounted');
         },
         changeVerb: function(){
         this.setState({verb: 'write:'});
         }
         render: function() {
         return React.createElement("div", this.changeVerb.bind(this),this.state.verb, "Hello ", this.props.name);
         }
        });
        
        React.render(React.createElement(SayHi, {name: "Cynthia"}), document.getElementById("container"));

        執(zhí)行結(jié)果:

        頁面打印:
        say: Hello Cynthia
        點擊文本,頁面內(nèi)容更新成:
        write: Hello Cynthia

        與更新相關(guān)的屬性和方法如下:

        在調(diào)用this.setState()以后,也是調(diào)用了一個map方法,根據(jù)傳入?yún)?shù)不同,依然把要更新的標簽分為文本、原生標簽、自定義標簽三類。具體處理過程如下。

        文本

        文本節(jié)點處理很簡單,判斷要更新后的文本與當(dāng)前文本是否===,不是全等就刪除原來文本,插入新文本。

        自定義標簽

        對于自定義標簽,首先根據(jù)對象的引用、key是否相同,判斷是否需要更新。如果需要更新,就繼續(xù)調(diào)用上述map方法進行子組件的更新。又是一個遞歸。但是注意,這里的map方法和渲染部分的map方法不是一個方法喲。

        原生標簽

        對于原生標簽,首先更新組件的屬性,然后update子樹,用diff算法來比較新的子樹與目前標簽的子樹的不同,形成一個差異樹,然后用patch方法,把這個差異樹更新到真正的DOM樹上。

        總結(jié)

        很復(fù)雜的過程,讓我用流水賬寫了一遍。沒能道出其中精華。以后繼續(xù)探索,寫的詳細一些。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        React 組件渲染和更新的實現(xiàn)代碼示例

        React 組件渲染和更新的實現(xiàn)代碼示例:最近一直寫React,慢慢就對里面的一些實現(xiàn)很好奇。最好奇的就是自定義標簽的實現(xiàn)和this.setState的實現(xiàn)。這里不分析JSX是如何解析的,所有組件都用ES5方式編寫。 組件渲染 渲染時候,我們會調(diào)用render方法。類似下面這樣: var SayHi = Rea
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精品尤物YW在线观看| 免费看韩国黄a片在线观看| 啊灬啊灬别停啊灬用力啊免费看| 亚洲va在线va天堂成人| 亚洲一级毛片免费在线观看| 亚洲AV人无码激艳猛片| 国产成人精品无码免费看| 国产亚洲人成无码网在线观看| 精品97国产免费人成视频 | 免费无码黄十八禁网站在线观看| 亚洲精品视频免费在线观看| 最近中文字幕完整版免费高清| 亚洲短视频男人的影院| 99在线热视频只有精品免费| 亚洲成a人片毛片在线| 99视频在线精品免费观看6| 亚洲日韩av无码中文| 免费v片视频在线观看视频| 日本高清免费中文在线看| 亚洲伊人久久精品影院| 日本视频在线观看永久免费| 亚洲天堂中文字幕在线观看| A级毛片内射免费视频| 成人午夜影视全部免费看| 亚洲AV一宅男色影视| 亚洲黄色免费网址| 亚洲av日韩av永久无码电影| mm1313亚洲精品国产| 女同免费毛片在线播放| 亚洲男人天堂2018av| 亚洲国产精品尤物YW在线观看| 最近中文字幕大全免费版在线| 亚洲国产精品成人久久久| 又黄又爽无遮挡免费视频| 久久久久久国产精品免费免费男同| 亚洲精品无码久久毛片波多野吉衣| 成年人免费观看视频网站| 中文字幕免费在线看线人动作大片 | 久久免费福利视频| 亚洲欧美日韩中文无线码| 亚洲中文字幕在线乱码|