網站首頁 編程語言 正文
Mobx介紹
1.什么是Mobx
一個可以和React良好配合的集中狀態管理工具,和Redux解決的問題相似,都可以獨立組件進行集中狀態管理
mobx與react的關系,相當于vuex與vue的關系。
同類工具還有:
redux
、dva
、recoil
2.Mobx有什么優勢
1.簡單
編寫無模板的極簡代碼精準描述你的意圖 (原生js)
- 輕松實現最優渲染
依賴自動追蹤,實現最小渲染優化。
其實在原生的react上,react的性能并不是強項(vue的渲染速度確實折服了一票粉絲),但是mobx可以幫助react實現依賴的自動追蹤,實現優化react組件的性能。
架構自由
可移植, 可測試 無特殊心智負擔
React 和 MobX 是一對強力組合。React 通過提供機制把應用狀態轉換為可渲染組件樹并對其進行渲染。而MobX提供機制來存儲和更新應用狀態供 React 使用。
對于應用開發中的常見問題,React 和 MobX 都提供了最優和獨特的解決方案。React 提供了優化UI渲染的機制, 這種機制就是通過使用虛擬DOM來減少昂貴的DOM變化的數量。MobX 提供了優化應用狀態與 React 組件同步的機制,這種機制就是使用響應式虛擬依賴狀態圖表,它只有在真正需要的時候才更新并且永遠保持是最新的。
3.社區評價
配置開發環境
Mobx是一個獨立的響應式的庫,可以獨立于任何UI框架存在,但是通常大家習慣把它和React進行綁定使用,用Mobx來做響應式數據建模,React作為UI視圖框架渲染內容,我們環境的配置需要三個部分
- 一個create-react-app創建好的React項目環境
- mobx框架本身
- 一個用來鏈接mobx和React的中間件
# 創建項目 $ npm create-react-app react_mobx_app # 安裝mobx npm install mobx --save # 中間件工具 mobx-react-lite $ npm install mobx-react-lite # 官網推薦:mobx與react綁定庫 $ npm install mobx-react --save
瀏覽器支持
- MobX >=5 版本運行在任何支持 ES6 proxy 的瀏覽器。如果運行在像 IE11、Node.js 6 以下版本或依靠與較舊的 JavaScripCore 的安卓端的 React Native。
- MobX 4 可以運行在任何支持 ES5 的瀏覽器上,而且也將進行持續地維護。MobX 4 和 5 的 API 是相同的,并且語義上也能達到相同的效果,只是 MobX 4 存在一些 局限性。
小貼士: MobX 5 包的主入口點附帶 ES5 代碼,以便向后兼容所有構建工具。但因為 MobX 5 只能運行在現代瀏覽器上,所以可以考慮使用速度最快、體積最小的 ES6 構建: lib/mobx.es6.js
。例如,通過設置 webpack 的別名: resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}
基礎使用
需求: 使用mobx實現一個計數器的案例
1. 初始化mobx
初始化步驟
- 定義數據狀態(state)
- 在構造器中實現數據響應式處理
- 定義action函數
- 實例化store并導出
// 編寫第一個mobx store小案例 import { makeAutoObservable } from 'mobx' class CounterStore { // 1.定義數據 count = 0 constructor() { // 2.把數據弄成響應式 makeAutoObservable(this) } // 3.定義action函數,用來修改數據 addCount = () => { this.count++; } } // 4.實例化導出給react使用 const counterStore = new CounterStore() export { counterStore }
2. React使用store
實現步驟
- 在組件中導入counterStore實例對象
- 在組件中使用storeStore實例對象中的數據
- 通過事件調用修改數據的方法修改store中的數據
- 讓組件響應數據變化
import { counterStore } from '../store/counter' import { observer } from 'mobx-react-lite' function Count() { return ( <div> {/* 1.把store中的count渲染出來 */} <button>{counterStore.count}</button> <br /><hr /> {/* 2.通過點擊事件觸發action函數,修改count值 */} <button onClick={counterStore.addCount}>點我+1</button> </div> ) } // 包裹組件讓視圖響應數據變化 export default observer(Count)
Mobx - computed
計算屬性(衍生狀態)
概念: 有一些狀態根據現有的狀態計算(衍生)得到,我們把這種狀態叫做計算屬性, 看下面的例子
實現步驟
- 聲明一個存在的數據
- 通過get關鍵詞 定義計算屬性
- 在 makeAutoObservable 方法中標記計算屬性
不標記不影響計算屬性的使用,這里的標記只是為了讓代碼更直觀,程序員一看到這行代碼就知道filterList是通過計算屬性得來的。
- 修改聲明的數據,計算屬性的數據也會一起改變
- Mobx提供的計算屬性與
vue
中的computed
差別不大
// counterStore.js import { makeAutoObservable, computed } from 'mobx' class CounterStore { // 1.聲明一個list數組 list = [1, 2, 3, 4, 5, 6] constructor() { makeAutoObservable(this, { // 3.標記計算屬性 // 不標記不影響計算屬性的使用,這里的標記只是為了讓代碼更直觀,程序員一看到這行代碼就知道filterList是通過計算屬性得來的 filterList: computed }) } // 2.定義計算屬性 get filterList() { return this.list.filter(item => item > 2) } changeList = () => { this.list.push(7, 8, 9) } } const counterStore = new CounterStore() export { counterStore }
// Count.jsx import { counterStore } from '../store/counter' import { observer } from 'mobx-react-lite' function Count() { return ( <div> {/* 使用計算屬性 */} {counterStore.filterList.join('-')} <button onClick={counterStore.changeList}>修改List</button> </div> ) } // 包裹組件讓視圖響應數據變化 export default observer(Count)
Mobx - 模塊化
場景: 一個項目有很多的業務模塊,我們不能把所有的代碼都寫到一起,這樣不好維護,為了提供可維護性,需要引入模塊化機制
實現步驟
- 拆分模塊js文件,每個模塊中定義自己獨立的state/actions
- 在store/index.js中導入拆分之后的模塊,進行模塊組合
- 利用React的useContext的機制導出統一的useStore方法,給業務組件使用
代碼實現
項目結構
src ├─App.jsx ├─index.js ├─store | ├─count.Store.js | ├─index.js | └list.Store.js ├─components | ├─Count.jsx | └List.jsx
/src/store/count.Store.js
import { makeAutoObservable } from 'mobx' class CountStore { count = 0 constructor() { makeAutoObservable(this) } addCount = () => { this.count++ } } export { CountStore }
/src/store/list.Store.js
import { makeAutoObservable } from "mobx"; class ListStore { constructor() { makeAutoObservable(this) } list = ['react', 'vue'] changeList = () => { this.list.push('angular') } } export { ListStore }
/src/store/index.js
// 組合子模塊 封裝統一導出的供組件使用的方法 import React, { useContext } from "react"; import { CountStore } from "./count.Store"; import { ListStore } from "./list.Store"; class RootStore { constructor() { // 對子模塊進行實例化操作 // 將來實例化rootstore的時候,rootstore實例上有兩個屬性,分別存放了子模塊的兩個實例。 this.countStore = new CountStore() this.listStore = new ListStore() } } // 使用react context機制,完成統一方法封裝 // 1.實例化rootStore注入context const rootStore = new RootStore() const context = React.createContext(rootStore) // 2.導出useStore方法,供組件通過調用該方法使用根實例 // 作用:通過useContext拿到rootStore實例對象,然后返回 // 只要在業務組件中 調用useStore() 就可以拿到 rootStore實例對象 const useStore = () => useContext(context) export { useStore }
組件使用模塊中的數據
import { observer } from 'mobx-react-lite' import { useStore } from './store' function App() { const { countStore } = useStore() return ( <div className="App"> <button onClick={() => countStore.addCount()}> {countStore.count} </button> </div> ) } // 包裹組件讓視圖響應數據變化 export default observer(App)
Mobx - 總結
1.初始化Mobx的過程是怎樣的?
聲明數據 -> 響應式處理 -> 定義action函數 -> 實例化導出
2.Mobx如何配合react,需要依賴什么包?
mobx-react-lite作為連接包,導出
observer
方法,包裹組件
3.模塊化解決了什么問題?
維護性問題
4.如何實現Mobx的模塊化?
按照功能拆分store模塊,根模塊中組合子模塊,利用
context
機制依賴注入
原文鏈接:https://blog.csdn.net/Svik_zy/article/details/126323369
相關推薦
- 2022-05-08 python如何生成密碼字典_python
- 2022-01-22 Springboot + Redis 哨兵模式
- 2023-07-28 el-tab 切換時添加動畫
- 2022-09-06 Golang實現http重定向https_Golang
- 2023-04-11 Go使用協程批量獲取數據加快接口返回速度_Golang
- 2022-01-31 git統計當前項目代碼行數
- 2023-03-26 Kotlin?server多線程編程詳細講解_Android
- 2022-10-03 C語言實現經典排序算法的示例代碼_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支