摘要:但是在中,可以通過關(guān)鍵字來實現(xiàn)類的繼承的使用可以使得繼承意義更加明確并且值得一提的是,如果你使用來定義的組件,那么可以在類的構(gòu)造器里面,用簡單的的聲明方式來替代方法。
原文:The 10 min ES6 course for the beginner React Developer
譯者:Jim Xiao
著名的80/20定律可以用來解釋React和ES6的關(guān)系。因為ES6增加了超過75個新特性,但是根據(jù)我自身學(xué)習(xí)React經(jīng)驗,只使用了不到20%的ES6新特性。
注意: 在這篇文章中,為了避免引起混淆,我把JavaScript近似等同于ECMAScript(ES), 而ES6 = ES5 + 新特性,所以ES6和ES5都相當(dāng)于JavaScript。他們之間的區(qū)別就是支持不同的語法以及ES6新加了一些功能。
當(dāng)我從Angular 1和純ES5轉(zhuǎn)到React時,我看了一些教程,當(dāng)了解到箭頭函數(shù)和解構(gòu)語句時,我十分迷惑,不知道哪些語法來自React, 哪些語法來自ES6。
但是在大概一周之后,我基本上確定了,像{name}這樣的語法只能寫在React中(說明該語法不是來自ES6)。
這并不是一個完整的教程,只是我在React代碼中使用ES6的小結(jié)。那我們開始吧。
Let和const在舊版的JavaScript (ES5)中,我們使用關(guān)鍵字var來聲明變量, 利用JavaScript變量提升的黑魔法, 我們甚至可以在沒有聲明變量前,就使用該變量:
// ES5 console.log(myVar); // undefined var myVar = 10;
這種變量提升可能帶來一些難以預(yù)見的結(jié)果。但是在ES6就不會存在了。通過使用let或者const關(guān)鍵字,你必須先聲明變量,才能使用它:
// ES6 console.log(myVar) // ReferenceError: myVar is not defined let myVar = 10
從下面的結(jié)果可以看出,const和let的不同在于,用const聲明變量,該變量值是不能更改的,而let可以更改:
// ES6 let x = 10 const y = 20 x = 25 // Ok y = 30 // TypeError: Assignment to constant variable.不再使用分號
ES6以及所有相關(guān)的工具都很好地支持了自動分號插入。所以,ES6的代碼中可以幾乎去掉所有的分號, 使代碼看起來更加簡潔:
//ES5 var theNumber = 10; console.log(theNumber); //ES6 - 可以去掉分號 let theNumber = 10 console.log(theNumber)
這并不是一個很大的改動,但確實是讓代碼看起來更舒服,尤其當(dāng)你是CoffeeScript代碼風(fēng)格的粉絲。
箭頭函數(shù)在ES5語法中,如果聲明一個函數(shù),需要這樣寫:
// ES5 var sum = function(a, b) { return a + b }
在ES6中,你可以通過箭頭函數(shù)快速聲明函數(shù):
// ES6 const sum = (a, b) => {return a + b}
并且,如果你只需要簡單的一行函數(shù),甚至可以去掉return關(guān)鍵字
// ES6 const sum = (a, b) => a + b // 一行箭頭函數(shù)會自動返回結(jié)果
還有非常重要的一點,就是箭頭函數(shù)的this是綁定了父級作用域的上下文:
function DogWorldContext() { this.age = 0 setInterval(function growUp() { this.age++ console.log(this.age) }, 1000) } var worldWithStandardFunction = new DogWorldContext() // 將會每秒打印NaN,因為growUp是普通函數(shù),它有自己this關(guān)鍵字的指向
function DogWorldContext() { this.age = 0 setInterval(()=> { this.age++ console.log(this.age) }, 1000) } var worldWithArrowFunction = new DogWorldContext() // 將會每隔1s打印出1,2,3...
箭頭函數(shù)沒有自己的this綁定。該this上下文就是父級作用域的上下文,本例子中,就是DogWorldContext。
解構(gòu)知名開發(fā)者網(wǎng)站Developer.mozillar.org對解構(gòu)的定義是: 從數(shù)組和函數(shù)中提取值,并存儲為變量。
提取對象的屬性值是非常常見的做法。比如下面的代碼:
// ES5; this.props.user = {name: "Daniel", age : 32} alert(this.props.user.name + " " + this.props.user.age);
為了使之更易讀, 我們把屬性值賦給變量:
// ES5; this.props.user = {name: "Daniel", age : 32} var name = this.props.user.name; var age = this.props.user.age; alert(name + " " + age);
在ES6中,我們可以使用對象解構(gòu):
// ES6; this.props.user = {name: "Daniel", age : 32} const {name} = this.props.user const {age} = this.props.user alert(name + " " + age)
我們甚至可以簡寫為一行:
// ES6; this.props.user = {name: "Daniel", age : 32} const {name, age} = this.props.user alert(name + " " + age)對象字面量
ES6允許我們用更少的代碼表示對象鍵值對。
// ES5 str = "HELLO" number = 20 obj = { str: str, number: number }
在ES6中,上面的代碼可以變?yōu)椋?/p>
// ES6 str = "HELLO" number = 20 obj = { str, number} // obj = {str: "HELLO", number: 20}類,構(gòu)造器和方法
以前的JavaScript沒有class這個關(guān)鍵字,為了創(chuàng)建一個簡單的Dog類,需要使用構(gòu)造函數(shù)來模擬這個類:
// ES5 function Dog(name, weight){ this.name = name; this.weight = weight; } Dog.prototype.speak = function(){ alert("Woof, woof … my name is: " + this.name); }; // 用new關(guān)鍵字初始化對象 var dog = new Dog("Spike", 25); // 調(diào)用方法 dog.speak(); // alerts “Woof, woof … my name is: Spike”
你可以通過ES5的構(gòu)造函數(shù)得到一個基本的對象和該對象的方法,但是并沒有得到”開箱即用”的類。那么看看ES6的class是怎么做的:
//ES6 class Dog { constructor(name, weight) { this.name = name this.weight = weight } speak() { alert("Woof, woof … my name is: " + this.name) } } const dog = new Dog("Spike", 25) dog.speak()類的繼承和React
ES5中可以通過原型鏈繼承的方式實現(xiàn)繼承。但是在ES6中,可以通過關(guān)鍵字extends來實現(xiàn)類的繼承:
var Greeting = createReactClass({ render: function() { returnHello, {this.props.name}
; } });
ES6 extends的使用可以使得繼承意義更加明確:
class Greeting extends React.Component { render() { returnHello, {this.props.name}
; } }
并且值得一提的是,如果你使用extends來定義React的組件,那么可以在類的構(gòu)造器里面,用簡單的this.state =...的聲明方式來替代getInitialState()方法。
Filter函數(shù)比如我們有以下的數(shù)組:
const numbers = [5,1, 20, 90, 8, 22, 33, 9]
如果想通過上面的數(shù)組來創(chuàng)建一個新的數(shù)組,而里面的值都是大于10的。在ES5的語法下,你可能需要一個for循環(huán),或者一些相似的操作(比如: jQuery的each())。
現(xiàn)在,我們有了ES6,就可以使用filter函數(shù)來遍歷數(shù)組中的所有值,并且留下那些滿足條件的值。
//ES6 const notDigits = numbers.filter( function(value) {return value > 9}) console.log(notDigits) // 打印出 [20,90,22,33] // 或者使用箭頭函數(shù): const notDigits1 = numbers.filter( (value) => {return value > 9} // 或者使用箭頭函數(shù)默認(rèn)返回的形式去掉return關(guān)鍵字: const notDigits2 = numbers.filter( (value) => value > 9 )Map函數(shù)
Map函數(shù)可能是JavaScript最不被人重視的函數(shù)之一,即使它在ES5語法就有了?;旧?,如果你需要遍歷一個數(shù)組,你就可以使用map函數(shù)。
比如我們有跟上面例子一樣的數(shù)組:
const numbers = [5,1, 20, 90, 8, 22, 33, 9]
如果想操作數(shù)組,就可以使用map函數(shù):
numbers.map( (n) => console.log(n)) // 還可以加第二個參數(shù), index numbers.map( (n, index) => console.log(n + " is the " + index + " value from the array ") ) // 或者我們想創(chuàng)建新的數(shù)組 const double= numbers.map( (n) => n*2 )
你將會在React中經(jīng)??吹?b>map(), 很多時候它會用來顯示一個項目列表:
render() { return( this.props.items.map( (item, key) =>{item}
) }
以上就是我在寫React代碼中使用最多的ES6特性,可能會有一些偏頗以及帶有主觀性,但是我絕沒有貶低ES6其他新功能實用性的想法。如前所述,還有許多其他ES6在這里沒有涉及,但這些概念允許你輕松地從ES5 React升級到新的ES6語法,并了解來自React以及來自新ES6功能的內(nèi)容。Cheers and happy coding!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/95461.html
摘要:特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...
摘要:函數(shù)式編程前端掘金引言面向?qū)ο缶幊桃恢币詠矶际侵械闹鲗?dǎo)范式。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。 JavaScript 函數(shù)式編程 - 前端 - 掘金引言 面向?qū)ο缶幊桃恢币詠矶际荍avaScript中的主導(dǎo)范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數(shù)式編程越來越多得受到開發(fā)者的青睞。函數(shù)式編程是一種強(qiáng)調(diào)減少對程序外部狀態(tài)產(chǎn)生改變的方式。因此,...
閱讀 2299·2021-09-22 10:56
閱讀 1628·2021-09-07 10:11
閱讀 1873·2019-08-30 15:54
閱讀 2350·2019-08-30 15:44
閱讀 2368·2019-08-29 12:40
閱讀 3100·2019-08-28 18:25
閱讀 1811·2019-08-26 10:24
閱讀 3242·2019-08-23 18:39