成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CSS背景圖和HTML的<img>標簽怎么選?

開發 前端
Signal 是在應用中存儲狀態的一種方式,類似于 React 中的 useState()。兩者的關鍵區別在于,Signal 返回一個 getter 和一個 setter,而非響應式系統只返回一個值和一個 setter。

Signal(信號)是一種存儲應用狀態的形式,類似于 React 中的 useState()。但是,有一些關鍵性差異使 Signal 更具優勢。Vue、Preact、Solid 和 Qwik 等流行 JavaScript 框架都支持 Signal。

圖片

Signal 并不是最近才出現的,在此之前,它已經存在于 Knockout 等框架中。不過,在最近幾年通過巧妙的編譯器技巧和與 JSX 的深度集成極大地改進了它的開發者體驗·,這使得它非常簡潔并且使用起來很方便。

下面就來看看 Signal 都有哪些優勢,為什么說它是前端框架的未來!

Signal 是什么?

Signal 和 State 之間的主要區別在于 Signal 返回一個 getter 和一個 setter,而非響應式系統返回一個值和一個 setter。

圖片

注意: 有些響應式系統同時返回一個 getter/setter,有些則返回兩個單獨的引用,但思想是一樣的。

Signal 的優勢

State 混淆了兩個獨立的概念:

  • StateReference:對狀態的引用。
  • StateValue:存儲在狀態引用/存儲中的實際值。

那為什么返回一個 getter 比返回一個值更好呢?因為通過返回 getter,可以將狀態引用的傳遞與狀態值的讀取分開。

下面以這段 SolidJS 代碼為例:

圖片

  • createSignal():分配 StateStorage 并將其初始化為 0。
  • getCount:可以傳遞的對狀態的引用。
  • getCount():獲取狀態值。

上面解釋了 Signal 和普通 State 的不同。那 Signal 到底有什么優勢呢?Signal 是響應式的,這意味著它需要跟蹤誰對狀態感興趣(訂閱者),如果狀態發生變化,則通知訂閱者狀態變化。

為了具有響應式,Signal 必須要收集誰對它的值感興趣。它通過觀察在什么情況下調用狀態 getter 來獲取此信息。通過從 getter 中獲取值,告訴 Signal 該位置對該值感興趣。如果值發生變化,則需要調用 getter 創建一個訂閱。

這就是為什么傳遞狀態 getter 而不是狀態值很重要的原因。狀態值的傳遞不會向 Signal 提供有關實際使用該值的位置的任何信息。這就是為什么區分狀態引用和狀態值在 Signal 中如此重要。

為了進行對比,這里是 Qwik 中的相同示例。請注意,(getter/setter) 已被替換為具有 .value 屬性(表示 getter/setter)的單個對象。雖然語法不同,但內部的工作原理是一樣的。

圖片

當單擊按鈕并增加值時,框架只需要將文本節點從 0 更新為 1。它可以這樣做是因為在模板的初始渲染期間,Signal 已經知道 count.value? 只能被文本節點訪問。因此,它知道如果 count 的值發生變化,就只需要更新文本節點而無需更新其他地方。

useState() 的缺點

下面來看看在 React 中是如何使用 useState() 的以及它的缺點。

圖片

React 的 useState()? 會返回一個狀態值。這意味著 useState()? 不知道組件或應用內部如何使用狀態值。所以,一旦通過調用 setCount() 通知 React 狀態更改,React 就不知道頁面的哪一部分發生了更改,因此必須重新渲染整個組件,這在計算上是很昂貴的。

useRef() 不渲染

React 的 useRef()? 類似于 useSignal()?,但它不會導致頁面重新渲染。下面的例子看起來與 useSignal() 非常相似,但它不起作用。

圖片

useRef()? 的使用與 useSignal()? 完全一樣,用于傳遞對狀態的引用而不是狀態本身。但是,useRef() 缺少了訂閱跟蹤和通知。

在基于 Signal 的框架中,useSignal()? 和 useRef()? 是一樣的。useSignal()? 可以執行 useRef() 加上訂閱跟蹤的功能,這樣就進一步簡化了框架的 API。

內置的 useMemo()

Signal 很小需要進行記憶,因為它需要做的工作很少。

下面來看一個包含兩個計數器和兩個子組件的例子:

圖片

這里只會更新兩個 Display 組件之一的文本節點。未更新的文本節點在初始渲染后將永遠不會打印。

# 初始渲染輸出
<Counter/>
<Display count={0}/>
<Display count={0}/>

# 單擊時的渲染
(空白)

實際上,我們無法在 React 中實現相同的效果,因為至少會有一個組件需要重新渲染。那么下面就來看看如何在 React 中記憶組件以最小化重新渲染的次數。

圖片

但即使進行了記憶,React 也會產生多次重新渲染:

# 初始渲染輸出
<Counter/>
<Display count={0}/>
<Display count={0}/>

# 單擊時的渲染
<Counter/>
<Display count={1}/>

如果沒有記憶,我們會看到:

# 初始渲染輸出
<Counter/>
<Display count={0}/>
<Display count={0}/>

# 單擊時的渲染
<Counter/>
<Display count={1}/>
<Display count={0}/>

這比 Signal 需要做的工作多得多。所以,這就是為什么 Signal 的工作就像把所有事情都記下來了,而不必由我們自己來記憶。

舉個例子

下面就來看一個實現購物車的例子(React):

圖片

APP 組件中定義了購物車的狀態 cart 以及兩個子組件:

  • Main 組件:通過多層組件傳遞 setCart 函數,直到它到達購買按鈕。
  • NavBar 組件:通過多層組件傳遞購物車狀態,直到它到達渲染購物車的組件。

這里的問題就是每次點擊購買按鈕時,大部分組件樹都必須重新渲染。這會導致類似于的輸出:

# 點擊購買按鈕時
<App/>
<Main/>
<Product/>
<NavBar/>
<Cart/>

如果使用記憶,那么就可以避免 Main 組件重新渲染,而只有 NavBar 組件重新渲染:

# 點擊購買按鈕時
<App/>
<NavBar/>
<Cart/>

如果使用 Signal,輸出是這樣的:

# 點擊購買按鈕時
<Cart/>

這大大減少了需要執行的代碼量。

總結

Signal 是在應用中存儲狀態的一種方式,類似于 React 中的 useState()。兩者的關鍵區別在于,Signal 返回一個 getter 和一個 setter,而非響應式系統只返回一個值和一個 setter。

Signal 是響應式的,這意味著它需要跟蹤誰對狀態感興趣并通知訂閱者狀態更改。這是通過觀察調用狀態 getter 的上下文來實現的,它創建了一個訂閱。

相比之下,React 中的 useState() 僅返回狀態值,這意味著它不知道如何使用狀態值,并且必須重新渲染整個組件樹以響應狀態變化。

所以說 Signal 是前端框架的未來!

責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2023-06-30 13:27:54

CSS徑向漸變

2023-03-31 14:51:46

CSS圖案背景開發

2010-08-26 10:26:44

CSS

2010-09-09 14:38:05

CSS背景圖片

2011-06-20 17:17:11

Qt Widget QWidget

2011-06-03 14:04:11

Android

2023-02-07 09:01:22

CSS

2011-09-07 16:24:10

Qt Widget

2010-09-13 09:35:28

DIVCSS

2010-08-18 13:27:15

CSS兼容IE6

2009-06-11 10:35:49

圖像下拉列表imgdiv

2021-11-08 06:02:17

CSS 技巧代碼重構

2010-09-09 09:34:32

DIV

2013-09-16 10:19:08

htmlcssJavaScript

2009-06-05 10:12:36

Struts標簽庫HTML標簽

2010-08-27 15:16:26

htmlbodyCSS

2011-09-01 15:16:00

Ubuntu

2019-03-14 08:47:49

Visual Stud數據開發

2021-06-30 12:47:12

標簽HTML分辨率

2023-12-12 07:16:34

HTML標簽開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区久久久 | 国外成人在线视频 | 久久99精品久久久久子伦 | 人碰人操 | 日美女逼逼 | 久久国产成人 | 欧美日韩精品免费观看 | 成人精品一区亚洲午夜久久久 | 视频一区二区三区中文字幕 | av在线免费观看网站 | 亚洲国产区| 婷婷在线网站 | 激情欧美一区二区三区 | 国产精品视频网 | 色爱综合网 | 日韩国产一区二区三区 | 精品久久久久一区二区国产 | 美国黄色一级片 | 国产一区二区三区在线免费观看 | 日韩精品久久久久 | 久久久精品网站 | 91啪亚洲精品| 日本在线看 | 精品欧美一区二区三区久久久小说 | 国产亚洲一区二区三区 | 久久亚洲一区二区三区四区 | 免费国产视频 | 欧美一区二区三区在线播放 | 亚洲一区二区在线视频 | 久久久国产精品一区 | 欧美一区二区在线观看 | 国产精品 欧美精品 | 视频一区在线 | 91视频免费黄 | 狠狠天天| 日本粉嫩一区二区三区视频 | 国产免费一区二区三区 | 视频一区二区三区中文字幕 | 日韩精品视频网 | 日日碰狠狠躁久久躁婷婷 | 亚洲精品视频播放 |