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

Signals 在JavaScript中的應用

開發 前端
自從聲明式JavaScript框架問世以來,Signals機制一直存在。隨著時間的推移,它采用了許多不同的名稱,經歷了多年的流行和消失。

最近,"Signals"成為了前端備受關注的話題。很多國外的大佬都發文表示Signals是前端框架的未來。同時,尤大也在Vue官網上添加了"Connection to Signals"部分。此外,包括Solid、Angular、Preact、Qwik和Vue等多個前端框架都已經開始實現Signals。

作為一名FE,如果你和我之前一樣還不是很了解Signals,那么這篇文章或許可以幫助你更好地了解一下這個技術。本文將介紹Signals的歷史、概念和優勢。

一、發展歷史

自從聲明式JavaScript框架問世以來,Signals機制一直存在。隨著時間的推移,它采用了許多不同的名稱,經歷了多年的流行和消失。

在聲明式JavaScript框架中,組件是聲明其輸出的單元,可以被動態地渲染和組合。這種方式的優點是,它允許開發人員集中精力于組件的輸出,而無需擔心組件如何被渲染和更新。這種抽象方式也使得組件更容易被復用,并且更容易理解和測試。

然而,這種抽象也帶來了一些挑戰。其中一個挑戰是組件之間如何通信和共享狀態。這些問題可能導致代碼變得笨重,難以維護,并且在復雜的應用程序中容易出現混亂。因此,開發人員需要一種更靈活、更強大的通信機制來解決這些問題。

在這種情況下,Signals機制成為了一個有用的解決方案。Signals機制允許組件在不直接引用其他組件的情況下通信,并且能夠更靈活地傳遞消息和狀態。這些機制可以是事件、回調、Promise或其他異步機制。它們可以被用來處理各種不同的場景,例如用戶交互、網絡請求和狀態更改等。

Signals機制還具有許多其他優點。它們可以提高應用程序的可維護性和可擴展性,并且可以幫助開發人員更好地理解和調試代碼。此外,由于Signals機制允許組件之間松散耦合,因此它們也有助于提高代碼的可重用性。

1.1 早期實現

有時令人驚訝的是,多個團隊幾乎在同一時間達成了相似的解決方案。聲明式JavaScript框架的開端有三個版本:Knockout.js(2010年7月),Backbone.js(2010年10月)和Angular.js(2010年10月)。

Angular的臟檢查,Backbone的模型驅動的重渲染,以及Knockout的細粒度更新。每一個都略有不同,但最終都將成為我們今天管理狀態和更新DOM的基礎。

1.2 數據綁定

Angular.js里面常用的模式叫作數據綁定。數據綁定是將部分狀態(state)附加到視圖樹(view tree)某個特定部分的一個方法。可以做到的一個強大的事情是使其成為雙向的。因此,我們可以讓狀態更新 DOM,反過來,DOM 事件自動更新狀態,所有這些都是以一種簡單的聲明方式進行的。但是如果濫用也會出現問題,在 Angular 中,如果不知道有什么變化,就會對整個樹進行骯臟的檢查,向上傳播可能會導致它發生多次。

1.3 Mobx

之后就是react的時代,react對狀態管理沒有太多的限制。MobX就是這種解決方案。它強調一致性和無障礙傳播。也就是說,對于任何給定的變化,系統的每一部分都只運行一次,而且是以適當的順序同步運行。

它通過將先前方案中典型的基于 push 的響應式換成 push-pull 混合系統來做到這一點。變化的通知被推送出去,但派生狀態的執行被推遲到讀取它的地方。

圖片

1.4 Vue

Vue(2014) 也為今天的發展提供了巨大的貢獻。除了在優化一致性方面與 MobX 保持一致外,Vue從一開始就將「細粒度」的響應性作為其核心。

雖然 Vue 與 React 共享虛擬 DOM 的使用,但響應性是一流的,這意味著它首先作為一種內部機制與框架一起開發,以支持其 Options API,并在過去幾年中,成為 Composition API 的核心 (2020)。

Vue 通過調度任務,將 pull / push 機制向前推進了一步。默認情況下,Vue 的修改不會立馬被執行,而是要等到下一個微任務才會執行。

然而,這種調度也可以用來做一些其他的事情,比如 keep-alive,以及 Suspense。甚至像并發渲染這樣的事情也可以用這種方法來實現,真正展示了如何獲得基于 pull 和 push 的兩種方法的最佳效果。

二、為什么是Signals

Signals 的獨特之處在于狀態更改會以最有效的方式來自動更新組件和 UI。Signals 基于自動狀態綁定和依賴跟蹤提供了出色的工效,并具有針對虛擬 DOM 優化的獨特實現。

2.1 狀態管理的困境

隨著應用越來越復雜,項目中的組件也會越來越多,需要管理的狀態也越來越多。

為了實現組件狀態共享,一般需要將狀態提升到組件的共同的祖先組件里面,通過 props 往下傳遞,帶來的問題就是更新時會導致所有子組件跟著更新,需要配合 memo 和 useMemo 來優化性能。

雖然這聽起來還挺合理,但隨著項目代碼的增加,我們很難確定這些優化應該放到哪里。

即使添加了 memoization,也常常因為依賴值不穩定變得無效,由于 Hooks 沒有可以用于分析的顯式依賴關系樹,所以也沒法使用工具來找到原因。

圖片

另一種解決方案就是放到 Context 上面,子組件作為消費者自行通過 useContext 來獲取需要的狀態。

但是有一個問題,只有傳給 Provider 的值才能被更新,而且只能作為一個整體來更新,無法做到細粒度的更新。

為了處理這個問題,只能將 Context 進行拆分,業務邏輯又不可避免地會依賴多個 Context,這樣就會出現 Context 套娃現象。

圖片

2.2 通向未來的 Signals

Signal 的核心是一個通過.value屬性 來保存值的對象。它有一個重要特征,那就是 Signal 對象的值可以改變,但 Signal 本身始終保持不變。

import { signal } from "@preact/signals";

const count = signal(0);

// Read a signal’s value by accessing .value:
console.log(count.value); // 0

// Update a signal’s value:
count.value += 1;

// The signal's value has changed:
console.log(count.value); // 1

在 Preact 中,當 Signal 作為 props 或 context 向下傳遞時,傳遞的是對 Signal 的引用。這樣就可以在不重新渲染組件的情況下更新 Signal,因為傳給組件的是 Signal 對象而不是它的值。

這讓我們可以跳過所有昂貴的渲染工作,立即跳到任意訪問 signal.value 屬性的組件。

圖片

Signals 具有第二個重要特征,即它們會跟蹤其值何時被訪問以及何時被更新。在 Preact 中,當 Signal 的值發生變化時,從組件內訪問 Signal 的屬性會自動重新渲染組件。

通過Preact的使用,我們可以總結Signals 幾點特點:1、感覺上像是使用原始數據結構 2、能根據值的變化自動更新 3、直接更新 DOM (換句話來說無 VDOM) 4、沒有依賴數組

三、在SolidJS中的使用

const Greeting = (props) => (
<>Hi <span>{props.name}</span></>
);

const App(() => {
const [visible, setVisible] = createSignal(false),
[name, setName] = createSignal("Josephine");

return (
<div notallow={() => setName("Geraldine")}>{
visible() && <Greeting name={ name } />
}</div>
);
});

render(App, document.body);

可以看到 SolidJS 響應式也是Signal 作為基礎,createSignal 既可以用于組件內,也可以用于組件外,這個跟 Preact 中類似。一方面可以將 Signal 作為組件的 local state,也可以定義為 global State。與前面類似,SolidJS 中也有以下相似點:

  • 響應式細粒度更新
  • 無需定義 dependencies
  • 惰性取值

SolidJS 與 Mobx 和 Vue 的響應式非常相似,但是不會處理 VDOM,而是直接更新 DOM。

四、手動實現一個

響應式狀態管理三要素,Signals、Reactions、Derivations

// context 包含Reactions中的執行方法和Signal依賴
const context = [];

const createSignal = (value) => {
const subscriptions = new Set();
const readFn = () => {
const running = context.pop();
if (running) {
subscriptions.add({
execute: running.execute
});
running.deps.add(subscriptions);
}
return value;
};
const writeFn = (newValue) => {
value = newValue;
for (const sub of [...subscriptions]) {
sub.execute();
}
};
return [readFn, writeFn];
};

const createEffect = (fn) => {
const execute = () => {
running.deps.clear();
context.push(running);
try {
fn();
} finally {
context.pop(running);
}
};

const running = {
execute,
deps: new Set()
};
execute();
};

const createMemo = (fn) => {
const [memo, setMemo] = createSignal();
createEffect(() => setMemo(fn()));
return memo;
};

const [name, setName] = createSignal("a");
const fullName = createMemo(() => {
return "c-" + name();
});
createEffect(() => console.log(name(), fullName()));
setName("b");

Signals是一個基礎的數據更新與讀取,Reactions 是可以追蹤訂閱到 Signals 的變化,所以在 Reactions 函數里設置 Derivations 的值。

五、最后

本文是學習Signals的一些記錄。希望能通過介紹響應式狀態管理的一些歷史和理念,讓你對狀態管理有全面的認識,如果感覺本文介紹的不夠詳細,可以閱讀下面的引用原文。

六、引用

  1. ??https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob??
  2. ??https://dev.to/this-is-learning/react-vs-signals-10-years-later-3k71??
  3. ??https://mp.weixin.qq.com/s/Tn0rbkCdFw4f-3ihKUEYQA??
  4. ??https://indepth.dev/posts/1289/solidjs-reactivity-to-rendering??
  5. ??https://preactjs.com/guide/v10/signals/??
  6. ??https://preactjs.com/blog/introducing-signals??

圖片

責任編輯:武曉燕 來源: 大轉轉FE
相關推薦

2016-08-12 11:04:17

JavaScript物聯網應用

2021-05-06 05:37:40

JavascriptSTT機器學習

2009-02-27 16:22:34

AjaxProAjax.NET

2025-09-29 04:00:00

finallyJavaScript前端

2017-09-04 14:40:00

LimitLatchTomcat線程

2020-05-22 10:40:33

ContinuatioJS前端

2022-04-27 19:05:46

.NETJavaScript接口

2024-08-27 08:35:43

JavaScriptPromise模式

2019-05-21 06:00:29

物聯網體育IOT

2024-09-30 09:48:41

RabbitMQ消息中間件

2014-08-08 16:50:21

AB 測試安卓推送

2011-05-18 16:02:08

XML

2021-12-07 18:35:08

物聯網執法應用IOT

2010-07-07 17:24:39

BGP協議

2022-06-30 08:58:09

時鐘輪RPC框架

2017-10-27 16:19:23

語音識別CNN

2018-10-11 10:38:31

前端JavaScript編程語言

2009-06-29 17:09:49

JavaBeanJSP

2022-06-28 08:02:44

SPISpringJava

2009-02-03 10:19:45

點贊
收藏

51CTO技術棧公眾號

国产乱淫av麻豆国产免费| 91在线观看免费网站| 亚洲va欧美va在线观看| 91香蕉视频网址| 91极品身材尤物theporn| 欧美日韩 国产精品| 日韩精品在线私人| 亚洲欧美国产中文| а√在线天堂官网| 欧美激情中文字幕| 99精品99久久久久久宅男| 国产成人在线观看网站| 哺乳一区二区三区中文视频 | 亚洲国产欧美视频| 韩国成人在线| 一区二区三区av电影| 国产伦精品一区二区三区免| 国产成人免费看| 日韩欧美二区| 精品国产一区二区三区久久久蜜月 | 国产精品露脸视频| 欧美不卡视频| 亚洲美女中文字幕| 免费网站在线观看黄| a'aaa级片在线观看| 日韩五码电影| 91精品韩国| 国产亚洲精品bv在线观看| 在线观看日韩av| 久久久亚洲精选| av黄色免费网站| 亚洲久草在线| 欧美视频在线观看免费| 在线国产精品网| 熟妇人妻中文av无码| 日本成人在线一区| 青青草成人在线| 麻豆天美蜜桃91| 久久成人av| 亚洲第一福利视频| 久久久久久综合网| 欧美人体一区二区三区| 亚洲一区二区视频在线观看| 少妇精品久久久久久久久久| 亚洲AV无码乱码国产精品牛牛 | 日韩午夜在线| 久久国产加勒比精品无码| 国产精品1000部啪视频| www999久久| 91久久线看在观草草青青| 国产精品igao激情视频| 黄网在线观看| 视频二区不卡| 国产伊人精品| 国产一区二区三区视频| 超碰97在线资源站| av成人app永久免费| 欧美日韩国产高清一区二区三区| 欧美日韩成人免费视频| 青草视频在线免费直播 | 亚洲区免费视频| 超碰97久久国产精品牛牛| 3d动漫精品啪啪一区二区竹菊 | 免费观看成人在线| 亚洲大尺度网站| 韩国女主播成人在线| 国产一区二区在线免费视频| 成年免费在线观看| 99av国产精品欲麻豆| 色综合老司机第九色激情| 翔田千里亚洲一二三区| 18禁一区二区三区| 欧美日韩女优| 欧美伊人久久久久久久久影院 | 欧美做受喷浆在线观看| 红杏视频成人| 亚洲成人av在线| 久久国产劲爆∧v内射| 91精品国产乱码久久久竹菊| 日韩久久精品一区| 亚洲熟妇一区二区| 好吊妞视频这里有精品| 亚洲国产精品va在线看黑人| 日本黄色www| 99香蕉久久| 精品国产成人系列| 女同毛片一区二区三区| 亚洲男人都懂第一日本| 日韩精品极品在线观看播放免费视频| 中文字幕免费高清视频| 日本福利一区| 有码中文亚洲精品| 暗呦丨小u女国产精品| 欧美在线免费一级片| 久久久久女教师免费一区| 日本熟妇一区二区| 久久精品成人| 国产精品入口免费视频一| 韩国成人av| 亚洲精品成人区在线观看| 成人污污视频在线观看| 欧美日韩在线高清| 日本不卡不卡| 亚洲夂夂婷婷色拍ww47| 国产日韩一区二区在线| 播放一区二区| 欧美一区二区三区影视| 亚洲日本久久久| 狠狠色丁香婷婷综合影院| 中文字幕在线日韩| 久久久久久久福利| 日韩专区中文字幕一区二区| 成人黄色短视频在线观看| 黄色小视频免费观看| 久久久夜色精品亚洲| 在线无限看免费粉色视频| 超碰在线公开| 欧美乱熟臀69xxxxxx| 最新版天堂资源在线| 欧美日韩久久精品| 久久久久亚洲精品| 中文字幕在线视频第一页| 国产99久久久国产精品潘金| 欧美日韩另类综合| 制服丝袜在线播放| 欧美性猛交xxxx黑人交| 中文字幕天堂av| 久久视频国产| 5566成人精品视频免费| www.av网站| 国产精品网站导航| 1024av视频| 香蕉成人在线| 亚洲人成在线观看网站高清| 久久精品一区二区三| 日本女优在线视频一区二区| 国产一区二区在线观看免费播放| 九色porny在线| 在线视频国内自拍亚洲视频| 91成人在线观看喷潮蘑菇| 第一会所亚洲原创| 欧美怡红院视频一区二区三区| 国产精品毛片一区二区在线看舒淇| av在线播放成人| 亚洲一本大道在线| 91看片淫黄大片91| 国产91在线播放精品| 亚洲精品视频二区| 国产精品第56页| 国产精品一区在线观看乱码| 亚洲国产日韩欧美| 欧美aaa视频| 亚洲美女中文字幕| 日本韩国欧美中文字幕| 国产又粗又大又爽| 豆国产96在线|亚洲| 咪咪色在线视频| 日韩专区视频| 中文字幕在线看视频国产欧美在线看完整| 国产精品第九页| 国产剧情在线观看一区二区| 日本视频精品一区| 日韩av影片| 亚洲丁香婷深爱综合| 久久精品视频免费在线观看| 久久66热偷产精品| 亚洲国产精品一区二区第一页 | 国产精品福利影院| 午夜激情av在线| 成人精品中文字幕| 国产精品视频白浆免费视频| av福利在线播放| 欧美视频三区在线播放| 日韩一级av毛片| 日韩精品午夜视频| 亚洲三区四区| 91丨精品丨国产| 久久精品中文字幕免费mv| 一区二区精品视频在线观看| 中文字幕一区二区在线观看| 午夜国产一区二区三区| 久久精品影视| 成人a免费视频| 在线观看午夜av| 精品国产91乱码一区二区三区| 久久中文字幕无码| 91在线看国产| 精品久久久久久久无码| 国产精品91一区二区三区| 91日韩在线视频| 色老头在线观看| 国产一区二区中文字幕| 日韩大陆毛片av| 久草手机在线观看| 国产偷国产偷精品高清尤物 | 懂色中文一区二区三区在线视频| 青春草在线视频| 亚洲欧美精品在线| 一区二区三区免费观看视频| 亚洲激情在线激情| 在线免费观看a级片| 日韩av电影天堂| 欧美 国产 精品| 免费看久久久| 国产免费一区视频观看免费| 日本h片在线观看| 国产丝袜一区二区| 国产乱淫av免费| 精品久久久久久久久久| 极品蜜桃臀肥臀-x88av| 国产精品一区二区视频| 久久精品.com| 亚洲精品2区| 欧美日韩精品中文字幕一区二区| 先锋影音一区二区| 欧美亚洲午夜视频在线观看| 午夜激情视频在线观看| 亚洲国产精品va在线观看黑人| 久久青青草原亚洲av无码麻豆 | 亚洲成av人片在线观看香蕉| 少妇无套内谢久久久久| 亚洲国产日日夜夜| 国产精品久久久久久成人| 成人美女在线视频| 亚洲一区日韩精品| 午夜综合激情| 国产精品无码电影在线观看| 成久久久网站| 另类小说综合网| 一区二区视频| 国产日韩精品视频| 不卡一二三区| 欧美精品videossex88| av网页在线| 日韩精品一区二区视频| 午夜免费福利视频| 欧美日韩免费高清一区色橹橹 | 91黄色免费版| 日本成人午夜影院| 99视频在线精品| 男生和女生一起差差差视频| 日韩精品视频网| 欧美视频在线播放一区| 亚洲视频久久| 看全色黄大色大片| 99热在线成人| 亚洲精品一区国产精品| 日韩a级大片| 成人自拍网站| 欧美影院视频| 91精品在线观看视频| 亚洲天堂1区| 国产成人精品在线观看| 在线天堂新版最新版在线8| 久久久久久久香蕉网| caoporm免费视频在线| 日韩在线视频一区| avav免费在线观看| 中文字幕一精品亚洲无线一区| 国产在线高清| 伊人伊成久久人综合网小说| 男女视频在线观看免费| 亚洲精品久久7777777| 殴美一级特黄aaaaaa| 亚洲成年人在线播放| 日本美女一级片| 亚洲激情小视频| 视频一区 中文字幕| 亚洲精品成人久久久| 手机看片福利在线观看| 日韩精品视频中文在线观看| 神马久久久久| 亚洲天堂成人在线视频| 777电影在线观看| 久久视频在线播放| 亚洲区欧洲区| 久久久亚洲影院你懂的| 人成在线免费网站| 国产97人人超碰caoprom| 一区二区乱码| 日本高清久久天堂| 久久天堂av| 欧美中文在线观看| 午夜精品久久久久久毛片| 91福利视频导航| 欧美丝袜足交| 日产精品高清视频免费| 四季av一区二区凹凸精品| 午夜探花在线观看| 1024精品一区二区三区| 日日摸日日碰夜夜爽av| 久久国产日韩欧美精品| 国产无色aaa| 成人av网站在线观看免费| 30一40一50老女人毛片| 天堂在线观看视频| 欧美不卡在线视频| 四虎免费在线观看| 亚洲精选在线观看| 日本视频在线免费观看| 久久久久久这里只有精品| 女海盗2成人h版中文字幕| 国产精品久久久久久网站| 一区二区三区四区视频免费观看| 国产成人一区二区三区免费看| 色婷婷久久久| 丰满女人性猛交| 亚洲激情av| www午夜视频| av一区二区久久| 亚洲精品自拍视频在线观看| 亚洲一区二区三区视频在线播放| 波多野结衣啪啪| 日韩欧美国产综合一区| 韩国中文字幕2020精品| 欧美成人合集magnet| 欧美电影免费观看| 国产综合色香蕉精品| 国产精品毛片视频| 欧美日韩三区四区| 亚洲久久成人| 搡的我好爽在线观看免费视频| 久久奇米777| 久久久久久久极品内射| 欧美精品自拍偷拍| 亚洲欧美日韩综合在线| 欧美成年人在线观看| 国产精品第一国产精品| 久久久久国产精品视频| 欧美一区久久| 亚洲成人福利在线观看| 福利电影一区二区| www.xxxx日本| 欧美日韩视频第一区| 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 色噜噜狠狠色综合网图区| 国产蜜臀av在线播放| 国产精品香蕉国产| 久久av资源| 日韩国产欧美亚洲| 高清不卡一二三区| 欧美日韩激情在线观看| 7777精品伊人久久久大香线蕉超级流畅 | 欧美三级自拍| 久操网在线观看| 国产成人免费在线视频| 久热这里有精品| 国产精品资源在线| 丰满少妇大力进入| 成人av免费在线观看| 免费看一级一片| 91精品国产综合久久婷婷香蕉 | 国产福利电影一区二区三区| 国产精品酒店视频| 欧美伊人久久久久久久久影院| 天堂中文在线视频| 国产91精品久久久久久| 国产图片一区| 777av视频| av电影在线观看完整版一区二区| 久久网一区二区| 亚洲第一av在线| 美女高潮在线观看| 九9re精品视频在线观看re6| 一区二区国产精品| 97人妻精品一区二区三区免费| 亚洲午夜激情网站| 殴美一级特黄aaaaaa| 91精品国产高清久久久久久91| 黄色网一区二区| 国产美女网站在线观看| 久久久久成人黄色影片| 天干夜夜爽爽日日日日| 伊人久久久久久久久久| 四虎成人在线| 亚洲色图自拍| 国产精品一区二区久久精品爱涩| 日韩成人毛片视频| 亚洲第一免费网站| 亚洲一级少妇| 午夜欧美性电影| 青草av.久久免费一区| 老司机精品免费视频| 欧美无砖专区一中文字| 日本中文字幕在线观看| 国产日韩欧美中文在线播放| 欧美国产一级| 美女日批在线观看| 亚洲高清免费视频| 神马亚洲视频| 国产精品大片wwwwww| 日本一区二区高清不卡| 亚洲免费999| 一二三四区精品视频| 天天操天天干天天干| 欧美一级高清免费| av影片在线一区| 天天干天天av| 亚洲主播在线播放| 欧美美女搞黄|