自建仿React引擎(二)

  在《自建仿React引擎(一)》中,已實現了基礎的解析引擎,可以正確加載React編寫的代碼,但是為了兼容React的接口,目前的引擎還有很多功能需要完善。在React的技術體系里面,props,refs,state這幾個重要的概念,我們還得逐步完善。先看一看我自己總結常用的React技術關鍵點,注意,這只是關鍵點,React還有很多技術點,只是我們日常不大常使用,包括像生命周期的事件就有很多個階段,為了減少復雜性,我挑了一些常用的技術點來講解。

image

  上一篇講了createClass和createElement這兩個方法的基礎實現,本篇開始講props這個對象。在React技術中,props是一個很重要的對象,主要負責組件的參數傳遞工作,并且它有比較明顯的特性,就是在組件內部,props是只讀對象,組件內可以在getDefaultProps這個函數里去定義初始值,也可以從外部傳遞進來。我們先看看props的作用及特點。

image

  首先,我們來看看React.js里面是如何去定義一個組件的。

1.組件定義

  React.js的組件由React.createClass這個函數來定義組件(在es6標準下,還可以使用extends React.Component的方式來定義組件),每個組件必須有render方法(mixin方式下組件不是必須的)。

簡單的組件代碼如下:

var Button = React.createClass({

getDefaultProps:function(){

 return {

 test:'aaa'

 }

},

render: function() {

 return <input type="button" value={this.props.test} onclick=                {this.props.onclick}/>

 }

});

這里面,this.props就是用來接受父組件傳遞的傳數,函數getDefaultProps是用來定義參數默認值的。

簡單的組件調用代碼如下:

var Root = React.createClass({

handler: function() {

console.log('click');

},

render: function() {

return <div>

 <Button test="測試2" onclick={this.handler}/>

 </div>

 }

});

其中test為參數名,字符串"測試2"為參數值,onclick為參數名,this.handler函數為參數值。


2.參數傳遞

  我們上一篇寫的引擎已支持了大部分的props傳遞參數的情況。但是目前還不支持getDefaultProps來定義參數的默認值。根據getDefaultProps的作用及時機進行分析,只執行一次,并且在組件接收父組件傳參之前要生效。所以,我們在已寫的引擎上進行小小的改造來支持getDefaultProps。

舊的代碼:

image

改造后的代碼:

image

經過這樣子改造后,我們的引擎支持了getDefaultProps的函數了。


3.支持props.children

  children是一個數組對象,它是props一個特殊的對象,組件可以通過這個對象,獲取組件包含的子組件或者子結點的集合。引擎要支持children也比較簡單,只要定義好children對象后,在加載ReactElement時將對應的內容存放到此對象中即可。

(1)在createClass的函數中,定義children對象。

image

(2)在createElement函數中,處理children對象。

image

  經過上面兩步的簡單改造,目前我們的引擎已經支持props這個對象的正常使用了,我們更加接近React.js了。雖然我們支持了props這個重要的對象,但是props這個對象有一些特殊的參數的處理需要特殊處理,如ref,這是React.js中一個重要且復雜的參數項,下一篇我將講ref的實現機制,在這一塊我遇到了一些坎,我將會分享出來,謝謝大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • 在上一篇《自建仿React引擎(二)》中,已經針對React.js里面其中一個重要的對象props的作用以及實現進...
    飆豬狂閱讀 290評論 0 0
  • 原教程內容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記,個人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,852評論 1 18
  • 話不多說 一首涼涼送給自己 自己學后端 然后騰訊投的測試開發崗位,今天面完發現問的挺難得呀 =-= 關于實習 or...
    莫冰先生閱讀 2,309評論 0 4
  • 天寶十四載,又是一年七夕。薄紗淺窗外,新月彎彎如柳眉,像極了殿里的她…… “三郎,你我,真的可以永...
    宸兮的兮閱讀 243評論 0 1
  • 你從遙遠趕來 帶著疼痛與哀鳴 為何如此匆忙 是因為錯過了夏的繁茂秋的高爽 還是要急于催生春的生機 歲月的風啊 請不...
    不惑而歌閱讀 139評論 0 3