2015-10-05 75 views
0

是什麼創建在JavaScript類的差異,因爲陣營原住民,如下圖所示:差異性做出反應原住民

class Example extends React.Component { 


render() { 
    return (

     <View style={styles.container}> 

     ..... 

     </View> 

    ); 
} 
} 


var Example = React.createClass ({ 


render() { 
    return (

     <View style={styles.container}> 

     ..... 

     </View> 

    ); 
} 
}); 

這兩種方式我需要工作,但我想知道哪種方式是更好的,或想知道差異在哪裏......

+0

這是一個基於意見的問題,但考慮例如擴展現有組件: 'class Example extends ListView {...}'。使用React.createClass({...})不太容易實現' – zvona

+0

在引入ES6類支持時閱讀博客文章可能有所幫助:https://facebook.github.io/react/blog/2015/01/ 27 /反應-v0.13.0-β-1.HTML –

回答

0

閱讀博客文章(來自Felix的評論)肯定是有幫助的。然而,在來回切換這兩個變體(第一種情況下是ES6普通的JavaScript類,第二種情況下是React的createClass)之後,我有一些'來自戰壕'的想法。

我已經在添加了ES6類之後就開始了,所以在教程中使用createClass並使用ES6開始之後,我很快切換到了它。我很高興能夠用最好的,更可讀的方式......或者我想。

很快,事實證明,用createClass創建的對象中的一些事情並不容易,或者使用純javascript處理。我傾向於編寫更多的代碼,並通過使用它來犯更多的錯誤。

第一件事:您不能將Mixins與ES6類一起使用。這可能不是一個大問題,但在React和React Native中有很多好的案例由mixin處理。我非常想念的是TimerMixin(https://www.npmjs.com/package/react-timer-mixin),它處理超時的重要情況,無論組件是否仍在屏幕上呈現。這是解決難題的真正好方法。使用ES6類沒有同樣好的方法。

第二件事:自動綁定丟失。這可能看起來不是什麼大問題,但期望組件內的「this」實際上意味着「當前對象」是很自然的。也許這是因爲其他面嚮對象語言的背景,但我一直忘記,在JavaScript中它並不那麼明顯。 React的createClass爲你自動綁定,所以當你將對象的方法作爲回調傳遞時,你實際上可以使用「this」。在這些方法內部並引用該對象。在ES6類的情況下,您需要爲這些方法手動綁定(this),或者(甚至更難看)使用箭頭函數並將pass()=> {this.method()}作爲回調,而不僅僅是this.method 。

最終我發現有更多的情況下createClass方法比ES6的變體更自然,所以我真的推薦這個。在查看了多少可讀的createClass方法後,我將所有代碼切換回來。

Zvona在評論中提到繼承 - 但它對我來說並不重要。通常,繼承是用戶組件的代碼味道。在大多數情況下做組合或Mixins要乾淨得多 - 特別是React支持在組件之間傳遞屬性。其實沒有Mixins類型強迫你做繼承,這爲許多邊緣案例打開了大門(尤其是當你涉及的代碼在構造函數中執行,在更復雜的情況下可能有一些不良副作用)