激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - 編程技術(shù) - React核心成員表示:JSX就是個(gè)錯(cuò)誤

React核心成員表示:JSX就是個(gè)錯(cuò)誤

2021-05-25 01:01魔術(shù)師卡頌卡頌 編程技術(shù)

JSX最早由Facebook提出并推廣,在React中被廣泛用來(lái)描述視圖狀態(tài)。JSX作為JS語(yǔ)法糖,可以用JS語(yǔ)法靈活的描述視圖狀態(tài)。

React核心成員表示:JSX就是個(gè)錯(cuò)誤

近日,在一場(chǎng)關(guān)于JSX的討論中,React核心成員「Sebastian Markbåge」(Hooks作者)表示:

他更推崇SwiftUI語(yǔ)法,并認(rèn)為JSX就是個(gè)錯(cuò)誤。

React核心成員表示:JSX就是個(gè)錯(cuò)誤

JSX最早由Facebook提出并推廣,在React中被廣泛用來(lái)描述視圖狀態(tài)。

作為一種類XML的JS語(yǔ)法糖,JSX同時(shí)兼顧了兩個(gè)優(yōu)點(diǎn):

XML對(duì)樹(shù)狀結(jié)構(gòu)優(yōu)秀的表現(xiàn)力

 

不管是「嵌套」還是「屬性」,JSX都能很自然的描述。

我們可以很容易從如下JSX結(jié)構(gòu)推導(dǎo)出實(shí)際視圖效果:

  1. <div style={{color: '#f00'}}> 
  2.   i am <span>Ka Song</span> 
  3. </div> 

 JS在運(yùn)行時(shí)的靈活

 

曾有人說(shuō):

  • JSX就是擁有超能力的HTML

這里的超能力指:JSX作為JS語(yǔ)法糖,可以用JS語(yǔ)法靈活的描述視圖狀態(tài)。

  1. function App({children}) { 
  2.   return ( 
  3.     <div> 
  4.       {children || 'i am empty'
  5.     </div> 
  6.   ) 

作為對(duì)比,Vue模版語(yǔ)法的表現(xiàn)力就差很多。

然而,吾之蜜糖彼之砒霜:

受JS語(yǔ)法限制的XML

 

比如class屬于JS語(yǔ)法keyword,而class在HTML中代表「類名」。

所以當(dāng)JSX使用className作為「類名」的props時(shí)難免讓人困惑。

  1. <div className="container"></div> 

 依賴編譯

 

JSX需要先編譯為JS才能在宿主環(huán)境執(zhí)行,所以使用JSX描述視圖的框架(比如React)都需要依賴編譯工具。

這增加了項(xiàng)目環(huán)境配置的復(fù)雜度。

DSL哪家強(qiáng)?

 

到這里我們可以發(fā)現(xiàn),衡量一門(mén)DSL(領(lǐng)域相關(guān)語(yǔ)言)優(yōu)劣的標(biāo)準(zhǔn)有三點(diǎn):

  • 是否能直觀描述視圖狀態(tài)
  • 是否有靈活的編程能力
  • 原生支持還是需要編譯

讓我們按這三個(gè)維度權(quán)衡幾種不同平臺(tái)的DSL:

HTML

 

視圖描述能力:三星

編程能力:一星

不需要編譯:一星

HTML描述視圖能力最強(qiáng)(因?yàn)榕cDOM節(jié)點(diǎn)一一對(duì)應(yīng)),但是缺乏編程能力。

Pug、Vue、JSX

 

視圖描述能力:三星

編程能力:二到三星

React核心成員表示:JSX就是個(gè)錯(cuò)誤

都是在XML基礎(chǔ)上演進(jìn)的語(yǔ)法糖,擁有強(qiáng)大的描述視圖能力。

他們的區(qū)別在于「編程能力」與「模版語(yǔ)法」的束縛之間取舍。

Flutter

 

視圖描述能力:一星

編程能力:四星

使用函數(shù)調(diào)用的方式描述視圖,編程能力很強(qiáng)。

但是在描述嵌套的組件樹(shù)結(jié)構(gòu)時(shí),函數(shù)調(diào)用不如XML描述能力強(qiáng)。

比如如下HTML結(jié)構(gòu):

  1. <div> 
  2.   <p>Hello</p> 
  3.   <p>I am</p> 
  4.   <p>Ka Song</p> 
  5. </div> 

用Flutter語(yǔ)法描述:

  1. Stack( 
  2.   children: <Widget>[ 
  3.      Text("Hello"), 
  4.      Text("I am"), 
  5.      Text("Ka Song"
  6.    ], 

SwiftUI與React

 

SwiftUI作為被蘋(píng)果寄予厚望、意圖統(tǒng)領(lǐng)IOS全平臺(tái)的DSL。

React核心成員表示:JSX就是個(gè)錯(cuò)誤

在保證強(qiáng)大的編程能力同時(shí),也希望在視圖表現(xiàn)力方面做的更好。

接下來(lái)我們通過(guò)一個(gè)簡(jiǎn)單的「點(diǎn)擊加一」的計(jì)數(shù)器來(lái)對(duì)比React與SwiftUI語(yǔ)法:

React使用class語(yǔ)法:

  1. class Counter extends React.Component { 
  2.   state = { 
  3.     counter: 0 
  4.   } 
  5.   increment: () => { 
  6.     const {counter} = this.state; 
  7.     this.setState({counter: counter + 1}) 
  8.   } 
  9.   render() { 
  10.     const {counter} = this.state; 
  11.     return ( 
  12.       <> 
  13.         <p>數(shù)字:{counter}</p> 
  14.         <button onClick={this.increment}>點(diǎn)我加一</button> 
  15.       </> 
  16.     ) 
  17.   } 

SwiftUI:

  1. struct Counter : View { 
  2.     @State var counter = 0 
  3.  
  4.     func increment () { 
  5.         counter += 1 
  6.     } 
  7.  
  8.     var body: some View { 
  9.         VStack { 
  10.             Text("數(shù)字: \(counter)"
  11.             Button(action: increment) { 
  12.                 Text("點(diǎn)我加一"
  13.             } 
  14.         } 
  15.     } 

可以看到,拋開(kāi)語(yǔ)法差異,兩個(gè)框架的寫(xiě)法是很類似的。

同時(shí),SwiftUI憑借強(qiáng)大的編程能力,原生實(shí)現(xiàn)React當(dāng)前并不支持的功能:

React核心成員表示:JSX就是個(gè)錯(cuò)誤

比如,在React中,子組件要改變父組件的狀態(tài),需要父組件將「狀態(tài)」與「改變狀態(tài)的方法」傳遞給子組件。

子組件調(diào)用「改變狀態(tài)的方法」通知父組件狀態(tài)變化,父組件再傳遞變化后的「狀態(tài)」給子組件。

這種方式在React中被稱為「受控組件」。

在SwiftUI中,子組件只需要將父組件傳遞的狀態(tài)申明為@Binding,就能達(dá)到與父組件該狀態(tài)「雙向綁定」的效果。

比如上例的counter:

  1. // 從 
  2. @State var counter = 0 
  3. // 變?yōu)?nbsp;
  4. @Binding var counter 

則計(jì)數(shù)器接受父組件傳遞的counter狀態(tài),子組件counter狀態(tài)改變后會(huì)作用于父組件counter狀態(tài)。

你更喜歡哪種DSL

 

從2013年5月29日React誕生到現(xiàn)在。

經(jīng)過(guò)8年的教育,大部分React開(kāi)發(fā)者已經(jīng)接受JSX。

但是,這期間也不斷有人提出JSX的替代方案。

比如react-hyperscript。

隨著SwiftUI熱度提升,更是有人提出用其替代React中的JSX:

React核心成員表示:JSX就是個(gè)錯(cuò)誤

也有人做出模型experimental-react-like-framework

你喜歡JSX么?你覺(jué)得未來(lái)他會(huì)被誰(shuí)取代?或者他會(huì)取代誰(shuí)?

【編輯推薦】https://mp.weixin.qq.com/s/d73RPACWTGceWUXJuQe0RA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品99久久99久久久二 | 免费午夜网站 | 72pao成人国产永久免费视频 | 国产成人自拍小视频 | 嗯~啊~弄嗯~啊h高潮视频 | 草莓福利视频在线观看 | 精品久久久久久久久久久久久 | 亚洲国产精品高潮呻吟久久 | 久久久久久久久久久久久久国产 | 国产精品亚洲综合 | 国产九九九九 | 欧美日韩在线免费观看 | 日本高清com | 欧美精品v国产精品v日韩精品 | 亚洲电影免费观看高清完整版在线观 | 久久久久国产成人免费精品免费 | 日本欧美在线播放 | 国产亚洲精品久久午夜玫瑰园 | 国产精品久久久久久久成人午夜 | 欧美一区二区三区久久精品视 | 国产精品99一区二区 | 国产在线观看免费视频软件 | 黄色免费av网站 | 日本一级黄色大片 | 男女无遮挡羞羞视频 | 中文字幕一区在线观看视频 | 红杏亚洲影院一区二区三区 | av免费在线播放 | 91网站永久免费看 | 欧美成人一区二区三区 | 国产精品亚洲综合一区二区三区 | 米奇电影网 | 美女毛片儿 | 69性欧美高清影院 | 欧美一区欧美二区 | 免费网站看毛片 | 亚洲一区在线免费视频 | 久久成人国产精品 | 91av大片 | 在线观看一二区 | 中文字幕精品在线视频 |