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

三個(gè)容易混淆的前端框架概念

開發(fā) 前端
「響應(yīng)式更新」也叫「細(xì)粒度更新」。同時(shí),最近前端圈比較火的Signal這一概念描述的也是「響應(yīng)式更新」。籠統(tǒng)的講,「響應(yīng)式更新」描述的是「狀態(tài)與UI之間的關(guān)系」,即「狀態(tài)變化如何映射到UI變化」。

大家好,我卡頌。

有3個(gè)容易混淆的前端框架概念:

  1. 響應(yīng)式更新
  2. 單向數(shù)據(jù)流
  3. 雙向數(shù)據(jù)綁定

在繼續(xù)閱讀本文前,讀者可以思考下是否明確知道三者的含義。

這三者之所以容易混淆,是因?yàn)樗麄冸m然同屬前端框架范疇內(nèi)的概念,但又不是同一抽象層級的概念,不好直接比較。

本文會從3個(gè)抽象層級入手講解這三者的區(qū)別。

響應(yīng)式更新

?「響應(yīng)式更新」也叫「細(xì)粒度更新」。同時(shí),最近前端圈比較火的??Signal??這一概念描述的也是「響應(yīng)式更新」。

籠統(tǒng)的講,「響應(yīng)式更新」描述的是「狀態(tài)與UI之間的關(guān)系」,即「狀態(tài)變化如何映射到UI變化」。

考慮如下例子(例子來自what are signals[1]一文):

function TodoApp() {
const [todos, setTodos] = useState(
[{ text: 'sleep', completed: false }]
)

const [showCompleted, setShowCompleted] = useState(false)

const filteredTodos = useMemo(() => {
return todos.filter((todo) => !todo.completed || showCompleted)
}, [todos, showCompleted])

return (
<TodoList todos={filteredTodos} />
)
}

在TodoApp組件中,定義了兩個(gè)狀態(tài):

  • 待辦事項(xiàng)todos
  • 是否展示完成的事項(xiàng)showCompleted

以及根據(jù)上述狀態(tài)派生出的狀態(tài)filteredTodos?。最終,返回<TodoList/>組件。

如果todos?狀態(tài)變化,UI該如何變化?即「我們該如何知道狀態(tài)變化的影響范圍」?這時(shí),有兩個(gè)思路:

  • 推(push)
  • 拉(pull)

推的原理

我們可以從變化的狀態(tài)(例子中為todos)出發(fā),根據(jù)狀態(tài)的派生關(guān)系,一路推下去。

圖片

圖片來自what are signals一文

在例子中:

  1. todos變化
  2. filteredTodos?由todos派生而來,變化傳導(dǎo)到他這里
  3. <TodoList/>?組件依賴了filteredTodos,變化傳導(dǎo)到他這里
  4. 確定了todos變化的最終影響范圍后,更新對應(yīng)UI

這就建立了「狀態(tài)與UI之間的關(guān)系」。

除了「推」之外,還有一種被稱為「拉」的方式。

拉的原理

同樣的例子,我們也能建立「狀態(tài)與可能的UI變化的關(guān)系」,再反過來推導(dǎo)??UI??變化的范圍。

圖片

圖片來自what are signals一文

在例子中:

  1. todos變化。
  2. 可能有UI變化(因?yàn)榻⒘恕笭顟B(tài)與可能的UI變化的關(guān)系」)。
  3. UI?與<TodoList/>組件相關(guān),判斷他是否變化。
  4. <TodoList/>?組件依賴filteredTodos,filteredTodos由todos派生而來,所以filteredTodos是變化的。
  5. 既然filteredTodos變化了,那么<TodoList/>組件可能變化。
  6. 計(jì)算變化的影響范圍,更新UI。

在主流框架中,React?的更新以「推」為主,Vue?、Preact?、Solid.js等更多框架使用「拉」的方式。

本文聊的「響應(yīng)式更新」就是「拉」這種方式的一種實(shí)現(xiàn)。

單向數(shù)據(jù)流

我們可以發(fā)現(xiàn),不管是「推」還是「拉」,他們都需要計(jì)算變化的影響范圍,即「一個(gè)狀態(tài)變化后,究竟有多少組件會受影響」。

那么,從框架作者的角度出發(fā),是希望增加一些約束,來減少「計(jì)算影響范圍」這一過程的復(fù)雜度。

同樣,從框架使用者的角度出發(fā),也希望增加一些約束,當(dāng)「計(jì)算影響范圍」出??bug??后,更容易排查問題。

這就有了「單向數(shù)據(jù)流」。

「單向數(shù)據(jù)流」是一條約定,他規(guī)定了「當(dāng)狀態(tài)變化后,變化產(chǎn)生的影響只會從上往下傳遞」。

考慮如下例子:

function Parent() {
const [num] = useState(0);
return <Child data={num}/>;
}

function Child({data}) {
const isEven = data % 2 === 0;
return <GrandChild data={isEven}/>;
}

function GrandChild({data}) {
return <p>{data}</p>;
}

<Parent/>?組件的狀態(tài)num?作為props?傳給<Child/>?組件,再作為props?傳給<GrandChild/>組件,整個(gè)過程只能自上而下。

「單向數(shù)據(jù)流」并不是實(shí)現(xiàn)前端框架必須遵循的原則,他的存在主要是為了減少開發(fā)者的心智負(fù)擔(dān),讓「狀態(tài)變化后,計(jì)算影響范圍」這一過程更可控。

雙向數(shù)據(jù)綁定

當(dāng)本文開篇聊「響應(yīng)式更新」時(shí),討論的是「狀態(tài)與UI的關(guān)系」,這是將框架作為一個(gè)整體來討論,抽象層級比較高。

當(dāng)我們繼續(xù)聊到「單向數(shù)據(jù)流」時(shí),討論的是「狀態(tài)變化的影響范圍在組件間單向擴(kuò)散」,這是「組件與組件之間的關(guān)系」,抽象層級下降了一級。

接下來我們要討論的「雙向數(shù)據(jù)綁定」,討論的是單個(gè)組件內(nèi)發(fā)生的事。

「雙向數(shù)據(jù)綁定」是「狀態(tài)+改變狀態(tài)后觸發(fā)的回調(diào)」相結(jié)合的語法糖。

這里不討論框架語境下「語法糖」一詞是否完全準(zhǔn)確

比較知名的「雙向數(shù)據(jù)綁定」實(shí)現(xiàn),比如??Vue??中的??v-model??語法:

<input v-model=‘data’/>

相當(dāng)于如下狀態(tài)+事件回調(diào)的組合:

<input @input='onInput' :value=‘data’ />

實(shí)際上早期React中也有類似實(shí)現(xiàn),名叫LinkedStateMixin[2],只是早已被廢棄

總結(jié)

我們可以用一張圖概括本文介紹的3個(gè)概念之間的關(guān)系:

圖片

概括起來主要是兩點(diǎn):

  • 他們都是前端框架范疇內(nèi)的概念
  • 他們屬于不同抽象層級的概念

其中:

  • 「雙向數(shù)據(jù)綁定」描述的是「組件內(nèi)邏輯與視圖的關(guān)系」
  • 「單向數(shù)據(jù)流」描述的是「組件之間的關(guān)系」
  • 「響應(yīng)式更新」描述的是「狀態(tài)與UI之間的關(guān)系」

參考資料

[1]what are signals:https://signia.tldraw.dev/docs/what-are-signals。

[2]LinkedStateMixin:https://reactjs.org/docs/two-way-binding-helpers.html。

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2011-05-23 13:05:25

重載重寫隱藏

2009-11-25 11:20:31

并發(fā)

2009-02-02 10:00:11

ADO.NETASP.NET

2010-06-28 11:08:32

BitTorrent協(xié)

2020-03-10 13:27:28

深度學(xué)習(xí)人工智能Facebook

2022-05-27 12:40:25

前端測試項(xiàng)目

2009-03-24 08:27:02

AndroidGoogle移動os

2024-02-01 00:21:41

Rust編程框架

2012-01-06 11:13:02

SinatraJava框架

2018-11-20 08:57:41

2021-11-14 23:06:49

Python代碼開發(fā)

2022-03-30 14:19:36

云安全云計(jì)算風(fēng)險(xiǎn)

2023-04-26 11:14:11

IT領(lǐng)導(dǎo)者遠(yuǎn)程工作

2023-05-29 14:32:48

數(shù)據(jù)治理

2015-07-02 10:20:27

Kubernetes容器虛擬化

2020-06-11 09:00:27

SDN網(wǎng)絡(luò)架構(gòu)網(wǎng)絡(luò)

2024-06-19 09:43:51

2021-12-16 22:36:10

開發(fā)前端CSS

2022-01-19 17:11:05

JavaScript數(shù)據(jù)工具

2021-09-14 09:39:06

設(shè)計(jì)系統(tǒng)框架設(shè)計(jì)原則
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文视频在线 | 久久精品无码一区二区三区 | 黄色在线免费观看 | 亚洲一区二区三区四区五区午夜 | 天堂在线1 | 蜜桃一区二区三区 | 日韩一区二区免费视频 | 欧美日韩中文国产一区发布 | 午夜电影合集 | 91精品www| 国产色在线 | 欧美高清hd| 91极品尤物在线播放国产 | 中文字幕亚洲一区二区va在线 | 91在线导航 | 中文字幕第二十页 | 国产成人99久久亚洲综合精品 | 亚洲欧美激情四射 | 欧美 日韩 国产 成人 在线 | 久久色视频 | www.久久 | 免费精品| 二区视频| 欧美久久久网站 | 99re在线视频观看 | 欧产日产国产精品视频 | 国产美女特级嫩嫩嫩bbb片 | 亚洲精品一区二三区不卡 | 亚洲精品自在在线观看 | 久久综合九九 | 国产精品欧美一区二区 | 亚洲精品天堂 | 国产成人免费视频网站视频社区 | 亚州春色| 国产一区91精品张津瑜 | 日韩av在线一区 | 精品1区2区3区 | 婷婷国产一区二区三区 | 亚州精品天堂中文字幕 | 男女污污动态图 | www.色婷婷|