• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    React 組件渲染和更新的實現代碼示例

    來源:懂視網 責編:小采 時間:2020-11-27 22:00:45
    文檔

    React 組件渲染和更新的實現代碼示例

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

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

    當調用render方法時,render會去調用一個map方法,根據傳入參數的不同,把被render的對象分為以下三類:
    * 文本
    * 原生
    * 自定義標簽

    文本

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

    原生標簽

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

    自定義標簽

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

    更新

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

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

    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"));

    執行結果:

    頁面打印:
    say: Hello Cynthia
    點擊文本,頁面內容更新成:
    write: Hello Cynthia

    與更新相關的屬性和方法如下:

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

    文本

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

    自定義標簽

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

    原生標簽

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

    總結

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

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

    文檔

    React 組件渲染和更新的實現代碼示例

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 2022免费国产精品福利在线| 国内精品久久久久久野外| 无码精品视频一区二区三区| 亚洲国产人成精品| 香蕉久久夜色精品升级完成| 蜜桃麻豆www久久国产精品 | 欧美日韩专区麻豆精品在线| 精品视频久久久久| 一本久久精品一区二区| 欧美jizzhd精品欧美| 91麻精品国产91久久久久| 亚洲七七久久精品中文国产| 午夜福利麻豆国产精品| 久久国产成人精品麻豆| 91视频精品全国免费观看| 青青青青久久精品国产h久久精品五福影院1421| 国产小呦泬泬99精品| 国产精品视频一区二区三区四| 国产高清国产精品国产专区| 色婷婷久久久SWAG精品| 伊人精品久久久久7777| 国产精品亚洲一区二区三区在线| www.亚洲精品| 久久这里只有精品视频99| 久久免费精品视频| 国产精品大白天新婚身材| wwwvr高清亚洲精品二区| 精品人妻va出轨中文字幕| 久久国产美女免费观看精品| 亚洲处破女AV日韩精品| 日本欧美国产精品第一页久久| 国产精品亚洲片在线观看不卡 | 2021国产精品视频网站| 婷婷精品国产亚洲AV麻豆不片| 国产精品亚洲午夜一区二区三区| 国内精品视频在线观看| 国内精品人妻无码久久久影院 | 精品久久久久久成人AV| 久久久WWW免费人成精品| 国产精品久久久久久福利漫画| 久久五月精品中文字幕|