在今年對 instagram web 進行全新的設計的時候,我喜歡在寫 react 元件的時候,用上一些 es6+ 的新特性。請允許我列舉這些能夠改變你寫 react 應用方式的新特性。比起以往,這些特性能夠使你擼起碼來更加容易、有趣!
使用 es6+ 來編寫 react 元件最明顯的變化就是我們定義元件(類)的語法的方式。我們可以用定義乙個繼承了react.component
的es6 類來代替原本使用react.createclass
的來建立類的方式:
class
photo
extends
react.component
/>;
}}
我們可以發現這種寫法使得定義元件的方式變得更加簡潔:
// the es5 way
varphoto = react.createclass(,
render: function() ,
});// the es6+ way
class
photo
extends
react.component
render()
}
這樣我們可以少寫一對圓括號、乙個分號、每個方法的冒號和function
關鍵字。
所有生命週期方法都可以採用這種方式來定義。 但是componentwillmount
還可以用constructor
來代替:
// the es5 way
varembedmodal = react.createclass(,
});// the es6+ way
class
embedmodal
extends
react.component
}
在 es6+ 類中,屬性型別prop type
和預設屬性default prop
可以通過類中的static
來宣告。同時,元件的初始狀態(initial state
)可以通過 es7 的 屬性初始化(property initializers) 來完成:
// the es5 way
varvideo = react.createclass(;
},getinitialstate: function() ;
},proptypes: ,
});// the es6+ way
class
video
extends
react.component
static proptypes =
state =
}
es7 中在建構函式(constructor
)下的屬性初始化操作中的this
指向的是類的例項,所以初始狀態(initial state
)可以通過this.prop
(即傳入的引數)來設定。
react.createclass
方法在你的元件上做了一些額外的繫結工作,以確保在元件例項項的方法內部,this
指向的是元件例項自身。
// autobinding, brought to you by react.createclass
var postinfo = react.createclass();
},});
由於我們使用 es6+ 的語法定義類的時候沒有採用react.createclass
的方式,所以,這樣看來我們不得不手動來繫結這些方法中this
的指向:
// manually bind, wherever you need to
class
postinfo
extends
react.component
handleoptionsbuttonclick(e) );
}}
幸運的是,通過 es6+ 的箭頭函式( arrow functions )和屬性初始化( property initializers )這兩個特性使得把函式的this
指向繫結為元件的例項變得非常的簡單:
class
postinfo
extends
react.component
); }
}
函式體內的this
物件,繫結定義時所在的物件,而不是使用時所在的物件。而恰好屬性初始化( property initializers )剛好在這個作用域內。
在 es6+ 中對 物件字面量的擴充套件 使得我們可以在物件字面量中使用表示式來對屬性命名。如果是在 es5 中,我們也許只能這樣做:
var form = react.createclass(;
statetoset[inputname + 'value'] = e.target.value;
this.setstate(statetoset);
},});
但是,在 es6+ 中,我們不僅可以在物件字面量屬性的定義中使用表示式,還有使用使用 字串模板 :
class
form
extends
react.component
value`]: e.target.value,
});}}
我們在編寫元件的過程中,經常遇到要從父元件要把自己的很多屬性多傳給子元件的情況。有了 es6+ 的 析構 和 擴充套件運算子 特性,這變得非常的方便:
class
autoloadingpostsgrid
extends
react.component
= this.props;
return (
this.handleloadmoreclick}>load more
);}}
我們可以把 擴充套件運算子 屬性和普通的屬性結合起來使用,這樣使得我們可以利用優先順序來使用屬性的預設值和屬性的覆蓋。下面這個元素會獲得乙個override
的類(class
),及時this.props
中有傳遞classname
屬性。
classname="override">
…div>
下面這種寫法,可以給元素設定預設的classname
:
classname="base"
>
…div>
我希望你能夠享受 es6+ 的這些特性給你在編寫 react.js 中帶來的好處。感謝我的同事他們為這篇文章作出的貢獻,還有,特別的感謝 babel 團隊,使得我們可以隨意的使用這些特性。 React裡用到的ES6語法
箭頭函式相當於匿名函式,簡化了函式的定義 格式 單條語句 可以省略 和return eg x x x 單個引數 x,y x y 多個函式 x 返回物件 在物件外面有個 多條語句 不能省略 和return this的指向 不用箭頭函式,this指向window或者undefined 用箭頭函式,thi...
es6中reduce的用法 Es6基礎語法
1 this this代表當前正在執行的物件 function fn fn window const obj new fn fn.call 2 箭頭函式 1 箭頭函式的this是在定義的時候就固定不變了 2 箭頭函式 沒有自己的this 3 箭頭函式 不能當類 構造器 使用 不可以 new 4 箭頭...
利用ES6語法重構React元件詳解
一 建立元件 es6 class建立的元件語法更加簡明,也更符合j ascript。內部的方法不需要使用function關鍵字。react.createclass import react from react const mycomponent react.createclass export d...