精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

天天操天天爱天天爽| 99国产超薄肉色丝袜交足的后果 | 国产在线|日韩| 国产精品女人毛片| 91黄在线观看| 日本高清不卡码| 久久综合av| 欧美精品一区二区不卡| 欧美大尺度做爰床戏| caoporn97在线视频| 久久这里都是精品| 亚洲www在线| 看片网址国产福利av中文字幕| 欧美日韩高清| 亚洲高清久久网| 黄大色黄女片18第一次| 欧美gv在线| 亚洲蜜臀av乱码久久精品| 欧美国产二区| 理论片中文字幕| 蜜桃视频第一区免费观看| 久久久久久久一区二区| 青青草自拍偷拍| 美女视频亚洲色图| 欧美人体做爰大胆视频| 国模杨依粉嫩蝴蝶150p| 99在线视频影院| ...中文天堂在线一区| 欧美日韩国产精品一区二区| 午夜精品久久久久久久91蜜桃| 日韩激情一区二区| 97视频色精品| 欧美成人精品欧美一| 欧美伦理在线视频| 精品一区二区三区三区| 日本一区二区免费视频| 亚洲天堂网站| 欧美亚洲动漫精品| 美女福利视频在线| 极品在线视频| 亚洲一区二区成人在线观看| 欧美日韩一区二区三区电影| 最新国产在线观看| 久久精品人人爽人人爽| 久久草.com| 天天干天天插天天操| 成人综合在线观看| 亚洲一区二区久久久久久久| 亚洲综合精品视频| 美女视频黄频大全不卡视频在线播放| 欧美诱惑福利视频| 国产精品视频久久久久久久| 亚洲精品人人| 8050国产精品久久久久久| 久久精品国产亚洲AV无码麻豆 | 欧美狂野激情性xxxx在线观| 黄色免费在线观看| 亚洲视频免费在线| 黑人巨大国产9丨视频| 黄页视频在线播放| 亚洲欧美日韩国产中文在线| 在线观看免费黄色片| 中文字幕伦理免费在线视频 | 中文字幕精品一区日韩| 一区二区三区视频在线观看视频| 中日韩免费视频中文字幕| 亚洲最新在线| 91最新在线视频| 亚洲一区自拍偷拍| 黄色一级片播放| 婷婷电影在线观看| 欧美亚洲免费在线一区| 欧美一级视频在线| 亚洲大奶少妇| 亚洲国产欧美日韩精品| 久久久亚洲av波多野结衣| 国产精品入口久久| 最近2019中文字幕在线高清| 精品无码久久久久成人漫画 | 精品少妇一区二区三区在线| 欧洲一区精品| 色妞www精品视频| 老司机午夜性大片| 爱高潮www亚洲精品| 精品亚洲aⅴ在线观看| 1024手机在线观看你懂的| 91成人免费| 97人洗澡人人免费公开视频碰碰碰| 成年人免费高清视频| 欧美aa在线视频| 91丝袜脚交足在线播放| 青青视频在线观| 国产精品久久午夜| 农民人伦一区二区三区| 嫩草伊人久久精品少妇av杨幂| 88在线观看91蜜桃国自产| 性活交片大全免费看| 国产一区二区电影在线观看| 久久亚洲国产精品| www欧美在线| 精品一区二区免费视频| 狠狠色伊人亚洲综合网站色| 99se视频在线观看| 午夜久久久久久| 视频在线观看免费高清| 青青视频一区二区| 久久激情五月丁香伊人| 国产微拍精品一区| 国产精品一二二区| 日本午夜精品电影| 国产亚av手机在线观看| 欧美疯狂做受xxxx富婆| 蜜桃精品成人影片| 欧美阿v一级看视频| 国产成人一区三区| 亚洲精品一区二区口爆| 中文幕一区二区三区久久蜜桃| 国产午夜福利100集发布| 日本一区二区三区中文字幕| 日韩国产精品亚洲а∨天堂免| 日韩在线一卡二卡| 天堂成人免费av电影一区| 国产传媒一区二区| 求av网址在线观看| 在线免费观看日韩欧美| 日韩综合第一页| 欧美精品观看| 国产日韩欧美成人| av电影在线观看网址| 色偷偷久久一区二区三区| 黄色av电影网站| 欧美日一区二区在线观看| 国产日本欧美在线观看| 黄色影院在线播放| 日韩人在线观看| 黄色av网址在线观看| 亚洲欧美亚洲| 成人网中文字幕| 尤物网在线观看| 欧美日韩国产综合视频在线观看| 久久中文字幕人妻| 一区二区久久| 精品不卡一区二区三区| av美女在线观看| 精品动漫一区二区三区在线观看| 青青草精品在线视频| 精品制服美女久久| 自拍偷拍亚洲色图欧美| 国精品产品一区| 丝袜美腿精品国产二区| 一级全黄裸体免费视频| 亚洲欧美中日韩| 国产美女18xxxx免费视频| 久久视频国产| 成人久久一区二区| 国产精品一卡二卡三卡| 9191久久久久久久久久久| 婷婷久久综合网| 国产精品2024| 欧洲精品一区二区三区久久| 国产毛片精品| 国产91成人在在线播放| 免费播放片a高清在线观看| 日韩人在线观看| 岛国片在线免费观看| 激情亚洲综合在线| 毛片在线视频观看| 国偷自产av一区二区三区| 77777少妇光屁股久久一区| 国产色a在线| 欧美视频你懂的| 国产午夜手机精彩视频| 成人高清视频在线| 欧美一级片中文字幕| 青草国产精品| 92国产精品久久久久首页 | 精品视频日韩| 亚洲精品日韩激情在线电影| gogo久久| 亚洲性无码av在线| 国产毛片毛片毛片毛片毛片| 亚洲午夜精品17c| 国产成人无码精品久久二区三| 亚洲影院在线| 亚洲视频在线二区| 丁香五月缴情综合网| 国产成人精品免高潮费视频| 国产在线看片| 亚洲变态欧美另类捆绑| 亚洲不卡视频在线观看| 亚洲人成网站精品片在线观看| 极品白嫩的小少妇| 日韩av一区二区在线影视| 四虎永久免费网站| 色婷婷av一区二区三区丝袜美腿 | 日本精品一区二区三区在线观看视频| 欧美精品videos另类日本| 你懂的在线视频| 91精品国产综合久久精品图片| 欧美一二三区视频| 日韩一区在线看| 白丝女仆被免费网站| 久久99精品国产.久久久久久 | 日韩高清不卡在线| 99久久免费观看| 成人一区不卡| 国精产品99永久一区一区| 欧美黄色成人| 欧美中文字幕在线播放| a毛片在线播放| 亚洲午夜久久久影院| 亚洲黄色在线观看视频| 欧美欧美午夜aⅴ在线观看| 日韩美女一级片| 亚洲色图欧美在线| 国产真人做爰视频免费| 成年人午夜久久久| 久久精品一二三四| 日韩成人伦理电影在线观看| av在线播放亚洲| 亚洲欧美综合国产精品一区| 亚洲乱码一区二区三区| 亚洲男人都懂第一日本| 成人18视频| 亚洲a成人v| 国产精品久久综合av爱欲tv| 极品在线视频| 性亚洲最疯狂xxxx高清| 最新国产在线拍揄自揄视频| 中文字幕一区日韩电影| 国产乱理伦片a级在线观看| 亚洲精品一区中文| 人妻精品一区二区三区| 欧美电影精品一区二区| 国产手机视频在线| 欧美精品自拍偷拍| 欧美人一级淫片a免费播放| 色婷婷国产精品| 国产超碰人人爽人人做人人爱| 午夜视黄欧洲亚洲| 黄色小视频在线免费看| 亚洲一区二区三区四区中文字幕| 国产又黄又爽又无遮挡| 亚洲伦在线观看| 一区二区三区四区五区| 亚洲免费在线电影| 国精品无码一区二区三区| 亚洲色图视频网站| 紧身裙女教师波多野结衣| 亚洲三级电影网站| 加勒比婷婷色综合久久| 亚洲乱码精品一二三四区日韩在线| 国精产品视频一二二区| 中文字幕在线观看不卡视频| 男人的午夜天堂| 亚洲人成网站在线| 免费看一级一片| 亚洲第一激情av| 日本一区二区免费在线观看| 精品福利在线看| 国产区一区二区三| 欧美色涩在线第一页| 亚洲视频在线免费播放| 日韩一区二区高清| 亚洲女人18毛片水真多| 亚洲国产日韩欧美在线图片| 日本不卡免费播放| 中文字幕亚洲无线码a| 成人日韩欧美| 国外视频精品毛片| 久久久一本精品| 成人欧美一区二区三区黑人| 玖玖玖视频精品| 国产一区二区无遮挡| 国产调教一区二区三区| 亚洲五月六月| 欧美日韩一区二区三区四区在线观看 | 亚洲精品手机在线观看| 国产99久久久国产精品免费看| 中文字幕影片免费在线观看| 国产视频视频一区| 成人免费视频网站入口::| 亚洲高清免费视频| 日本黄色中文字幕| 日韩一区二区在线观看视频| 天天av天天翘| 三级精品视频久久久久| 福利小视频在线| 国产成人高清激情视频在线观看| 亚洲国产精选| 国产综合欧美在线看| 97精品视频| 青青草国产精品视频| 秋霞电影一区二区| 中文字幕乱视频| 中文字幕制服丝袜一区二区三区| 国产一级免费观看| 欧美色图第一页| 亚洲 精品 综合 精品 自拍| 中文字幕亚洲欧美在线 | 四季av一区二区凹凸精品| 男人添女荫道口女人有什么感觉| 久久午夜影视| 中国男女全黄大片| 国产精品久久久久久久久久免费看| 国产一卡二卡在线播放| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 99久久精品日本一区二区免费| 精品亚洲永久免费精品| 日本理论片午伦夜理片在线观看| 国产精品xxxxx| 美日韩黄色大片| 91社在线播放| 日韩成人一区二区三区在线观看| 国产xxxxxxxxx| 一区二区三区在线免费播放| 中文天堂在线视频| 日韩电影免费观看在线观看| 亚洲奶水xxxx哺乳期| 国产精品入口免费视频一| 日韩激情啪啪| 中文字幕日韩精品无码内射| 激情久久久久久久久久久久久久久久| 免费看污片网站| 亚洲国产aⅴ天堂久久| 国产日韩欧美视频在线观看| 国产亚洲精品91在线| 欧洲一区精品| 精品欧美一区二区久久久伦| 亚洲调教视频在线观看| 日本黄色一级网站| 1024成人网| 国产精品久久久久久久免费| 色哟哟亚洲精品一区二区| 午夜无码国产理论在线| 免费av一区二区三区| av不卡在线看| 成人手机在线免费视频| 午夜成人免费电影| 天堂成人在线观看| 亚州成人av在线| 国产欧美三级电影| 欧美乱大交xxxxx潮喷l头像| 丰满岳乱妇一区二区三区| 麻豆视频在线观看| 日韩欧美视频在线| 美女91在线| 国产精品久久7| 亚洲激情精品| 精品夜夜澡人妻无码av| 一本久久综合亚洲鲁鲁五月天| 日本中文字幕一区二区有码在线| 91国内在线视频| 美女精品一区最新中文字幕一区二区三区 | 欧美日韩免费看| 色播色播色播色播色播在线| 欧美在线一级va免费观看| 国产精品美女久久久久久不卡| 欧美黑人又粗又大又爽免费| 国产精品免费丝袜| 国产成人久久精品77777综合 | 成人性生活av| 日本午夜精品一区二区三区| 麻豆视频一区二区| 亚洲国产123| 精品欧美乱码久久久久久 | 五月开心婷婷久久| 日韩二区三区| 国产精品一区二区三| 亚洲欧洲美洲一区二区三区| 一级黄色大片免费看| 欧美三级xxx| 午夜在线免费观看视频| 99re资源| 久久亚洲精品伦理| 国产精品综合激情| 日韩精品在线一区| 自由日本语热亚洲人| 亚洲精品在线免费看| 高清成人免费视频| 一级黄色在线视频| 久久九九有精品国产23| 欧美日韩夜夜| 一级片视频免费观看| 亚洲精品日韩综合观看成人91| 日批免费在线观看| 国产精品黄色av| 国产一区二区三区四区三区四| 日韩av在线看免费观看| 欧美高清性hdvideosex| 天堂av在线| 在线日韩av永久免费观看| 成人av影院在线| 在线观看中文字幕av| 国内久久久精品| 久久久9色精品国产一区二区三区| 星空大象在线观看免费播放| 欧美日韩成人在线一区| 深夜av在线| 欧美大片免费播放|