在《自建仿React引擎(一)》中,已實現了基礎的解析引擎,可以正確加載React編寫的代碼,但是為了兼容React的接口,目前的引擎還有很多功能需要完善。在React的技術體系里面,props,refs,state這幾個重要的概念,我們還得逐步完善。先看一看我自己總結常用的React技術關鍵點,注意,這只是關鍵點,React還有很多技術點,只是我們日常不大常使用,包括像生命周期的事件就有很多個階段,為了減少復雜性,我挑了一些常用的技術點來講解。
上一篇講了createClass和createElement這兩個方法的基礎實現,本篇開始講props這個對象。在React技術中,props是一個很重要的對象,主要負責組件的參數傳遞工作,并且它有比較明顯的特性,就是在組件內部,props是只讀對象,組件內可以在getDefaultProps這個函數里去定義初始值,也可以從外部傳遞進來。我們先看看props的作用及特點。
首先,我們來看看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。
舊的代碼:
改造后的代碼:
經過這樣子改造后,我們的引擎支持了getDefaultProps的函數了。
3.支持props.children
children是一個數組對象,它是props一個特殊的對象,組件可以通過這個對象,獲取組件包含的子組件或者子結點的集合。引擎要支持children也比較簡單,只要定義好children對象后,在加載ReactElement時將對應的內容存放到此對象中即可。
(1)在createClass的函數中,定義children對象。
(2)在createElement函數中,處理children對象。
經過上面兩步的簡單改造,目前我們的引擎已經支持props這個對象的正常使用了,我們更加接近React.js了。雖然我們支持了props這個重要的對象,但是props這個對象有一些特殊的參數的處理需要特殊處理,如ref,這是React.js中一個重要且復雜的參數項,下一篇我將講ref的實現機制,在這一塊我遇到了一些坎,我將會分享出來,謝謝大家。