<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
        主站蜘蛛池模板: 亚洲无删减国产精品一区| 草久免费在线观看网站| 国产成人亚洲综合一区| 男人免费视频一区二区在线观看| a级毛片免费全部播放| 18禁无遮挡无码网站免费| 亚洲熟女少妇一区二区| 亚洲一级在线观看| 你好老叔电影观看免费| 亚洲人成色777777在线观看| 91免费国产视频| 久视频精品免费观看99| 亚洲麻豆精品果冻传媒| 亚洲乱亚洲乱妇无码麻豆| 一级一黄在线观看视频免费| 在线视频精品免费| 亚洲国产美女精品久久久久∴| 亚洲av无码专区首页| 亚洲精品视频免费在线观看| 亚洲精品91在线| 久久久久成人片免费观看蜜芽 | 亚洲精品动漫人成3d在线| 亚洲最大的视频网站| 美女网站在线观看视频免费的| 天天拍拍天天爽免费视频| 亚洲精彩视频在线观看| 国产精品免费网站| 亚洲午夜无码久久久久小说 | 亚洲乱码日产一区三区| 久久免费动漫品精老司机 | 又黄又爽又成人免费视频| 九月丁香婷婷亚洲综合色| 亚洲国产免费综合| 亚洲А∨精品天堂在线| 亚洲精华国产精华精华液| 97无码免费人妻超级碰碰夜夜| 亚洲丰满熟女一区二区哦| 伊人婷婷综合缴情亚洲五月| 国产精品高清免费网站| 久久久久亚洲AV无码专区首JN | 老司机亚洲精品影院|