js焦點(diǎn)新聞—看一下焦點(diǎn)新聞
大家好,很高興又見(jiàn)面了,我是"自強(qiáng)不息阿古?",由我?guī)е蠹乙黄痍P(guān)注前端前沿、深入前端底層技術(shù),大家一起進(jìn)步,也歡迎大家關(guān)注、點(diǎn)贊、收藏、轉(zhuǎn)發(fā),您的支持是我不斷創(chuàng)作的動(dòng)力。

在開(kāi)發(fā)復(fù)雜的用戶(hù)界面或應(yīng)用時(shí),開(kāi)發(fā)者需要有效地管理狀態(tài)的存儲(chǔ)、計(jì)算、無(wú)效化和同步,并且要確保狀態(tài)能夠準(zhǔn)確地反映到視圖層。處理這樣的狀態(tài)管理任務(wù)是非常困難的,因?yàn)闋顟B(tài)不僅僅是簡(jiǎn)單的值,還可能包括依賴(lài)于其它狀態(tài)的計(jì)算結(jié)果,這些計(jì)算結(jié)果本身也可能是動(dòng)態(tài)計(jì)算的。
Signals的主要目標(biāo)就是為應(yīng)用狀態(tài)提供一個(gè)易于管理的基礎(chǔ)設(shè)施,使開(kāi)發(fā)者可以將更多的精力放在業(yè)務(wù)邏輯實(shí)現(xiàn)上,而不是繁瑣的細(xì)節(jié)處理。Signals擅長(zhǎng)在復(fù)雜的依賴(lài)關(guān)系中無(wú)縫地傳遞狀態(tài)變化,提供一種自動(dòng)化的方式去處理狀態(tài)管理其它方式無(wú)法或難以處理的情況。
而且,Signals不僅在UI上下文中有實(shí)用價(jià)值,在非UI上下文(如在構(gòu)建系統(tǒng)中,用以避免不必要的重建)中同樣具有實(shí)用價(jià)值。
我們首先看看Signals是什么以及它存在的意義。我們會(huì)深入討論為什么在用戶(hù)界面復(fù)雜的應(yīng)用程序中,需要一個(gè)有效的處理狀態(tài)的存儲(chǔ)、計(jì)算、同步的方法,以及Signals在非UI上下文的應(yīng)用,比如在構(gòu)建系統(tǒng)中用以避免不必要的重建。
我們將探討Signals是如何消除手動(dòng)管理更新應(yīng)用程序的需求,為我們提供了一種新的編程模式——聲明式編程。我們將解析一些相關(guān)示例,說(shuō)明聲明式編程如何根據(jù)狀態(tài)的變化進(jìn)行自動(dòng)更新。
比起Signals模式,傳統(tǒng)的pub/sub模式在管理應(yīng)用狀態(tài)時(shí)到底存在哪些問(wèn)題?我們將分析一段簡(jiǎn)單的Javascript代碼,理解如果不適用Signals而采用傳統(tǒng)的方式進(jìn)行開(kāi)發(fā)時(shí)可能會(huì)遇到的挑戰(zhàn)。
盡管JavaScript或Web平臺(tái)中沒(méi)有內(nèi)置Signals機(jī)制,但是雙向數(shù)據(jù)綁定一直是UI框架的核心。然而Signals作為一種反應(yīng)式方法,已經(jīng)在多種框架中得到了實(shí)現(xiàn)。在這一部分,我們將通過(guò)proposal-signals提案深入研究Signals如何在JavaScript中得到實(shí)現(xiàn),并探討Signals的優(yōu)越性。
最后,我們會(huì)討論Signals的未來(lái)發(fā)展方向,包括對(duì)HTML/DOM的集成等,并提供一些進(jìn)一步學(xué)習(xí)的參考鏈接,幫助讀者進(jìn)一步理解和掌握Signals。
接下來(lái)我們就開(kāi)始詳細(xì)討論每一個(gè)部分。
首先,我們需要明確Signals是什么?簡(jiǎn)單的說(shuō),Signals的目標(biāo)就是提供一個(gè)基礎(chǔ)設(shè)施,用于管理應(yīng)用狀態(tài),讓開(kāi)發(fā)者能夠?qū)W⒂跇I(yè)務(wù)邏輯,而非繁瑣的細(xì)節(jié)處理。
在構(gòu)建復(fù)雜的用戶(hù)界面時(shí),我們需要快速響應(yīng)各種狀態(tài)的變化。例如,用戶(hù)的輸入,服務(wù)器的響應(yīng),定時(shí)器的觸發(fā)等。每個(gè)狀態(tài)的變化,可能會(huì)影響UI的顯示。例如,用戶(hù)輸入變化,可能需要實(shí)時(shí)顯示搜索結(jié)果;服務(wù)器響應(yīng)變化,可能需要刷新頁(yè)面;定時(shí)器觸發(fā),可能需要更新倒計(jì)時(shí)。這些狀態(tài)的變化,都需要通過(guò)某種機(jī)制來(lái)觸發(fā)UI的更新。這種機(jī)制,就是Signals。
Signals不僅僅美化了代碼,使它更易讀,更具可維護(hù)性,而且還提高了代碼的執(zhí)行效率。它通過(guò)單向數(shù)據(jù)流與States進(jìn)行交互,并關(guān)聯(lián)所有計(jì)算和/或副作用以反應(yīng)新的變更。
得益于Signals的出現(xiàn),開(kāi)發(fā)者在處理狀態(tài)相關(guān)的業(yè)務(wù)邏輯時(shí),可以擺脫關(guān)注繁瑣的細(xì)節(jié)問(wèn)題,讓我們的焦點(diǎn)更加集中在實(shí)現(xiàn)所要解決的問(wèn)題本身。
對(duì)于非UI的上下文,例如構(gòu)建系統(tǒng)中,Signals同樣有很大的應(yīng)用價(jià)值,它可以用來(lái)避免不必要的重建,提升了開(kāi)發(fā)的效率。
為了更好的理解Signals,下面我們將深入探討聲明式編程以及它在管理應(yīng)用狀態(tài)的角色。
Signals 是支持聲明式編程的主要構(gòu)件之一。它取消了手動(dòng)管理應(yīng)用更新,轉(zhuǎn)而采用了一種根據(jù)狀態(tài)自動(dòng)更新的聲明式編程模型。
基于命令式編程,開(kāi)發(fā)者需要一步步編寫(xiě)表示每一個(gè)操作過(guò)程的代碼,告訴機(jī)器需要做什么。例如,對(duì)某個(gè)HTML元素改變屬性,需要先獲取元素,再改變目標(biāo)屬性。對(duì)于復(fù)雜應(yīng)用,需要通過(guò)大量復(fù)雜的命令來(lái)進(jìn)行細(xì)微的狀態(tài)改變,每一次狀態(tài)改變都會(huì)重新獲取元素和更新屬性,帶來(lái)了很多的重復(fù)性操作,并且使得整體代碼的復(fù)雜度大大提高。
聲明式編程,就是描述我們想做什么,而非告訴計(jì)算機(jī)如何去做。這種編程模式,將狀態(tài)聲明為函數(shù)或者計(jì)算的結(jié)果,只要狀態(tài)的值發(fā)生了變化,那么依賴(lài)這個(gè)狀態(tài)的函數(shù)或者計(jì)算的結(jié)果也自然就會(huì)更新。這種聲明式的方法,避免了我們重復(fù)的去獲取及更新元素。
那么,Signals如何與聲明式編程結(jié)合,構(gòu)建出一套全新的,高效的狀態(tài)處理方式呢?我們接下來(lái)將詳細(xì)解析。
在傳統(tǒng)的JavaScript中,我們可能會(huì)使用類(lèi)似下面的方式來(lái)處理一個(gè)簡(jiǎn)單的業(yè)務(wù)邏輯:
在上述代碼中,有一個(gè)變量counter,我們希望無(wú)論counter是偶數(shù)還是奇數(shù),都能將其渲染到DOM中,并且每次counter發(fā)生變化時(shí),我們使用parity來(lái)更新DOM。
這種方式存在一些問(wèn)題:
- 設(shè)置counter的樣板代碼繁重。
- counter狀態(tài)與渲染系統(tǒng)緊密耦合。
- 如果counter發(fā)生變化但parity沒(méi)有,比如從2變?yōu)?,會(huì)進(jìn)行不必要的計(jì)算和渲染。
想象一下,如果我們?cè)谔幚砀鼮閺?fù)雜的業(yè)務(wù)邏輯,那么會(huì)增加更多的狀態(tài)變量,更多的邏輯判斷,我們將不得不維護(hù)復(fù)雜的業(yè)務(wù)狀態(tài)樹(shù)。這種觀察者模式簡(jiǎn)直就是一場(chǎng)程序員的噩夢(mèng)。
盡管我們可以使用pub/sub模型來(lái)解決這個(gè)問(wèn)題,但是它帶來(lái)了新的挑戰(zhàn):
- 需要精確訂閱狀態(tài)的變化,很難獲取準(zhǔn)確的時(shí)機(jī)去訂閱和取消訂閱。
- 管理訂閱和取消訂閱邊界變得復(fù)雜,我們可能需要定義很多復(fù)雜的規(guī)則去識(shí)別。
- 它增加了大量的樣板代碼,使得管理狀態(tài)變得愈加繁雜。
好在,我們有Signals,下面我們就來(lái)看看Signals如何解決這些問(wèn)題。
以上代碼展示了如何使用Signals來(lái)實(shí)現(xiàn)同樣的功能。你會(huì)發(fā)現(xiàn),我們消除了很多樣板代碼。并且很好地解決了pub/sub帶來(lái)的問(wèn)題。實(shí)際上,Signals帶來(lái)了以下優(yōu)勢(shì):
- 自動(dòng)依賴(lài)性跟蹤:計(jì)算信號(hào)會(huì)自動(dòng)發(fā)現(xiàn)所依賴(lài)的任何其他信號(hào)。在創(chuàng)建新的計(jì)算信號(hào)時(shí),我們不需要在意計(jì)算信號(hào)的依賴(lài)關(guān)系。只需要簡(jiǎn)單地使用已經(jīng)存在的信號(hào),Signals就會(huì)自動(dòng)識(shí)別并追蹤依賴(lài)關(guān)系。
- 惰性求值:計(jì)算信號(hào)在聲明時(shí)不會(huì)立即求值,而是在明確請(qǐng)求其值時(shí)才執(zhí)行。這意味著我們創(chuàng)建的計(jì)算信號(hào),不會(huì)因?yàn)槲覀儧](méi)有使用而浪費(fèi)計(jì)算資源。
- 自動(dòng)緩存:計(jì)算信號(hào)會(huì)緩存其最后的值,如果我們?cè)俅握?qǐng)求這個(gè)值而信號(hào)值并沒(méi)有變化,那么就不需要重新計(jì)算,而是直接返回緩存的結(jié)果,以此來(lái)避免不必要的計(jì)算。
- 與開(kāi)發(fā)工具的融合:內(nèi)置信號(hào)使JavaScript運(yùn)行時(shí)以及相關(guān)的開(kāi)發(fā)工具更好地支持信號(hào)的檢查。開(kāi)發(fā)者能夠更直觀的看到信號(hào)的變化,以最大程度的提高開(kāi)發(fā)效率。
從上面的簡(jiǎn)單示例中,我們可以發(fā)現(xiàn),使用Signals可以使我們的代碼變得更加簡(jiǎn)潔明了,易于維護(hù)和擴(kuò)展,提高了開(kāi)發(fā)效率。
Signals的未來(lái)顯然不會(huì)止步于此,它將繼續(xù)往前發(fā)展,目前的前景非常廣闊。對(duì)HTML/DOM的集成只是它未來(lái)可能進(jìn)行的嘗試之一,還有很多其他的可能性等待我們?nèi)ヌ剿鳌?/p>
圖片資訊
-
秋月財(cái)經(jīng)是什么類(lèi)型的網(wǎng)站,秋月財(cái)經(jīng)是什么類(lèi)型的網(wǎng)站啊
56%的人還瀏覽了 -
碧桂園排名地產(chǎn)多少名—碧桂園排第幾名
85%的人還瀏覽了 -
長(zhǎng)期喝每天訂的鮮牛奶好嗎_喝鮮牛奶好還是奶粉好
78%的人還瀏覽了 -
2023年多久開(kāi)始冷-2023暖冬已成定局了嗎
63%的人還瀏覽了 -
烏克蘭女兵大量出現(xiàn)在戰(zhàn)場(chǎng)、烏克蘭女兵大量出現(xiàn)在戰(zhàn)場(chǎng)上
53%的人還瀏覽了 -
中方主導(dǎo)全球首個(gè)船舶司法出售公約
87%的人還瀏覽了

