自建仿React引擎(四)

  去年后面一段時間處于忙和亂的狀態(tài),一直沒有騰出時間精力來寫完這個主題吕朵。最近在各種節(jié)奏捋順了之后猎醇,抽空這個專題的最后一章寫完,有始有終努溃。


  回歸正題硫嘶,在上一篇《自建仿React引擎冊(三)》中,已經針對React.js里面其中一個重要的對象refs的作用以及實現(xiàn)進行了講解梧税,接下來音半,我準備講解state的作用及實現(xiàn)機制则拷。

  首先,我們來看看state在React.js中的作用及特點曹鸠,具體看下圖。

image

  state這個對象與UI的渲染緊密關聯(lián)斥铺,React.js的VDOM也是基礎state的不同狀態(tài)進行差量更新彻桃,當時我由于項目的時間緊,差量更新這一塊被我直接跳過了(后來惡補了一下晾蜘,發(fā)現(xiàn)React.js的差量更新技術的實現(xiàn)方式是另外一種方式邻眷,使用的是代理模式,覺得React的作者真是高手剔交,用代理模式實現(xiàn)起來更加的簡潔肆饶,以后找個專題再分享這種實現(xiàn)方式)。

  根據(jù)上圖的思路岖常,我們開始著手完善state對象的開發(fā)驯镊。

1.創(chuàng)建state這個對象,state初始化就是一個空的字面直接量對象竭鞍,比較簡單卵贱。

config.state = {};

2.創(chuàng)建完對象后谜疤,我們還要提供setState的方法,setState這個方法可以簡單的拆分成三步,先更新state的值臀玄,再刷新UI界面,最后再執(zhí)行回調函數(shù)梅割,所以可以簡單的實現(xiàn)這個方法僚稿。

config.setState = function(state,fn) {

    this.state = DeepCopy.copy(this.state, state);//差量替換

    this.forceUpdate(fn);//更新UI,此處應該先進行差量比對后再更新UI

};

3.要實現(xiàn)更新UI界面丐怯,我們還要提供forceUpdate的方法喷好,forceUpdate的方法干的事就是更新UI界面,所以此方法的具體實現(xiàn)如下响逢。

config.forceUpdate = function(fn) {

       this.refs = {};

       CurrentClass.setCurrent(this);

       CurrentClass.setCurrentState(this);

       var _node = this.render();

       CurrentClass.setCurrentState(null);

       this.realDOM.parentElement.replaceChild(_node, this.realDOM);

       this.realDOM = _node;

      setTimeout(function checkMount() {//檢查結點是否正常加載绒窑,萬惡的IE7\IE8

          if(config.realDOM.ownerDocument.body.contains(config.realDOM))           {

              fn && fn();

          } else {

              setTimeout(checkMount, 50);

          }

      }, 50);

};

4.我們還需要去添加getInitialState方法的調用時機,由于只運行一次舔亭,并且在render組件的時候可以使用默認值些膨,所以這個方法的調用時機只有放在createElement的方法里,在該方法添加如下的代碼钦铺。

//創(chuàng)建初始化的state

if(vDom.getInitialState != undefined &&

     typeof(vDom.getInitialState) === 'function') {

      vDom.state = vDom.getInitialState();

}

  經過簡單的4步改造后订雾,一個支持state的類React引擎就完成了。至此矛洞,一個簡易版的仿React.js的引擎已經實現(xiàn)洼哎,目前在生產環(huán)境上運行良好烫映。懶得去上傳源碼,發(fā)個之前生產環(huán)境的超鏈接噩峦,整個引擎的源碼需要的話可以找我锭沟。

  React.js這個輕量級框架其實并不復雜,可快速上手识补,最重要的一點族淮,可以幫助前端開發(fā)人員建立良好的面向對象編程思想,后面附上幾張我自己整理的react.js技術要點圖凭涂。

image.gif

  上圖簡要的回答了什么是單元祝辣?什么是模塊?什么是組件切油?這三個問題

image
image
image

  理解好上面這6個對象的作用及特點以及組件的生命周期蝙斜,也就掌握了React.js的技術了。

  《前端修煉手冊》這四篇文章記錄我個人在創(chuàng)造類React引擎的心路歷程澎胡,從構思到上線孕荠,自己一人花了兩周時間實現(xiàn)從0到1,最終成功的上線滤馍,對于一個當時剛入門的前端菜鳥來講岛琼,這是件很勵志的事。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末巢株,一起剝皮案震驚了整個濱河市槐瑞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阁苞,老刑警劉巖困檩,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異那槽,居然都是意外死亡悼沿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門骚灸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糟趾,“玉大人,你說我怎么就攤上這事甚牲∫逯#” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵丈钙,是天一觀的道長非驮。 經常有香客問我,道長雏赦,這世上最難降的妖魔是什么劫笙? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任芙扎,我火速辦了婚禮,結果婚禮上填大,老公的妹妹穿的比我還像新娘戒洼。我一直安慰自己,他們只是感情好允华,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布施逾。 她就那樣靜靜地躺著,像睡著了一般例获。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曹仗,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天榨汤,我揣著相機與錄音,去河邊找鬼怎茫。 笑死收壕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的轨蛤。 我是一名探鬼主播蜜宪,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祥山!你這毒婦竟也來了圃验?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤缝呕,失蹤者是張志新(化名)和其女友劉穎澳窑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供常,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡摊聋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栈暇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻裁。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖源祈,靈堂內的尸體忽然破棺而出煎源,到底是詐尸還是另有隱情,我是刑警寧澤新博,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布薪夕,位于F島的核電站,受9級特大地震影響赫悄,放射性物質發(fā)生泄漏原献。R本人自食惡果不足惜馏慨,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姑隅。 院中可真熱鬧写隶,春花似錦、人聲如沸讲仰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鄙陡。三九已至冕房,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趁矾,已是汗流浹背耙册。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毫捣,地道東北人详拙。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像蔓同,于是被迫代替她去往敵國和親饶辙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容