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

精品久久福利| 婷婷伊人综合中文字幕| 国产精品久久久久久久免费观看| 4hu四虎永久在线影院成人| 欧洲精品在线播放| 国产免费视频在线| 国产白丝网站精品污在线入口| 91sa在线看| 国产黄色小视频网站| 福利欧美精品在线| 欧美精品在欧美一区二区少妇| 九色自拍视频在线观看| 欧美jizzhd69巨大| 久久―日本道色综合久久| 91青草视频久久| 欧美a视频在线观看| 欧美另类综合| 中文字幕日韩高清| 精品无码在线视频| 91色婷婷久久久久合中文| 亚洲韩国欧洲国产日产av| 自拍偷拍 国产| 女子免费在线观看视频www| 久久影音资源网| 国产精品一区二区三区观看| 一本大道伊人av久久综合| 国产一区91| 久久久久久久久网站| 日本高清一二三区| 欧美裸体在线版观看完整版| 亚洲白拍色综合图区| 伊人免费视频二| 99热播精品免费| 日韩欧美中文字幕在线播放| 妞干网在线观看视频| 天使と恶魔の榨精在线播放| 国产精品久久久久国产精品日日| 蜜桃av久久久亚洲精品| 天天操天天干天天插| 国产福利电影一区二区三区| 亚洲xxxxx| 国产美女主播在线观看| 久久99九九99精品| 国产一区二区在线免费| 中文字幕人妻互换av久久| 久久久久.com| 全亚洲最色的网站在线观看| 国产精品100| 日韩一区二区免费看| 91av国产在线| 国产成人精品777777| 男人的天堂亚洲| 7777免费精品视频| 偷偷操不一样的久久| 99国产成+人+综合+亚洲欧美| 久久久久久久久久久久av| 久久国产精品二区| 亚洲天堂久久| 午夜精品福利电影| 久久久久久久久影院| 免播放器亚洲| 国产精品777| 亚洲视频中文字幕在线观看| 久久97超碰国产精品超碰| 成人免费直播live| 亚洲成a人片在线| 99久久婷婷国产综合精品| 久久99精品久久久久久久久久| 婷婷国产在线| 国产日韩三级在线| 一区二区国产日产| 日本大片在线播放| 欧美日韩在线免费| 小泽玛利亚视频在线观看| 四虎精品一区二区免费| 日韩精品一区二区三区在线观看 | 成人禁用看黄a在线| 韩国一区二区三区美女美女秀| 四虎影视2018在线播放alocalhost| 2017欧美狠狠色| 亚洲午夜精品一区二区三区| 青草在线视频| 欧美性猛交xxxx乱大交极品| 国产三级三级看三级| 午夜日韩影院| 亚洲欧美另类在线观看| 午夜精品福利在线视频| 亚洲一区自拍| 亚洲一区二区在线| 天堂成人在线| 亚洲人成网站精品片在线观看 | 91日韩中文字幕| 一本色道久久综合亚洲精品高清 | 女同久久另类99精品国产| 国产亚洲精品美女| 欧美爱爱小视频| 亚洲欧美久久久| 91九色国产视频| 色视频在线看| 亚洲男女毛片无遮挡| 99精品免费在线观看| 三级欧美日韩| 中文字幕自拍vr一区二区三区| 国产性70yerg老太| 老司机免费视频一区二区三区| 国产欧美日韩视频一区二区三区| 成a人片在线观看www视频| 香蕉加勒比综合久久| 九九九九九国产| 婷婷成人在线| 欧美国产日韩一区| 91亚洲视频在线观看| 99久久99久久精品免费看蜜桃 | 黄色视屏免费在线观看| 一本大道久久a久久综合| 国产麻豆剧传媒精品国产| 日韩av密桃| 欧美综合在线第二页| 不卡视频免费在线观看| 国产精品高清亚洲| 日本999视频| 亚洲素人在线| 97久久精品国产| 午夜精品一二三区| 亚洲丝袜自拍清纯另类| 超碰超碰在线观看| 丰满少妇一区二区| 欧美大胆a人体大胆做受| 91麻豆精品国产无毒不卡在线观看| 少妇激情一区二区三区视频| 正在播放日韩欧美一页| 国产精品久久视频| 欧美另类自拍| 免费观看在线一区二区三区| 亚洲第一区在线| 欧美日韩免费一区二区| 狠狠狠色丁香婷婷综合久久五月| 茄子视频成人在线观看| 亚洲男人av| 精品中文视频在线| 欧美三级韩国三级日本三斤在线观看 | www亚洲精品| 伊人免费在线观看高清版| 亚洲国产精品成人综合色在线婷婷 | 老汉av免费一区二区三区| 日韩三级电影免费观看| 日韩不卡视频在线观看| 中文字幕在线成人| 91精品国产乱码久久久久| 国产精品精品国产色婷婷| 超碰成人在线播放| 仙踪林久久久久久久999| 91久久久久久国产精品| 国产精品实拍| 欧美成人女星排名| 男人的天堂一区二区| 99精品国产热久久91蜜凸| 久久综合色视频| 女厕嘘嘘一区二区在线播放 | 欧美国产日韩a欧美在线观看| 五月婷婷狠狠操| 99久久精品国产亚洲精品| 91精品视频在线免费观看| 欧美xxxx视频| 精品亚洲精品福利线在观看| 中文字幕精品视频在线观看| 国产欧美一区视频| 亚洲天堂伊人网| 激情国产一区| 日韩精品欧美专区| 99精品视频在线免费播放| 色综合久久久888| 天堂а√在线8种子蜜桃视频| 日本高清视频一区二区| 91精品国产闺蜜国产在线闺蜜| 国产麻豆一精品一av一免费| 免费成人午夜视频| 成人精品天堂一区二区三区| 91高跟黑色丝袜呻吟在线观看| 人人澡人人添人人爽一区二区| 日韩电影大全免费观看2023年上| 99re国产在线| 亚洲一区在线看| 中文字幕在线看高清电影| 极品少妇xxxx偷拍精品少妇| 欧美日韩福利在线| 日韩欧美高清在线播放| 国产亚洲欧洲| 国产精品日韩久久久久| 丝袜在线观看| 亚洲欧美中文日韩v在线观看| 国产精品呻吟久久| 欧美日韩国产在线播放| 久草福利资源在线| 99精品欧美一区| 日本一二三四区视频| 欧美资源在线| 日韩精品免费一区| 欧美日韩精品一区二区视频| 国产伦精品一区二区三| 日韩成人一区| 国产高清在线不卡| 91超碰国产在线| 欧美www在线| 国产在线视频网址| 精品国产乱码久久久久久久| 一区二区www| 色8久久人人97超碰香蕉987| 久久精品免费在线| 亚洲天堂免费在线观看视频| 免费污网站在线观看| 北条麻妃国产九九精品视频| 午夜福利123| 蜜桃一区二区三区在线| 欧美成人精品欧美一级乱| 国内精品久久久久久久97牛牛| 樱花www成人免费视频| 国产成人3p视频免费观看| 精品卡一卡二| 成人三级毛片| 粉嫩av四季av绯色av第一区| www.欧美视频| 91精品久久久久久久久久另类 | 国产嫩草影院久久久久| 精品国产av无码一区二区三区| 欧美电影免费观看高清| 日韩色妇久久av| 少妇精品久久久一区二区| 国产在线欧美日韩| 福利电影一区| 国产a一区二区| 亚洲乱码一区| www.成人av| 综合久久成人| 成人国产1314www色视频| 爱情电影网av一区二区| 成人伊人精品色xxxx视频| 欧美久久久网站| 国产精品久久久久久久久借妻 | 黄色成人影院| 久久精品国产成人精品| 免费网站成人| 久久精品国产亚洲精品2020| 免费在线毛片网站| 成年无码av片在线| 在线电影福利片| 色综合久久中文字幕综合网小说| 18加网站在线| 久久免费少妇高潮久久精品99| 日本三级在线观看网站| 久久久久久久久久国产| 午夜欧美激情| 国产精品激情自拍| 亚洲精品aaa| 97超级碰碰| 国产精品对白| 欧美激情论坛| 91一区二区| 国产女教师bbwbbwbbw| 在线国产欧美| 无人在线观看的免费高清视频| 美女视频黄免费的久久 | 国产精品国产精品国产| 欧美日韩成人在线| www日本视频| 亚洲欧美日韩精品| 免费的黄网站在线观看| 欧美高清视频在线播放| 大胆人体一区二区| 国产一区视频在线播放| 亚洲精品在线播放| 秋霞在线观看一区二区三区| 亚洲美女视频| av之家在线观看| 精品一区二区三区免费播放| 性感美女一区二区三区| 久久久久国产精品人| 色欲一区二区三区精品a片| 亚洲www啪成人一区二区麻豆| 精人妻无码一区二区三区| 在线电影国产精品| 四虎在线视频免费观看| 中文字幕国内精品| 不卡av免费观看| 国产精品高清在线| 久久久久久a亚洲欧洲aⅴ| 日韩人体视频| 麻豆中文字幕在线观看| 亚洲国产一区二区三区高清| 午夜免费一区二区| 高清视频一区二区| 欧美黄色一级生活片| 夜夜亚洲天天久久| wwwwww在线观看| 亚洲第一av网| 日本免费在线观看| 26uuu日韩精品一区二区| 91麻豆精品国产91久久久更新资源速度超快| 高清不卡一区二区三区| 日韩大片在线观看| 男女猛烈激情xx00免费视频| 国产一区二区三区免费看| av黄色在线免费观看| 夜夜夜精品看看| 国产精品久久久久久久免费看| 国产丝袜高跟一区| 色婷婷av在线| 成人黄色av网| 成人亚洲一区| 中文字幕无码精品亚洲35| 国产精品一区专区| 黄色激情小视频| 一道本成人在线| 欧美一区,二区| 欧美成人亚洲成人| 视频欧美精品| 亚洲午夜高清视频| 日韩高清在线一区| 国内精品久久99人妻无码| 亚洲国产欧美日韩另类综合 | 日本精品在线中文字幕| 久久国产精品 国产精品| 黄色亚洲在线| 风韵丰满熟妇啪啪区老熟熟女| 国产精品超碰97尤物18| 中文字幕日本视频| 亚洲最大中文字幕| 国产精品粉嫩| 欧美系列一区| 久久精品一区二区三区中文字幕| 国产一卡二卡三卡四卡| 亚洲在线观看免费| 亚洲男人天堂久久| 欧美人与性动交a欧美精品| 亚洲精品a区| 国产精品久久久久久久久电影网| 国产麻豆精品视频| 欧美日韩综合一区二区| 精品国产一区二区在线观看| 日本高清在线观看视频| 成人在线视频网址| 亚洲激情视频| 日韩精品一区二区三区高清免费| 午夜精品久久久久久久蜜桃app| 高清乱码毛片入口| 97视频在线观看免费| 日韩a级大片| 无码无遮挡又大又爽又黄的视频| 国产午夜亚洲精品午夜鲁丝片| 亚洲av无码精品一区二区| 中文字幕日韩精品有码视频| 欧美成人免费全部网站| 男同互操gay射视频在线看| 国产91精品久久久久久久网曝门| 日本网站免费观看| 日韩美女av在线| av在线播放一区| 在线精品日韩| 国产超碰在线一区| 在线天堂中文字幕| 国产丝袜一区二区三区免费视频| 国产综合色区在线观看| 亚洲一区二区精品在线观看| 国产一区二区三区在线看麻豆| 加勒比av在线播放| 精品丝袜一区二区三区| 免费污视频在线一区| 异国色恋浪漫潭| caoporm超碰国产精品| 国产一区二区视频免费| 久久国产精品电影| 青青草原在线亚洲| 亚洲36d大奶网| 亚洲一区二区精品久久av| 日本免费不卡| 成人在线视频网站| 日韩视频一区| 日本裸体美女视频| 亚洲大尺度美女在线| 高清欧美日韩| 精品无码国模私拍视频| 国产欧美日韩在线| 亚洲黄色在线观看视频| 国产精品福利网站| 国模 一区 二区 三区| 超薄肉色丝袜一二三| 欧美tk—视频vk| jizz久久久久久| 搞av.com| 亚洲欧美在线视频观看| 污污网站免费在线观看| 91精品久久久久久久久青青| 国产欧美69| 欧美成人片在线观看| 在线一区二区日韩| 欧美调教在线| 337p日本欧洲亚洲大胆张筱雨| 欧美性色欧美a在线播放| 超碰资源在线| 久久视频免费在线|