国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

前端:從狀態管理到有限狀態機的思考

新聞 前端
在我們前端開發中,一定會接觸現在最熱門的幾大框架(Vue, React等等),在使用框架的過程中,我們一定會接觸某些狀態管理工具。

 1. 狀態管理

在我們前端開發中,一定會接觸現在最熱門的幾大框架(Vue, React等等),在使用框架的過程中,我們一定會接觸某些狀態管理工具。

Vue我們會使用Vuex來管理全局狀態, React會使用Redux來管理。

首先是不是,在問為什么?

在使用類似Vue,React框架時,我們一定會使用狀態管理嗎?這個答案是肯定的。或許我不會主動去使用Vuex, Redux,但我們編寫每一個組件的時候就已經在管理狀態,Vuex, Redux只是更方便我們進行全局的狀態管理。

為什么一定會使用狀態管理?這是因為現代前端框架使用數據驅動視圖的形式來描述頁面。比如,Vue、 React組件會有一個自己內部,外部的狀態來共同決定組件的如何顯示的,用戶與組件交互導致數據變更,進而改變視圖。

框架 內部狀態 外部狀態
Vue data props
React state, useState props

所以我們所寫大部分業務邏輯,是在管理狀態,框架會幫我們狀態映射成視圖,這可以說是很經典的MVVM模式。

  1. View = ViewModel(Model); 
  2. // 視圖 =  狀態 + 管理 
  3. 復制代碼 

2. 有限狀態機:計算機中一種用來進行對象行為建模的工具

其作用主要是描述對象在它的生命周期內所經歷的狀態序列,以及如何響應來自外界的各種事件。

我們來理解一下上面這段話。

  • 一種對象行為建模工具

    我們用來描述對象行為,狀態隨著時間轉變過渡行為的工具。可以模擬世界上大部分事物。

  • 生命周期

    我們通過抽象對象所經歷的狀態序列,來確定對象一系列可能的生命周期和轉變。

  • 響應外界事件

    外界事件能夠影響對象內部狀態。對象能夠對外部事件作出響應。

狀態機有基本幾個要素:

  1. 當前所處狀態

    在各個時刻只處于一種狀態

  2. 狀態轉移函數

    在某種條件下,會從一種狀態轉移到另外一種狀態。

  3. 有限狀態序列

    擁有有限,可枚舉的狀態數

 

 


 

 上面這張圖所描述的狀態機,我們使用js對象來進行描述

  1. const stateTool = { 
  2.   // 當前狀態 
  3.   currentState: '1'
  4.    
  5.   // 狀態轉變函數 
  6.   transition: (event) => { 
  7.   switch(event.type) { 
  8.       case '1': { 
  9.         this.currentState = event.status; 
  10.         doSomething1(); 
  11.         break
  12.       } 
  13.       case '2': { 
  14.         this.currentState = event.status; 
  15.         doSomething2(); 
  16.         break
  17.       } 
  18.       case '3': { 
  19.         this.currentState = event.status; 
  20.         doSomething3(); 
  21.         break
  22.       } 
  23.       default:  
  24.         console.log('Invalid State!'); 
  25.         break
  26.     } 
  27.   } 
  28. 復制代碼 

使用有限自動機是一種狀態管理的思考方式,我們可以列舉組件狀態列表,設計觸發狀態函數。通過外部或內部交互行為,觸發函數改變狀態,根據狀態改變視圖

3. Flux思想

Flux是什么?Flux是一個Facebook開發的、利用單向數據流實現的應用架構

簡單說,Flux 是一種架構思想,專門解決軟件的結構問題。可以說他是有限狀態機的另外一種形式。

一個Flux管理分為4個狀態:

  • View:視圖層

  • Action(動作):視圖層觸發的動作 or 行為

  • Dispatcher(派發器):收集觸發行為,進行統一管理,統一分發給store層。

  • Store(數據層):用來存放應用的狀態,根據dispatcher觸發行為,就提醒Views要更新頁面

 

 


 

 

 

要是同學了解flux的的工作流程,那么很容易就發現這是一種工程化的狀態機。

 

  • 初始狀態

我們通過store 存放的是初始化狀態,這種初始化狀態數據可以頁面初始化時設定 或 頁面加載時請求后端接口數據,來初始化store數據。

通過store的初始化數據,來構建初始化的視圖層。

  • 狀態轉移事件

根據視圖層的行為會觸發action,我們通過統一的dispatcher來收集action, dispatcher將行為派發給store。

  • 狀態轉移函數

store通過判斷事件的類型 和 payload,來修改內部存儲狀態。達到狀態轉移的目的,并統一提醒view層更新頁面;

4. 全局到局部的狀態管理

既然我們是通過數據狀態來管理視圖的,那么在設計初期我們就可以從有限的狀態轉移來思考業務邏輯。通過思考每個狀態對應的數據,狀態轉移函數,我們可以很清晰的羅列出數據更變邏輯。從數據去控制視圖也是現代前端所接觸到的MVVM模式。

一個大型應用,我們也會使用Vuex 或 Redux來進行一整個應用的管理。

在平時的業務中,我們會遇到一個痛點是:Vuex,Redux是一個全局狀態管理,但我們現在需要在局部需要一個局部狀態管理變更,只能使用 mutation 或 dispatch 去提交更改。

如果我們頻繁的更新狀態,那么我們需要為每一個局部模塊編寫大量dispatch函數來間接修改全局狀態。隨著應用的擴充,dispatch文件會越來越臃腫。

那么我們是不是可以使用不同的狀態管理工具,來實現局部狀態的管理。在局部狀態更新完之后,再去用局部更新去更新全局呢?

注:但這也會有一個缺點,局部管理相對獨立。有些高度復用的提交函數需要放在全局狀態管理上

a. 框架原生組件狀態管理

React Hooks + React.createContext

React Hooks提供了useReducer + useContext + Context 可以實現一個小型的狀態管理

  1. // 以下代碼就實現了一個能夠穿透組件的狀態管理 
  2. import React, { useReducer, useContext } from 'react'
  3.  
  4. const reducer = (state = 0, { type, ...payload }) => { 
  5.   switch (type) { 
  6.     case 'add'
  7.       return state + 1
  8.     case 'desc'
  9.       return state - 1
  10.     default
  11.       return state; 
  12.   } 
  13.  
  14. const Context = React.createContext(); 
  15. const Parent = () => { 
  16.   const [state, dispatch] = useReducer(reducer, 0); 
  17.   return ( 
  18.     <> 
  19.       <Context.Provider value={{ state, dispatch }}> 
  20.         <Son /> 
  21.       </Context.Provider> 
  22.     </> 
  23.   ) 
  24.  
  25. function Son() { 
  26.   return <Counter /> 
  27.  
  28. function Counter() { 
  29.   const { state, dispatch } = useContext(Context); 
  30.   return ( 
  31.     <div> 
  32.       <button onClick={() => dispatch({ type: 'desc' })}>-</button> 
  33.       {state} 
  34.       <button onClick={() => dispatch({ type: 'add' })}>+</button> 
  35.     </div> 
  36.   ) 
  37. export default Parent; 
  38. 復制代碼 

Vue響應式數據 + vue.Provide/inject

使用vue響應式系統 + provide/inject API來實現一個具有穿透性的局部狀態管理

  1. // Parent.vue 
  2. <template> 
  3.   <Son /> 
  4. </template> 
  5.  
  6. <script setup> 
  7. import { provide, reactive, readonly } from "vue"
  8. import Son from "./Son.vue"
  9. const data = reactive({ 
  10.   count: 0
  11. }); 
  12. const onAdd = () => { 
  13.   data.count++; 
  14. }; 
  15. const onDesc = () => { 
  16.   data.count--; 
  17. }; 
  18. provide("store", { 
  19.   data: readonly(data), // 只讀屬性 
  20.   onAdd, // 修改函數add 
  21.   onDesc, // 修改函數desc 
  22. }); 
  23. </script> 
  24.  
  25. 復制代碼 
  1. // Son.vue 
  2. <template> 
  3.   <Counter /> 
  4. </template> 
  5.  
  6. <script setup> 
  7. import Counter from "./Counter.vue"
  8. </script> 
  9. 復制代碼 
  1. // Counter.vue 
  2. <template> 
  3.   <div> 
  4.     <button @click="store.onDesc">-</button> 
  5.     {{ store.data.count }} 
  6.     <button @click="store.onAdd">+</button> 
  7.   </div> 
  8. </template> 
  9.  
  10. <script setup> 
  11. import { inject } from "vue"
  12. const store = inject("store", {}); // 穿透讀取store 
  13. </script> 
  14. 復制代碼 

b. 線性狀態管理:Xstate

 

 

Xstate是一個很有趣的類似有限狀態機的狀態管理, Xstate 著重點在于 管理狀態 ,通過 狀態轉換去維護數據 。

我們來定義一個簡單的promise狀態機,使用官方提供的工具進行可視化 

 

 

 

  1. import { Machine } from 'xstate'
  2.  
  3. // 創建狀態機 
  4. const promiseMachine = Machine({ 
  5.   id: 'promise'// 唯一id 
  6.   initial: 'pending'// 初始化狀態 
  7.   states: { // 狀態集合 
  8.     pending: { 
  9.       on: { 
  10.         RESOLVE: 'resolved'
  11.         REJECT: 'rejected'
  12.    } 
  13.     }, 
  14.     resolved: { 
  15.       type: 'final'
  16.     }, 
  17.     rejected: { 
  18.       type: 'final' 
  19.     } 
  20.   } 
  21. }) 
  22. 復制代碼 

注意:warning::狀態機不擁有狀態,他只是定義狀態和定義狀態轉移

Xstate有提供函數來實現狀態機服務,實現擁有狀態的實體

  1. import { interpret } from 'xstate' 
  2. const promiseService = interpret(promiseMachine).onTransition(state =>  
  3.   console.log(state.value) 
  4. // 創建服務,指定狀態轉移時回調函數 
  5. promiseService.start() // 啟動服務 
  6. promiseService.send('RESOLVE'); // 通知服務轉移狀態,并執行回調函數 
  7. 復制代碼 

這樣子我們就實現了一個簡單的Promise狀態機。他有很多應用,可以結合Vue,結合React進行使用。更加深入的內容就需要到官方文檔中自行探索了!

就我個人的看法,狀態機思想非常適合狀態轉移相對線形的場景,在某些狀態多循環的場景轉移會相對復雜些

c. 可響應式的狀態管理器:Mobx

mobx是一種響應式的狀態管理,他所提倡的是拆分store做數據管理。這就很適合做局部的狀態管理,根據局部狀態管理來更新全局狀態。

相同的,我們舉個例子

  1. import { action, autorun, observable } from 'mobx' 
  2. import { observer } from 'mobx-react' 
  3. import React from 'react' 
  4.  
  5. const appStore = observable({ // 建立store 
  6.   count: 0
  7.   age: 18
  8. }) 
  9.  
  10. // autorun 只會觀察依賴的相關數據 
  11. // 使用當appStore.age更新時,才會觸發該函數 
  12. autorun(() => { 
  13.   // doSomething(); 
  14.   console.log('autorun', appStore.age); 
  15. }) 
  16.  
  17. const Counter = observer(() => { 
  18.   const { count } = appStore; 
  19.   const onAdd = action(() => { // 使用action更新store數據 
  20.     appStore.count++; 
  21.   }) 
  22.   const onDesc = action(() => { 
  23.     appStore.count--; 
  24.   }) 
  25.   return ( 
  26.     <div> 
  27.       <button onClick={onDesc}>-</button> 
  28.       {count} 
  29.       <button onClick={onAdd}>+</button> 
  30.     </div> 
  31.   ) 
  32. }) 
  33.  
  34. export default Counter; 
  35. 復制代碼 

5. 總結

現在前端主流使用數據驅動視圖的形式,來實現業務。希望給大家帶來兩點啟發

  1. 用有限狀態機去思考某些線性狀態場景的數據管理。

  2. 在之前的業務開發的時候,就會出現一個痛點,應用全局狀態管理非常臃腫。

    在不斷功能迭代的過程中,需要做不同的狀態管理,雖然都是對同一份數據進行維護,但維護的方式不同,進行一次狀態更新就需要編寫一個不同的dispatch函數。隨著業務需求的增加,dispatch函數越來越多,難以管理和復用。

    思考如何解決這個問題的時,偶然看到了有限狀態機相關文章,思考到應用的功能模塊在某一個時刻是相互獨立的,我們在局部將數據進行更新,之后用一個全局函數對數據進行統一替換。

注:本文為探索性質,使用原生組件進行局部管理不需要引入依賴。但使用第三方工具造成包體積大小的增加,是否會增加性能消耗有待討論

 

責任編輯:張燕妮 來源: 高級前端進階
相關推薦

2013-09-03 09:57:43

JavaScript有限狀態機

2014-05-21 11:09:56

前端有限狀態機

2021-09-07 06:40:26

狀態機識別地址

2022-03-06 19:57:50

狀態機easyfsm項目

2025-04-28 08:25:00

狀態機框架狀態機開發

2023-03-06 07:35:30

狀態機工具訂單狀態

2025-10-29 07:38:45

2023-04-12 07:14:31

Spring應用業務

2017-07-10 14:53:35

前端開發MVVM模式有限狀態機

2010-06-18 12:38:38

UML狀態機視圖

2025-06-04 01:55:00

2020-03-27 10:50:29

DSL 狀態機工具

2010-06-18 13:25:44

UML狀態機視圖

2021-07-08 09:15:20

單片機編程狀態機編程語言

2022-05-28 16:08:04

前端

2011-08-22 10:52:30

iptables狀態

2024-10-10 17:46:06

2025-08-28 01:12:00

狀態機系統編排

2010-07-08 13:03:31

UML狀態機圖

2011-06-24 16:09:24

Qt 動畫 狀態機
點贊
收藏

51CTO技術棧公眾號

尤物视频在线看| 日韩免费观看高清完整版在线观看| 国产在线视视频有精品| 国产69精品久久久久9| 天堂成人在线| 久久久久久久综合| 欧美精品亚洲精品| 日韩有码中文字幕在线| 亚洲精品视频久久| 成年女人的天堂在线| 综合分类小说区另类春色亚洲小说欧美| 欧美色图亚洲自拍| 天天综合久久| 孩xxxx性bbbb欧美| 欧美va在线观看| 91精品国产综合久久久久久| 国产高潮av| av不卡在线观看| 欧美久久久久久一卡四| 色狮一区二区三区四区视频| 欧美激情女人20p| 美女福利一区二区| 欧美大片免费久久精品三p| 中文字幕在线中文字幕二区| 国产欧美日韩麻豆91| 99热一区二区三区| 久久福利毛片| 成人动漫在线视频| 欧美激情成人| 国产精品pans私拍| 极品束缚调教一区二区网站| 深夜福利亚洲导航| 素人一区二区三区| 亚洲欧美另类中文字幕| av女在线播放| 亚洲激情在线视频| 国产丝袜在线观看视频| 91精品免费观看| 国产黄色在线免费观看| 欧美午夜电影在线播放| 国产黄色片在线播放| 欧美性xxxx在线播放| 资源视频在线播放免费| 亚洲午夜日本在线观看| 一本岛在线视频| 不卡av在线播放| 中文一区一区三区高中清不卡免费| 日韩国产高清视频在线| 草草在线视频| 亚州成人av在线| 亚洲综合二区| 国产精品国产一区二区| 亚洲福利一区| 欧美精选一区二区| 91女主播在线观看| 欧美一级国产精品| 丝袜美女在线观看| 日韩高清欧美高清| 99re66热这里只有精品4| 视频在线观看99| 99视频有精品高清视频| 欧美精品videosex性欧美| 精品伊人久久久| 国产成+人+综合+亚洲欧美丁香花| 一区二区小说| 亚洲va男人天堂| 男女精品视频| 日本黄网站色大片免费观看| 99riav久久精品riav| 男生操女生视频网站| 黑人巨大精品欧美一区二区三区 | 99re免费视频精品全部| 免费看污黄网站| 午夜天堂影视香蕉久久| 尤物视频在线看| 久久综合久久八八| 久久精品亚洲人成影院| 亚洲一区二区在线观| 2020国产精品自拍| 中文字幕高清在线观看| 欧美成人bangbros| 超碰精品在线观看| 黄色99视频| 在线国产网址| 99精品国产在热久久婷婷| 日韩影视精品| 国产日韩欧美在线一区| 欧洲亚洲在线| 亚洲精品一区二区三区婷婷月| 亚洲欧美日本国产| 久久av一区二区| 91丨porny丨最新| yiren22亚洲综合伊人22| 日韩av影片在线观看| 亚洲人成网站77777在线观看| 狠狠久久综合婷婷不卡| 久久久久久久久岛国免费| 日本五码在线| 久久精品视频99| 亚洲激情欧美| 国产性生交xxxxx免费| 欧美日韩一区二区三区高清| 国产91亚洲精品久久久| 51国产成人精品午夜福中文下载 | 欧美一级电影在线| 日本特黄久久久高潮| wwwxxx黄色片| 欧美无砖专区一中文字| 日韩中文字幕无砖| 日韩视频精品| 午夜久久电影网| 国产亚洲精aa在线看| 视频一区视频二区视频三区视频四区国产 | 风间由美一区二区av101| 精品一区二区三区日本| 亚洲欧洲日本在线| 成人看片网站| 久久久久久高清| 亚洲成年人网站在线观看| 免费在线成人激情电影| 欧美xxxx黑人又粗又长精品| 亚洲午夜精品17c| 99久久婷婷国产综合精品青牛牛 | 日本精品视频一区| 亚洲黄色尤物视频| 玖玖玖视频精品| 日日噜噜夜夜狠狠久久丁香五月| 狠狠躁夜夜躁人人爽超碰91| 日韩成人18| 久久福利一区二区| 日韩免费性生活视频播放| 亚洲欧洲日韩| 黄色av免费| 国模精品视频一区二区| 国产精品视频500部| 欧美国产丝袜视频| 日本一区二区三区中文字幕| 亚洲精品一区二区三区樱花| 欧美日韩久久久一区| 久久精品国产大片免费观看| 女性隐私黄www网站视频| 亚洲区中文字幕| 免费成人在线视频观看| 国产日产一区二区| 国产精品推荐精品| 色婷婷精品久久二区二区蜜臂av | 亚洲欧美另类小说视频| 日韩国产网站| 艳色歌舞团一区二区三区| 欧美三电影在线| 亚洲色图网站| 97福利网站在线观看视频| 69**夜色精品国产69乱| 久久伊人中文字幕| 国产一区二区高清在线| 一区二区三区av| 精品国产乱码久久久久久蜜臀 | 国产毛片一区二区三区| 妞干网在线免费视频| 日韩一区二区三区xxxx| 成人av高清在线| 精品久久在线| 国内外成人激情视频| 中文字幕亚洲图片| 久久精品一区八戒影视| 玖玖玖视频精品| 欧美成人福利在线观看| 国产成人精品综合久久久| 亚洲一区二区三区精品在线| 国产一区二区观看| 在线免费激情视频| 国产色综合天天综合网| 欧美性生交xxxxxdddd| 极品裸体白嫩激情啪啪国产精品| melody高清在线观看| 欧美日韩一区二区三区免费| 亚洲成年人在线播放| av一区二区三区在线| 老牛精品亚洲成av人片| 国产女主播在线观看| 亚洲bt天天射| 亚洲精品在线观看视频| 国产1区2区3区精品美女| 亚洲日本一区二区三区在线| 爽爽免费视频| 久久99久久99精品蜜柚传媒| 精品国产伦理网| 久久精品人人做| 欧美www视频在线观看| 91中文在线| 久久网站免费视频| 国产精品91久久| 欧美日韩国产成人在线免费| 国内精品第一页| 成人资源在线| 九色在线观看| 国产美女主播在线| 国产精品高潮呻吟久久av无限| 欧美丰满嫩嫩电影| 久久先锋影音av鲁色资源网|