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

理解了狀態管理,就理解了前端開發的核心?

開發 前端
狀態就是數據的變化。前端應用的核心問題就是管理狀態,管理狀態變化之前的通過視圖或者其他方式觸發的異步過程,管理狀態變化之后的聯動渲染和聯動的邏輯執行。

狀態管理是前端整天遇到的概念,但是大家是否思考過什么是狀態,管理的又是什么呢?

我們知道,程序是處理數據的,數據是信息的載體,比如顏色是紅色或藍色這就是數據。

那為什么不叫數據管理呢?狀態和數據是什么關系?

什么是狀態

狀態是數據的變化,比如顏色是紅色或藍色是數據,而顏色從紅色變為藍色這就是狀態了。

狀態的改變對應著視圖的渲染或者某段邏輯的執行。比如顏色從紅色變為藍色可能就要重新渲染視圖,并且執行發送請求到服務端的邏輯。

通過視圖交互或者其他方式觸發狀態的變化,狀態變化聯動視圖的渲染和邏輯的執行,這就是前端應用的核心。

為什么之前 jQuery 時代沒咋聽說狀態管理的概念,而 Vue、React 時代經常聽到呢?

jQuery 時代是手動把數據渲染到視圖和執行數據變化之后的邏輯的,它可能沒有明確的狀態這一層,而是直接把數據渲染成 dom,下次需要數據也是從 dom 來取的。

而 Vue、React 前端框架的時代不需要手動操作 dom 和執行數據變化之后的邏輯,只要管理好狀態,由前端框架負責狀態變化之后的處理。

狀態管理管理的是什么呢?

什么是狀態管理

狀態管理具體有兩層含義:

  • 狀態變化之前的邏輯,一般是異步的。
  • 狀態變化之后的聯動處理,比如渲染視圖或執行某段邏輯。

比如 React 的 setState 不會馬上修改狀態,而是異步的批量的執行,把狀態做一下合并。

比如 Redux 的 action 在修改全局 state 之前也是要經歷中間件的處理的。

這些都是狀態變化之前的異步過程的管理,是狀態管理的第一層含義。

再比如 React setState 修改了狀態之后要觸發視圖的渲染和生命周期函數的執行,hooks 在依賴數組的狀態變化之后也會重新執行。(vue 的 data 修改之后會重新渲染視圖、執行 computed 和 watch 邏輯)

Redux 修改了全局狀態之后要通知組件做渲染或者做其他邏輯的處理,Vuex、Mobx 等都是。

這些是狀態變化之后的聯動處理的管理,是狀態管理的第二層含義。

我們知道了什么是狀態,什么是狀態管理,那前端框架 Vue、React 和全局狀態管理的庫 Redux、Mobx、Vuex 都是怎么實現狀態管理的呢?

狀態管理的兩種實現思路

狀態不會是一個,多個狀態的集合會用對象的 key、value 來表示,比如 React 的 state 對象,Vue 的 data 對象(雖然叫 data 也是指的狀態)。

怎么監聽一個對象的變化呢?

我們是不是可以提供一個 api 來修改,在這個 api 內做 state 變化之前的處理,并且在 state 變化之后做聯動處理。

這樣的方案只能通過 api 觸發狀態修改,直接修改 state 是觸發不了狀態管理邏輯的。

React 的 setState 就是這種思路,通過 setState 修改狀態會做狀態變化之前的批量異步的狀態合并,會觸發狀態變化之后視圖渲染和 hooks、生命周期的重新執行。但是直接修改 state 是沒用的。

那怎么讓直接修改狀態也能監聽到變化呢?

可以對狀態對象做一層代理,代理它的 get、set,當執行狀態的 get 的時候把依賴該狀態的邏輯收集起來,當 set 修改狀態的時候通知所有依賴它的邏輯(視圖渲染、邏輯執行)做更新。

Vue 的 data 監聽變化就是用的這種思路,在狀態 get 的時候把依賴封裝成 Watcher,當 set 的時候通知所有 Watcher 做更新。

這種思路叫做響應式(reactive),也就是狀態變化之后自動響應變化做聯動處理的意思。

代理 get、set 可以用 Object.defineProperty 的 api,但是它不能監聽動態增刪的對象屬性,所以 Vue3 改為了用 Proxy 的 api 實現。

監聽對象的變化就這兩種方式:

  • 提供 api 來修改,內部做聯動處理。
  • 對對象做一層代理,set 的時候做聯動處理,通知 get 時收集的所有依賴。

前端框架狀態變化的性能優化

但是頻繁的修改 state 不是每次都要做聯動處理,有一些可以合并的,比如兩次都把顏色改為紅色,那后續邏輯就沒必要執行兩次,需要再做些性能方面的優化。

所以 React 的 setState 是異步的,會做批量的 state 合并(注意,React 的 setState 傳入的不是最終的 state,而是 state 的 diff,React 內部去把這些 diff state 更新到 state)。

而 Vue 因為是直接修改的同一個對象,所以沒必要做啥合并,它的 Watcher 執行是異步的,對多次放到隊列里的 Watcher 做下去重就行了。

組件間的狀態管理

組件內的狀態管理就是這樣的,利用前端框架自帶的 state 機制來管理。

那組件之間呢?一個組件的 state 變了如何聯動其他組件變化?

props

通過 props,把當前組件的 state 作為 props 傳入其他組件就行了,這樣就能聯動變化。

但是 props 只能一層層傳遞,如果組件和想聯動變化的組件相隔很多層,傳遞 props 就很麻煩。

這種情況下前端框架也都提供了解決方案,React 提供了 Context、Vue 提供了 Event Bus。

Context、Event Bus

React 組件可以在 context 中存放 state,當 context 中的 state 變化的時候會直接觸發關聯組件的渲染。

Vue 可以在一個組件內 emit 一個事件,然后另一個組件 on 這個事件,然后更新自己的 data 來觸發渲染。不過這兩個 api 在 Vue3 都廢棄了。

這種前端框架自帶的任意層組件的狀態聯動方案只能處理簡單的場景,復雜的場景還是得用全局狀態管理庫,比如 Redux、Vuex、Mobx 這些。

為什么這么說呢?

還記得狀態管理的兩層含義么?狀態變化前的異步過程的管理,狀態變化后的聯動處理。

Context 和 Event Bus 都只做到了狀態變化后的聯動處理,但是沒有對狀態變化前的異步過程管理做支持。

比如多個組件都要修改 context 中的值(或者通過 event bus 修改全局狀態),這個過程都要執行一段異步邏輯,要做 loading 的展示,那多個組件里怎么復用這段 loading 的邏輯呢?

還有,如果異步過程比較麻煩,需要用 rxjs 這樣的庫,用 context 和 event bus 的方案怎么和 rxjs 結合呢?

當然,是可以對 context 和 event bus 做一些邏輯復用的封裝和一些結合 rxjs 方案之類的封裝的,但是比較麻煩。

而且更重要的是如果你想做這些的時候,那也就沒必要用 context 和 event bus 了,直接用全局狀態管理庫就行。

Redux、Mobx、Vuex

redux 就提供了中間件的機制,組件里發送 action 到 store(存放全局 state 的地方),之前會經歷層層中間件的處理,在這里就可以做一些可復用的邏輯的封裝,比如 loading 的處理,也可以結合 rxjs 這種異步過程處理方案。

redux 里最常用的中間件就是 redux-saga 和 redux-observable 了,這倆都是做異步過程的管理的。

redux-saga 是基于 generator 實現的,不管是同步還是異步,都只要聲明式的描述要執行的邏輯就行,由 saga 內部的執行器會去做同步或異步的處理,描述異步邏輯就很簡潔,而且 redux-saga 提供了很多內置的邏輯封裝。

redux-observable 則是結合 rxjs 的方案了,把 action 變成數據源,經歷層層 opreator 的處理,最后傳遞到 store。可以用 rxjs 生態大量的 oprator,做下組裝就行,根本不用自己寫異步邏輯的具體實現。

vuex 也同樣支持中間件機制。

mobx 沒有提供中間件機制,它的 action 是執行狀態 class 的某個方法,可以用 class 的那套來做封裝。

有的同學對這些狀態管理庫不太熟,簡單來介紹下。

我們理清了狀態管理的實現只有兩種方案,一種是提供 api 做修改,一種是對 state 對象做響應式代理。

前端框架的狀態管理是這樣,獨立的全局狀態管理庫也同樣是這樣。

redux 就是提供 api 來修改的方案,通過 reducer 函數來對傳入的 action 做處理,返回新的 state。

而且 redux 這種思路是函數式的思想,每個 reducer 都是輸入和輸出一一對應的純函數,返回的 state 都是全新的,為了方便創建新的 state,一般會搭配 immutable 庫,只要修改屬性就會返回新的 state 對象。

mobx 是響應式代理的方案,它對全局 state 做了一層代理(通過 Object.defineProperty),狀態的 get 收集依賴,set 的時候觸發依賴更新。

所以這種方案很自然的可以把全局 state 組織成一個個 class,是面向對象的思想,可以通過繼承等方式實現邏輯復用。

import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import {observer} from 'mobx-react';

@observer
class TodoListView extends Component {
render() {
return <div>
<ul>
{this.props.todoList.todos.map(todo =>
<TodoView todo={todo} key={todo.id} />
)}
</ul>
Tasks left: {this.props.todoList.unfinishedTodoCount}
</div>
}
}

const TodoView = observer(({todo}) =>
<li>
<input
type="checkbox"
checked={todo.finished}
onClick={() => todo.finished = !todo.finished}
/>{todo.title}
</li>
)

const store = new TodoList();
ReactDOM.render(<TodoListView todoList={store} />, document.getElementById('mount'));

vuex 則像是兩種思路的結合,內部是用響應式代理來實現的變化監聽,但是暴露出的 api 卻是 redux 的 action 那一套。

和 React 搭配使用的話,需要把組件添加到狀態的依賴中,這個不用自己調用 subscribe 之類的 api,直接用一些封裝好的高階組件(接受組件作為參數返回新的組件的組件)就行,比如 react-redux 的 connect,mobx-react 的 observer。

總結

講了這么多,回過頭來看一下就會發現:

不管是前端框架內置的組件內狀態變化管理的方案(react 的 setState、vue 的直接修改 data),還是前端框架提供的組件間的狀態管理方案(props、react 的 context、vue 的 event bus),或是第三方的全局狀態管理方案(redux、vuex、mobx 等),都沒有脫離那兩種實現狀態管理的方式:提供修改狀態的 api 或者對狀態對象做一層響應式代理。也沒有脫離狀態管理的兩層含義:對狀態變化前的異步過程做管理,狀態變化后做聯動處理。只不過它們用在了不同的地方(前端框架內、全局狀態管理庫),提供了不同的封裝形式(對象、函數),基于不同的思想(函數式、面向對象)結合了不同的異步管理方案(rxjs、generator + 自定義執行器)。

所以,狀態就是數據的變化。前端應用的核心問題就是管理狀態,管理狀態變化之前的通過視圖或者其他方式觸發的異步過程,管理狀態變化之后的聯動渲染和聯動的邏輯執行。

雖然我們會用不同的前端框架,不同的全局狀態管理庫,結合不同的異步過程處理方案,但是思想都是一樣的。

毫不夸張地說,理解了狀態管理,就理解了前端開發的核心。

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2020-04-16 10:55:03

Java虛擬機字節碼

2022-03-27 09:06:25

vuexActionsMutations

2019-09-29 06:12:38

交換機配置vlan

2024-03-15 08:23:26

異步編程函數

2019-12-26 09:15:44

網絡IOLinux

2012-11-30 11:19:02

JavaScript

2022-10-20 18:43:32

C語言golang安全

2024-11-25 07:39:48

2018-03-21 16:19:40

MVCMVPMVVM

2022-07-27 22:59:53

Node.jsNest

2019-09-16 08:32:59

遞歸算法編程

2019-09-18 10:12:37

遞歸數據結構

2021-09-07 07:55:22

Linux CPULinux 系統

2022-11-26 00:22:14

引用類型數組

2022-08-05 13:03:09

Python依賴管理代碼

2019-05-28 09:40:39

TCP協議socket接口

2019-05-17 09:02:19

TCP協議服務端

2022-02-21 07:45:29

面向對象代碼依賴倒置

2020-11-09 14:30:28

Linux多線程數據

2021-03-19 07:59:33

紅黑樹面試數據
點贊
收藏

51CTO技術棧公眾號

免费看一级大黄情大片| 91视频网页| 极品人妻videosss人妻| 国产欧美自拍| 亚洲精品菠萝久久久久久久| 国产精品一区在线播放| 国产真人无遮挡作爱免费视频| 青青草综合网| 精品国产乱码久久久久久久久| 精品这里只有精品| 毛片在线看片| 97精品久久久午夜一区二区三区| 国产精品一区av| 亚洲国产精品午夜在线观看| 成人免费在线播放| 精品av久久707| 九九热在线免费| caoprom在线| 国产精品成人网| 免费精品视频一区二区三区| 国产日韩欧美视频在线观看| 三级久久三级久久| 久久久久久久久国产| 亚洲第一视频区| 极品束缚调教一区二区网站 | 阿v天堂2018| 91网在线播放| www欧美成人18+| 91精品婷婷国产综合久久蝌蚪| 久久久黄色大片| 欧美精品首页| 色偷偷88888欧美精品久久久| 黄色免费视频网站| 欧美经典影片视频网站| 欧美色男人天堂| 999香蕉视频| 黄色软件视频在线观看| 亚洲精品视频一区| 亚洲在线色站| 久青草国产97香蕉在线视频| 精品伦一区二区三区| 欧美网站免费| 色综合久久综合网97色综合| 精品无码一区二区三区爱欲| 羞羞的视频在线看| 1024精品合集| 男女h黄动漫啪啪无遮挡软件| 国产系列在线观看| 久久新电视剧免费观看| 九色91视频| 人妻少妇精品无码专区| 国产成人三级在线观看| 亚洲bt天天射| www.爱爱.com| 懂色av一区二区在线播放| 91高跟黑色丝袜呻吟在线观看| 中文字幕在线2019| 蜜桃视频在线观看一区二区| 国产精品欧美日韩久久| 中文天堂在线视频| 麻豆91小视频| 91手机视频在线观看| 亚洲无码精品在线播放| 麻豆91在线播放| 成人免费高清完整版在线观看| 国产一区二区在线视频聊天| 狠狠色2019综合网| 日韩制服丝袜av| 日韩av在线免费观看| 中国一级特黄录像播放| 蜜桃一区av| 国产丝袜一区二区三区| 亚洲国产av一区| 欧美日韩一区二区三区视频播放| 在线观看国产欧美| 一起操在线播放| 欧美黄色aaaa| 国语自产精品视频在线看抢先版图片| 国产性xxxx高清| 日韩精品五月天| 国产精品亚洲欧美导航| 92久久精品一区二区| 国产成人av电影| 久久久com| av资源网站在线观看| 中文字幕一区免费在线观看 | 欧美xxxx黑人| 嫩草国产精品入口| 中文字幕久久亚洲| www青青草原| 一区二区三区四区五区在线| 国产精品成人一区| 性欧美18一19性猛交| 99久久精品情趣| 亚洲精品日韩精品| 国产蜜臀av在线播放| 福利微拍一区二区| 国产精品视频中文字幕| 成人激情自拍| 国产午夜精品免费一区二区三区 | 中文字幕一区二区人妻电影丶| 亚洲国产国产| 久久这里只有精品视频首页| 男女啊啊啊视频| 韩国毛片一区二区三区| 九9re精品视频在线观看re6 | 国产精品入口麻豆九色| 久久人人爽人人爽人人av| 亚洲伦理影院| 欧美精品一区二区三区蜜桃视频 | 91国产精品视频在线观看| 亚洲日本视频在线| 尤物九九久久国产精品的特点| 久久久久久久国产视频| 蜜芽一区二区三区| 久久艳妇乳肉豪妇荡乳av| 麻豆影视在线观看_| 色综合久久九月婷婷色综合| 自拍视频第一页| 97精品在线| 热久久99这里有精品| 精品国自产在线观看| 国产午夜精品一区二区| 草b视频在线观看| 国产韩日精品| 日韩精品免费电影| 青青操国产视频| 免费成人美女在线观看.| 久草精品电影| 九色91在线| 日韩一区二区三区视频在线| 色综合99久久久无码国产精品| 韩国亚洲精品| 亚洲综合自拍一区| 欧美69xxx| 欧美少妇性性性| 男生草女生视频| 久久精品91| 精品国产乱码久久久久久郑州公司| 2021国产在线| 日韩一级欧美一级| 丰满少妇被猛烈进入一区二区| 美国三级日本三级久久99| 欧美理论一区二区| 亚洲欧洲日本韩国| 亚洲国产一区二区三区四区| 国产一级片免费| 成人在线一区二区三区| 大陆极品少妇内射aaaaaa| 不卡一区视频| 麻豆成人在线看| 精品久久久无码中文字幕| 亚洲欧美另类久久久精品2019| 色婷婷成人在线| 久久伦理在线| 成人午夜在线观看| 综合久久2019| 精品国产乱码久久久久久1区2区| 国产盗摄一区二区三区在线| 国产馆精品极品| 在线观看av的网址| 97青娱国产盛宴精品视频| 欧美黑人性视频| 黄色片网站免费在线观看| 亚洲午夜精品网| 在线精品一区二区三区| 午夜亚洲视频| 日韩一区免费观看| 精品福利在线| 久久久精品免费视频| 国产高清视频免费| 亚洲成人免费在线| 四虎影成人精品a片| 日韩成人伦理电影在线观看| 亚洲春色在线| 久久精品一级| 97视频免费观看| 国产人成在线观看| 欧美精品在线观看一区二区| a级黄色片免费看| 菠萝蜜视频在线观看一区| 欧美亚洲精品一区二区| 成人羞羞视频播放网站| 91夜夜未满十八勿入爽爽影院| 青春草在线视频| 日韩精品视频观看| 中文字幕乱码人妻无码久久 | 一区二区不卡在线观看| 激情五月综合婷婷| 97精品视频在线播放| 九色蝌蚪在线| 91精品国产91久久综合桃花 | 亚洲成人原创| 日韩欧美视频一区二区三区四区| 精品亚洲二区| 亚洲精品天堂网| 另类人妖一区二区av| 久青草视频在线播放| 国产91一区| 亚洲综合色av| 亚洲最新无码中文字幕久久| 日韩中文字幕免费看| 日本精品999| 欧美猛男男办公室激情| www.国产成人| 亚洲日韩欧美一区二区在线| 毛茸茸多毛bbb毛多视频| 九九**精品视频免费播放| 欧美又粗又长又爽做受| 欧美日韩在线二区| 国产精品久久久久久久久久久久冷 | 亚洲人成啪啪网站| 国产模特av私拍大尺度| 日本乱人伦aⅴ精品| 国产一二三四在线| 国产精品久久久一本精品| 国产呦小j女精品视频| 国产精品一区2区| 国产一级特黄a大片免费| 亚洲精选一区| 91精品一区二区三区四区| 精品国产乱码久久久久久蜜坠欲下 | 91在线视频18| 中文字幕在线国产| 狠狠色狠狠色综合| 99re精彩视频| 日韩中文字幕不卡| 久久精品99国产| 亚洲久久一区二区| 天堂а√在线中文在线| 99国内精品久久久久久久| 日韩欧美一区二区三区四区| 亚洲+小说+欧美+激情+另类| 国产欧美日韩综合一区在线观看| 欧美成年网站| 成人午夜黄色影院| 爱情电影网av一区二区| 91九色视频导航| 日本午夜精品久久久久| 国产精品美女av| 日韩不卡视频在线观看| 国产成+人+综合+亚洲欧洲| 厕沟全景美女厕沟精品| 18一19gay欧美视频网站| a国产在线视频| 97视频免费看| 松下纱荣子在线观看| 69av视频在线播放| 天堂av在线| 欧美又大又粗又长| 成人片免费看| 国产成人在线一区二区| 韩国成人在线| 国产精品视频网站| 欧美综合影院| 亚洲www在线| 日韩一级淫片| 国精产品一区二区| 一本久久青青| 日韩免费毛片| 91av精品| 日本香蕉视频在线观看| 雨宫琴音一区二区在线| 国产亚洲精品网站| 日韩和的一区二区| 特黄视频免费观看| 福利一区二区在线| 亚洲一区二区三区四区五区六区| 久久在线观看免费| 调教驯服丰满美艳麻麻在线视频| 国产精品美女久久久久久久久| 内射一区二区三区| 亚洲成av人在线观看| 国产精品777777| 欧美影视一区在线| 国产不卡精品视频| 亚洲护士老师的毛茸茸最新章节| 日本电影一区二区在线观看| 中文欧美在线视频| 日本精品600av| 欧美在线激情网| 亚洲日本免费电影| 国产精品免费一区二区三区四区 | 成人综合在线网站| 亚洲精品理论片| 亚洲欧洲国产日韩| 国产网址在线观看| 欧美性一二三区| 亚洲国产视频一区二区三区| 亚洲精品在线91| 菠萝菠萝蜜在线视频免费观看| 38少妇精品导航| 91麻豆精品| 久久亚洲免费| 夜间精品视频| 国产精品免费成人| 国产激情视频一区二区三区欧美| 欧美熟妇精品黑人巨大一二三区| 国产精品久久久久精k8| 国产精品6666| 欧美日韩在线综合| 天天干天天摸天天操| 日韩一区二区三区xxxx| 99久久精品免费看国产小宝寻花| 国产精品视频xxxx| 六月丁香久久丫| 熟妇熟女乱妇乱女网站| 日精品一区二区| 中国黄色片视频| 国产精品福利一区| 潘金莲一级淫片aaaaaa播放| 精品日韩99亚洲| 激情在线小视频| 国产精品美女www爽爽爽视频| 91久久精品无嫩草影院| 亚洲午夜在线观看| 国产一区二区三区久久| 午夜性福利视频| 最新中文字幕一区二区三区 | 欧美家庭影院| 91精品国产综合久久久久久久久| 亚洲三级精品| www.爱色av.com| 岛国一区二区三区| 91视频综合网| 3751色影院一区二区三区| 黄色在线小视频| 欧亚精品中文字幕| 韩国女主播一区二区三区| 无码人妻aⅴ一区二区三区日本| 日本不卡的三区四区五区| 波多野结衣av在线免费观看| 精品久久久一区二区| 亚洲男人第一天堂| 欧美成人三级视频网站| 色综合久久久| 先锋影音欧美| 蜜桃av噜噜一区| 免费网站在线高清观看| 欧美视频免费在线| 五月婷婷丁香花| 午夜精品99久久免费| 国产精品xxxav免费视频| 欧美在线观看黄| 国产成人精品aa毛片| 久久久久久久久久99| 精品久久99ma| 9999精品成人免费毛片在线看| 国产精品美女诱惑| 日韩午夜免费视频| 天堂久久久久久| 欧美性xxxx极品hd满灌| 欧美成人综合在线| 国产va免费精品高清在线| 国产尤物久久久| 亚洲综合日韩欧美| 《视频一区视频二区| www.av日韩| 97在线视频免费观看| 亚洲国产最新| 久久精品视频91| 国产精品另类一区| 国产乱码精品一区二区三区精东| 欧美成人亚洲成人日韩成人| 亚洲精品一二三**| 黄色免费福利视频| 国产日韩欧美制服另类| 亚洲综合五月天婷婷丁香| 美女999久久久精品视频| 97成人在线| 久久久久久久久久久久久国产精品| 久久久99精品免费观看| 中文字幕视频二区| 久久躁狠狠躁夜夜爽| 免费看久久久| 免费涩涩18网站入口| 亚洲欧美成人一区二区三区| 免费看av毛片| 国产成人精品在线视频| 国产精品97| 99久久免费看精品国产一区| 91高清视频在线| 污的网站在线观看| 蜜桃导航-精品导航| 久久精品国产精品青草| 国产精品theporn动漫| 国产一区二区成人| 精品视频在线观看免费观看| 男人操女人免费软件| 一区在线观看免费| 亚洲aaa在线观看| 91夜夜揉人人捏人人添红杏| 亚洲永久字幕| 欧美另类videoxo高潮| 日韩精品在线第一页| 电影一区中文字幕| aa在线免费观看| 亚洲制服丝袜在线| 最新av网站在线观看| 精品无人乱码一区二区三区的优势|