精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

來自 Rust 生態的強烈沖擊?談談 Leptos 在語法設計上的精妙之處

開發 前端
拋開 Rust 的上手難度不談,在語法設計上,Leptos 的語法設計我認為比 Solid 要精妙得多。這是一種更成熟的語法構思。

過去很長一段時間,前端框架們都在往響應式的方向發展。大家都在基于 signal 實現自己的底層。這種趨勢看上去非常火熱,給人一種前端框架不往這個方向發展就落后了一樣。

同時又由于 React hooks 的深遠影響,函數式 + 響應式成為了不少前端心中最理想的前端框架模樣。Solid 成為了這種模式里最具代表性的框架。

但是,盡管如此,我依然對他保持一種不太愿意接納的態度,并不是說我對 solid 不熟悉,或者抗拒接受新的知識,其根本原因,還是在語法設計上的問題。

基于響應式能實現細粒度更新,拋去虛擬 DOM 的 diff 成本,性能能夠得到很大的提升。這種設想其實非常美好,但是,在語法設計上會面臨巨大的挑戰。

一、Solid.js

我們來觀察并分析一下 solid.js 在語法設計上存在的問題。

function Counter() {
  const [count, setCount] = createSignal(0)
  return <div onClick={() => setCount(count() + 1)}>
    Count: {count()}
  </div>
}

在這個案例中,我們可以使用 createSignal 創建一個響應式數據。這里的問題就在于,返回的響應式數據 count 他不是一個數據,而是一個獲取數據的 getter 方法。

因為底層基于 Proxy 來實現,我們需要監聽到數據的變化,那么就需要借助 Proxy 中的 getter 方法來實現,因此反饋到語法上,count 就只能是一個函數。

當我們想要將其渲染到 JSX 中時,在 solid 中就將其設計成 {count()}。這里設計成 count() 是沿用了 React 對于 JSX 的理解,想要傳入一個值給 JSX。

當我們在點擊事件中使用該響應式數據時。

setCount(count() + 1);

如果你要精準理解 count(),那么理解成本就有點高了,這里的 count() 執行,表達了兩層含義。

初始化時,count() 表示會隱式的收集依賴。在跟蹤范圍內,調用 getter 會導致調用 getter 的函數依賴于對應的 signal。當 signal 更新時,這些依賴都會被重新執行。

更新時是依賴重新執行,不只是 count() 重新執行。許多人理解成 count 重新執行,那么在語義上會有更進一步的沖突。

例如:

const double_count = () => count() * 2

// 或者在 jsx 中
<div>count: {count()}</div>

更新時,當我們通過點擊等行為觸發更新,此時當我們使用 count(),則只是簡單的計算出 count 當前的值。

setCount(count() + 1);

這里其實就是語法設計上的沖突問題。同樣的函數執行,由于編譯手段的強勢侵入,在不同的場景里表達了不同的含義。

其實 solid.js 的開發團隊也希望 count 就像是直觀表達的那樣,他不是一個 getter,而就是直接是一個值,因此就有類似于如下的語法設計

// 這個時候就變得正常了
setCount((count) => count + 1);

但是很顯然,如果直接完全像 React 那樣符合直覺的語法設計,響應式的能力就得不到保證了。因此這是擁抱響應式不得不做出的犧牲。

Solid 的這個語法割裂,在組件傳參的語法設計中,表現得尤為明顯。

例如你看下面這段代碼,令人意外的是,props.msg 是可以具備響應性的,當我還不熟悉 Solid 的時候直接大吃一驚。

function Message(props: Props) {
  return <div>
    <h1>
      hello, this message is: {props.msg}
    </h1>
    <Child />
  </div>
}

這是擁抱響應式的無奈之舉。因為在組件傳參的時候,其實可能存在兩種類型,一種類型是普通數據,例如:

<Message msg='hello world' />

而另外一種,就是響應性數據,例如:

<Message msg={msg()} />

如果我希望一個字段,他可以傳普通類型、也可以傳響應性類型,那么問題就來了,子元素內部如何判斷父組件到底會傳什么類型過來呢?

solid 的解決方案就是,只允許在父組件傳參時,這樣寫 {msg()}。下面這種寫法就會報錯。

<Message msg={msg} />

這樣做的好處就是 solid 可以利用編譯手段去識別 msg() 然后深入子組件內部做依賴收集,從而讓子組件內部不需要做額外的判斷。但是付出的代價就是語法割裂更嚴重了。

除此之外,正因為有黑科技的強勢侵入,因此 solid 中的 JSX 與 React 中的 JSX 表現并完全不一致,也不能按照常規的表達式去理解。

語法的割裂是我不愿意擁抱 Solid 的主要原因。

二、Leptos

讓我們來看看 rust 生態中,同樣是基于 signal 來實現的響應式框架 Leptos 是如何在語法設計上解決 solid 的割裂問題的。

首先,一個非常巧妙的設計就是,在 rsx 中,狀態傳入的括號中,直接接收的就是一個函數

#[component]
fn App() -> impl IntoView {
  let (count, set_count) = create_signal(0);

  view! {
    <div>{count}</div>
  }
)

這里類似于 React 的 render props

這樣看著就非常的舒服。因為聲明的 count 是一個函數,模板渲染中需要的也是一個函數,語法表現就很一致,按照這個設計,我們就可以不用寫 count() 了。

這個小的語法設計細節的調整,讓整個語法都變得更加一致。

當我們更新時

set_count.update(|count| *count += 1)

當我們要往子組件中傳遞參數時

<ProgressBar progress=count />

當語法規則發生一些簡單的調整,我們會發現,在大多數情況下,count 的使用都保持了一致性,而不是像 solid 那樣在不同的場景之下有不同的行為。

當然,如果我們要在邏輯中獲取到 count 的值時,仍然需要使用 count() 來達到目的。不過這在語義上是沒有沖突的。

let double = move || count() * 2;

與 solid 一樣,這段代碼類似于計算屬性,這個匿名函數也會被收集成為一個依賴,從而讓 double 也具備響應性。

當我們往組件內部傳參數時,rust 可以通過定義參數宏來接收和設置參數的類型、默認值等。

#[component]
pub fn ProgressBar(
  #[prop(default = 100)]
  max: u16,
  #[prop(into)]
  progress: Signal<i32>
) -> impl IntoView {
  view! {
    <progress max=max value=progress />
  }
}

這個東西類似于面向對象中的裝飾器,是給函數/屬性提供額外能力的一種語法。

他有如下幾種用法。

#[attribute="value"]
#[attribute(key="value")]
#[attribute(value)]

例如,我們將一個普通函數定義為一個組件,則對該函數使用如下的宏定義。

#[component]

接收一個參數 max,默認值為 100。

#[prop(default = 100)]
max: u16,

支持任意類型的值傳入,然后調用 .into() 去轉化。

#[prop(into)]
progress: Signal<i32>

因此,有了這個宏的幫助,我們的 progress 屬性可以接收一個響應式屬性,也可以接收一個普通屬性。通過這種方式解決了 solid 在語法設計上面臨的困境。

<ProgressBar progress=count />
<ProgressBar progress=|| 100 />

三、總結

拋開 rust 的上手難度不談,在語法設計上,Leptos 的語法設計我認為比 solid 要精妙得多。這是一種更成熟的語法構思。

但是響應式方案本身在語法上確實存在挑戰,例如在 Solid 中還存在更嚴重的問題就是使用解構語法會導致數據失去響應性,因此最終也只能靠各種編譯手段盡量抹平差異。但黑科技加多了,一不小心就在重新設計語法了。因此到目前為止,我依然更喜歡 React,他的語法設計足夠簡潔,編譯手段的侵入性足夠小,更符合 JavaScript 的語法邏輯。

責任編輯:姜華 來源: 這波能反殺
相關推薦

2011-05-24 13:33:45

2016-09-09 12:51:23

PhxSQL原則局限性

2021-05-31 07:58:59

Spring設計模式

2014-02-10 10:14:50

MongoDB語法數據庫

2021-08-30 09:30:29

Kafka高性能設計

2021-10-18 08:28:03

Kafka架構主從架構

2011-04-15 13:12:09

.NETMEF

2024-08-07 10:18:00

2013-07-15 10:41:28

大數據阿里余額寶

2017-03-20 18:03:51

2023-01-05 11:27:27

技術架構

2022-07-17 06:53:24

微服務架構

2017-03-14 15:46:30

AndroidiOS不同之處

2022-06-07 08:31:44

JavaUnsafe

2010-04-20 11:47:46

云計算開源硬件

2010-05-06 10:09:44

Oracle in

2022-02-17 15:52:08

區塊鏈安全技術

2024-09-30 16:25:40

2018-07-16 14:52:59

無線共存技術

2012-03-02 13:53:15

水果忍者手機游戲UI
點贊
收藏

51CTO技術棧公眾號

亚洲电影一级黄| 国产福利视频网站| 日韩精品久久久久久免费| 日韩黄色碟片| 午夜亚洲影视| 日韩欧美在线123| 日韩久久精品一区二区三区| 国产精品1000| 成人网av.com/| 国产精品色眯眯| 欧美在线视频一区二区| 日本少妇xxxx软件| a级毛片免费观看在线| 国产精品视屏| 亚洲精选视频在线| 成人看片人aa| 在线观看亚洲大片短视频| 日韩脚交footjobhdboots| 国产成人免费av在线| 日韩一区二区欧美| 2025韩国理伦片在线观看| 青梅竹马是消防员在线| 一区二区亚洲| 精品国产免费久久| 妺妺窝人体色www看人体| 一级片在线免费观看视频| 国产在线观看91一区二区三区 | 欧美深夜福利| 欧美日韩国产综合久久| 日韩区国产区| 免费激情视频网站| 在线日韩电影| 亚洲成成品网站| cao在线观看| 日本精品久久久久| 久久99久久99| 久久久99久久精品女同性| 在线视频观看91| 在线中文字幕电影| 高清不卡一二三区| 久久久欧美精品| 精品国产一区在线| 成人影院网站| 国产女人水真多18毛片18精品视频 | 国产在线观看一区二区三区| 91视频免费在观看| 丝袜av一区| 色伊人久久综合中文字幕| 欧美日韩国产免费一区二区三区| 黄色片网站在线免费观看| 欧美理论在线播放| 欧美一卡二卡在线| 人妻少妇精品无码专区二区| av网站网址在线观看| 国产精品久久99| 岛国视频一区| 91在线看视频| 国模精品一区| 亚洲男人天天操| 黄色手机在线视频| 欧美日韩在线精品一区二区三区激情综合 | 男人与禽猛交狂配| 久久97精品| 在线观看国产日韩| 日日噜噜夜夜狠狠久久丁香五月| av免费观看在线| 日韩一区二区久久| 色播久久人人爽人人爽人人片视av| 欧美日韩理论片| 天堂网在线最新版www中文网| 欧美精彩视频一区二区三区| 欧美日韩一区二区三| 国产露出视频在线观看| 国产盗摄一区二区三区| 91免费版黄色| 亚洲欧美一二三区| 欧美一区二区三区久久精品| 亚洲福利影片在线| 国产女人18毛片水真多18| 欧美日一区二区三区| 欧美日韩三级在线| 无码中文字幕色专区| 91在线观看| av午夜精品一区二区三区| 国产精品影院在线观看| 国产又爽又黄的视频| 91综合在线| 亚洲精品中文字幕av| 日韩黄色一区二区| 国产一区2区在线观看| 日韩精品一区二区三区swag| 精品一区二区三区四区五区六区| 欧美xxxx在线| 日韩小视频在线观看专区| 日韩免费高清在线| av美女在线观看| 综合色天天鬼久久鬼色| 日韩精品福利视频| 国内外激情在线| 国产欧美视频一区二区三区| 最近中文字幕免费mv| 粉嫩一区二区三区国产精品| 国产精品国产馆在线真实露脸 | 东京热无码av男人的天堂| 久久365资源| 色哟哟入口国产精品| 久久久久久久久久久网| 亚洲精品极品少妇16p| 国产亚洲一级高清| 精品视频站长推荐| 奇米影视亚洲| 一本一本久久a久久精品综合小说| 久久精品女同亚洲女同13| 欧美亚洲国产一区| 国模gogo一区二区大胆私拍| 一级黄色片在线播放| 91在线观看下载| 久久国产一区| 欧美一区二不卡视频| 国产精品视频免费| www.中文字幕在线| 9i看片成人免费高清| 日韩一区二区在线看| 免费看日本黄色片| 国产农村妇女精品一区二区| 国产69久久精品成人| 中文字幕亚洲精品一区| 国产一区二区精品久久91| 91在线免费网站| 超碰在线观看av| 国产成人在线视频网址| 亚洲电影一二三区| 欧美三级电影一区二区三区| 亚洲欧洲日韩一区二区三区| 丝袜老师办公室里做好紧好爽| 在线看片福利| 欧美tickling挠脚心丨vk| 亚洲一级Av无码毛片久久精品| 日韩国产在线| 欧美精品一二区| 国产精品第72页| 韩国午夜理伦三级不卡影院| 99九九电视剧免费观看| 国产91绿帽单男绿奴| 99国产精品99久久久久久| 欧美人与动牲交xxxxbbbb| 欧美男人天堂| 亚洲国产精品网站| 亚洲成人黄色av| 久久精品国产99久久| 国产成人在线播放| 国产熟女精品视频| 波多野结衣中文一区| 女女同性女同一区二区三区91| 91精品专区| 欧美三级一区二区| 久久久久久成人网| 免费成人在线视频观看| 97伦理在线四区| 91极品在线| 欧美xxxxx牲另类人与| 久久这里只有精品免费| 成人午夜av影视| 欧美成熟毛茸茸复古| 伊人久久综合一区二区| 亚洲精品自在久久| 少妇久久久久久久| 国产精品久久久久久久蜜臀| 在线播放av中文字幕| 欧美一区在线看| 国产精品亚洲综合| 日本韩国在线视频爽| www 日韩| 91在线视频免费观看| 成人在线免费在线观看| 国产精品免费大片| 国产欧美精品一区二区| av软件在线观看| 亚洲激情久久久| 亚洲午夜在线播放| 成人黄页毛片网站| 91精品91久久久中77777老牛| 久久91麻豆精品一区| 九九热这里只有精品6| 特级毛片www| 国产精品欧美一级免费| 一本之道在线视频| 欧美色图国产精品| 国产在线观看精品一区二区三区| 男女在线观看视频| 欧美日韩精品综合在线| 国产高清在线免费观看| 久久国产麻豆精品| 欧美亚洲免费高清在线观看 | 日本道在线观看一区二区| 台湾佬美性中文| 国产精品嫩草99av在线| 亚洲午夜久久久影院伊人| 都市激情亚洲一区| 久久亚洲欧美日韩精品专区 | 九九精品视频免费| 99视频一区二区| 中文字幕成人免费视频| 日本不卡免费一区| av一区二区在线看| 欧美特大特白屁股xxxx| 亚洲精品黄网在线观看| 狠狠躁夜夜躁人人爽视频| 一区二区三区中文免费| 高清av免费看| 欧美日韩激情在线一区二区三区| 91久久国产精品91久久性色| 最新欧美色图| 欧美国产精品人人做人人爱| 国产又粗又黄又爽视频| 精品二区三区线观看| 日本一级片在线播放| 免费成人美女在线观看.| 国自产拍偷拍精品啪啪一区二区| 午夜精品毛片| 日韩欧美精品在线不卡 | 精品国产乱码久久久久久浪潮| 香蕉污视频在线观看| 99久久伊人精品| 久久精品久久99| 免费在线观看成人| 欧美日韩在线视频一区二区三区| 国自产拍偷拍福利精品免费一| 91视频免费在线观看| 日韩经典一区| 国产99在线|中文| av中文在线| 亚洲精品一区中文字幕乱码| 丰满熟女一区二区三区| 欧美精品色一区二区三区| 三级影片在线看| 国产精品毛片高清在线完整版| 性高潮久久久久久久| 99精品国产视频| 中文字幕免费在线播放| 玖玖精品视频| 在线视频一二三区| 99久久夜色精品国产亚洲96 | 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 久久99国产精品一区| 日韩久久精品网| 亚洲激情一区二区| 欧美在线免费看视频| 日本不卡在线播放| 欧美一级做a| 国产欧美久久久久久| 日韩有码欧美| 91九色精品视频| 亚洲国产中文在线| 日本国产精品视频| 中文字幕在线直播| 国产精品成人久久久久| 羞羞视频在线免费国产| 亚洲精品视频网上网址在线观看| 四虎在线视频免费观看| 欧美日韩视频不卡| 国产精品久久免费| 色哟哟欧美精品| 国产99久久久久久免费看| 欧美性一二三区| 欧美亚韩一区二区三区| 欧美日韩激情视频8区| 一级片一级片一级片| 亚洲精品视频观看| 国产午夜福利片| 欧美午夜片欧美片在线观看| 国产午夜手机精彩视频| 尤物在线观看一区| 国产成人无码精品久在线观看| 天天av天天翘天天综合网色鬼国产| 免费观看一区二区三区毛片 | 亚洲av无码乱码在线观看性色| 色天天综合久久久久综合片| 亚洲精品国产精品国自产网站按摩| 欧美日韩在线一区二区| av av片在线看| 日韩精品小视频| 免费av不卡| 久久人91精品久久久久久不卡| 免费观看亚洲| 91在线观看免费观看 | 久久久久久久国产视频| 疯狂蹂躏欧美一区二区精品| 一二三四区在线| 色婷婷激情一区二区三区| 一级全黄裸体免费视频| 欧美mv日韩mv国产| 国产精品99999| 美女999久久久精品视频| 国产黄大片在线观看| 欧美激情三级免费| 亚洲www免费| 成人精品一二区| 欧美少妇性xxxx| www.av中文字幕| 九九九久久久精品| 青青草视频播放| thepron国产精品| 久久人妻无码aⅴ毛片a片app | 韩日成人影院| 91大片在线观看| 成人精品视频| 久久国产成人精品国产成人亚洲 | 国产成人精品无码片区在线| 欧美国产1区2区| jizz中文字幕| 亚洲国产成人一区二区三区| 日本系列第一页| 午夜精品久久久久久久99樱桃| 久久综合成人网| 欧美乱妇23p| 男男电影完整版在线观看| 亚洲精品小视频| 国产区美女在线| 26uuu另类亚洲欧美日本老年| 91精品亚洲一区在线观看| 91免费观看网站| 欧美日韩激情在线一区二区三区| 国产精品一区二区免费在线观看| 国产精品自产自拍| 年下总裁被打光屁股sp| 成人欧美一区二区三区小说| 樱花视频在线免费观看| 日韩av在线精品| 国产三级电影在线观看| 国内免费久久久久久久久久久| 国产美女视频一区二区| 亚洲三区在线| 免费看日韩精品| 欧美18—19性高清hd4k| 色综合久久中文字幕| 午夜国产在线视频| 中文字幕视频在线免费欧美日韩综合在线看 | 91精品国产色综合久久不卡98口| 午夜激情在线播放| 国产精品欧美久久| 欧美午夜不卡| 日韩精品xxx| 久久亚洲捆绑美女| 欧美巨胸大乳hitomi| 91久久精品国产91性色tv| 嫩草研究院在线观看| 欧美一区二区三区四区在线| 欧美日韩一本| 欧美日韩激情视频在线观看| 亚洲欧美日韩精品一区二区| 99久久人妻无码中文字幕系列| 午夜精品影院在线观看| 成人久久精品人妻一区二区三区| 欧美日韩福利在线观看| 1313精品午夜理伦电影| 成年女人18级毛片毛片免费| 老司机亚洲精品| 国产人妻一区二区| 亚洲精品欧美二区三区中文字幕| 中文字幕一区二区三区人妻四季| 亚洲精品一区二区三区福利| 超碰成人av| 欧美日韩另类丝袜其他| 青青国产91久久久久久| 国产精品入口麻豆| 精品国产乱码久久久久久天美| 视频在线观看你懂的| 另类视频在线观看| 亚洲精品在线国产| 热99这里只有精品| 久久精品一区四区| 国产一国产二国产三| 亚洲精品www久久久| 日韩中文影院| 国产综合动作在线观看| 91偷拍一区二区三区精品| 波多野结衣免费观看| 亚洲成年人影院| 国产特黄在线| 91沈先生播放一区二区| 免费视频久久| 91免费公开视频| 亚洲精品wwww| 国产电影一区| 乱妇乱女熟妇熟女网站| 国产精品久久久久久久久图文区 | 懂色aⅴ精品一区二区三区| 国产一区二区黄色| 日本va欧美va瓶| 免费在线观看黄色av| 欧美一三区三区四区免费在线看| 成年人国产在线观看| 亚洲v日韩v欧美v综合| 久久综合五月| 青娱乐免费在线视频| 国产亚洲激情在线| av动漫精品一区二区| 国产精品久久久久久久久电影网| 91麻豆国产香蕉久久精品|