最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React+Mobx基本使用、模塊化操作

 更新時間:2022年09月07日 17:03:33   作者:codeMak1r.小新  
React 和 MobX 是一對強力組合,React 通過提供機制把應(yīng)用狀態(tài)轉(zhuǎn)換為可渲染組件樹并對其進行渲染,而MobX提供機制來存儲和更新應(yīng)用狀態(tài)供 React 使用,這篇文章主要介紹了React+Mobx基本使用、模塊化,需要的朋友可以參考下

Mobx介紹

1.什么是Mobx

一個可以和React良好配合的集中狀態(tài)管理工具,和Redux解決的問題相似,都可以獨立組件進行集中狀態(tài)管理

mobx與react的關(guān)系,相當于vuex與vue的關(guān)系。

同類工具還有:reduxdva、recoil

2.Mobx有什么優(yōu)勢

1.簡單

編寫無模板的極簡代碼精準描述你的意圖 (原生js)

  1. 輕松實現(xiàn)最優(yōu)渲染

    依賴自動追蹤,實現(xiàn)最小渲染優(yōu)化。

    其實在原生的react上,react的性能并不是強項(vue的渲染速度確實折服了一票粉絲),但是mobx可以幫助react實現(xiàn)依賴的自動追蹤,實現(xiàn)優(yōu)化react組件的性能。

架構(gòu)自由

可移植, 可測試 無特殊心智負擔(dān)

React 和 MobX 是一對強力組合。React 通過提供機制把應(yīng)用狀態(tài)轉(zhuǎn)換為可渲染組件樹并對其進行渲染。而MobX提供機制來存儲和更新應(yīng)用狀態(tài)供 React 使用。

對于應(yīng)用開發(fā)中的常見問題,React 和 MobX 都提供了最優(yōu)和獨特的解決方案。React 提供了優(yōu)化UI渲染的機制, 這種機制就是通過使用虛擬DOM來減少昂貴的DOM變化的數(shù)量。MobX 提供了優(yōu)化應(yīng)用狀態(tài)與 React 組件同步的機制,這種機制就是使用響應(yīng)式虛擬依賴狀態(tài)圖表,它只有在真正需要的時候才更新并且永遠保持是最新的。

3.社區(qū)評價

配置開發(fā)環(huán)境

Mobx是一個獨立的響應(yīng)式的庫,可以獨立于任何UI框架存在,但是通常大家習(xí)慣把它和React進行綁定使用,用Mobx來做響應(yīng)式數(shù)據(jù)建模,React作為UI視圖框架渲染內(nèi)容,我們環(huán)境的配置需要三個部分

  • 一個create-react-app創(chuàng)建好的React項目環(huán)境
  • mobx框架本身
  • 一個用來鏈接mobx和React的中間件
# 創(chuàng)建項目
$ npm create-react-app react_mobx_app

# 安裝mobx
npm install mobx --save

# 中間件工具 mobx-react-lite
$ npm install mobx-react-lite

# 官網(wǎng)推薦:mobx與react綁定庫
$ npm install mobx-react --save

瀏覽器支持

  • MobX >=5 版本運行在任何支持 ES6 proxy 的瀏覽器。如果運行在像 IE11、Node.js 6 以下版本或依靠與較舊的 JavaScripCore 的安卓端的 React Native。
  • MobX 4 可以運行在任何支持 ES5 的瀏覽器上,而且也將進行持續(xù)地維護。MobX 4 和 5 的 API 是相同的,并且語義上也能達到相同的效果,只是 MobX 4 存在一些 局限性。

小貼士: MobX 5 包的主入口點附帶 ES5 代碼,以便向后兼容所有構(gòu)建工具。但因為 MobX 5 只能運行在現(xiàn)代瀏覽器上,所以可以考慮使用速度最快、體積最小的 ES6 構(gòu)建: lib/mobx.es6.js 。例如,通過設(shè)置 webpack 的別名: resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}

基礎(chǔ)使用

需求: 使用mobx實現(xiàn)一個計數(shù)器的案例

1. 初始化mobx

初始化步驟

  • 定義數(shù)據(jù)狀態(tài)(state)
  • 在構(gòu)造器中實現(xiàn)數(shù)據(jù)響應(yīng)式處理
  • 定義action函數(shù)
  • 實例化store并導(dǎo)出
// 編寫第一個mobx store小案例
import { makeAutoObservable } from 'mobx'

class CounterStore {
  // 1.定義數(shù)據(jù)
  count = 0
  constructor() {
    // 2.把數(shù)據(jù)弄成響應(yīng)式
    makeAutoObservable(this)
  }
  // 3.定義action函數(shù),用來修改數(shù)據(jù)
  addCount = () => {
    this.count++;
  }
}

// 4.實例化導(dǎo)出給react使用
const counterStore = new CounterStore()
export { counterStore }

2. React使用store

實現(xiàn)步驟

  • 在組件中導(dǎo)入counterStore實例對象
  • 在組件中使用storeStore實例對象中的數(shù)據(jù)
  • 通過事件調(diào)用修改數(shù)據(jù)的方法修改store中的數(shù)據(jù)
  • 讓組件響應(yīng)數(shù)據(jù)變化
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.通過點擊事件觸發(fā)action函數(shù),修改count值 */}
      <button onClick={counterStore.addCount}>點我+1</button>
    </div>
  )
}
// 包裹組件讓視圖響應(yīng)數(shù)據(jù)變化
export default observer(Count)

Mobx - computed

計算屬性(衍生狀態(tài))

概念: 有一些狀態(tài)根據(jù)現(xiàn)有的狀態(tài)計算(衍生)得到,我們把這種狀態(tài)叫做計算屬性, 看下面的例子

實現(xiàn)步驟

  • 聲明一個存在的數(shù)據(jù)
  • 通過get關(guān)鍵詞 定義計算屬性
  • 在 makeAutoObservable 方法中標記計算屬性

不標記不影響計算屬性的使用,這里的標記只是為了讓代碼更直觀,程序員一看到這行代碼就知道filterList是通過計算屬性得來的。

  • 修改聲明的數(shù)據(jù),計算屬性的數(shù)據(jù)也會一起改變
  • Mobx提供的計算屬性與vue中的computed差別不大
// counterStore.js
import { makeAutoObservable, computed } from 'mobx'

class CounterStore {
  // 1.聲明一個list數(shù)組
  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>
  )
}
// 包裹組件讓視圖響應(yīng)數(shù)據(jù)變化
export default observer(Count)

Mobx - 模塊化

場景: 一個項目有很多的業(yè)務(wù)模塊,我們不能把所有的代碼都寫到一起,這樣不好維護,為了提供可維護性,需要引入模塊化機制

實現(xiàn)步驟

  • 拆分模塊js文件,每個模塊中定義自己獨立的state/actions
  • 在store/index.js中導(dǎo)入拆分之后的模塊,進行模塊組合
  • 利用React的useContext的機制導(dǎo)出統(tǒng)一的useStore方法,給業(yè)務(wù)組件使用

代碼實現(xiàn)

項目結(jié)構(gòu)

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

// 組合子模塊 封裝統(tǒng)一導(dǎo)出的供組件使用的方法
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機制,完成統(tǒng)一方法封裝

// 1.實例化rootStore注入context
const rootStore = new RootStore()
const context = React.createContext(rootStore)

// 2.導(dǎo)出useStore方法,供組件通過調(diào)用該方法使用根實例
// 作用:通過useContext拿到rootStore實例對象,然后返回
// 只要在業(yè)務(wù)組件中 調(diào)用useStore() 就可以拿到 rootStore實例對象
const useStore = () => useContext(context)
export { useStore }

組件使用模塊中的數(shù)據(jù)

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>
  )
}
// 包裹組件讓視圖響應(yīng)數(shù)據(jù)變化
export default observer(App)

Mobx - 總結(jié)

1.初始化Mobx的過程是怎樣的?

聲明數(shù)據(jù) -> 響應(yīng)式處理 -> 定義action函數(shù) -> 實例化導(dǎo)出

2.Mobx如何配合react,需要依賴什么包?

mobx-react-lite作為連接包,導(dǎo)出observer方法,包裹組件

3.模塊化解決了什么問題?

維護性問題

4.如何實現(xiàn)Mobx的模塊化?

按照功能拆分store模塊,根模塊中組合子模塊,利用context機制依賴注入

到此這篇關(guān)于React+Mobx基本使用、模塊化的文章就介紹到這了,更多相關(guān)React Mobx使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 官方推薦react-navigation的具體使用詳解

    官方推薦react-navigation的具體使用詳解

    本篇文章主要介紹了官方推薦react-navigation的具體使用詳解,react-navigation是致力于解決導(dǎo)航卡頓,數(shù)據(jù)傳遞,Tabbar和navigator布局,支持redux。非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • sass在react中的基本使用(實例詳解)

    sass在react中的基本使用(實例詳解)

    這篇文章主要介紹了sass在react中的基本使用,主要包括安裝sass和編寫APP.tsx中的基本dom,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 詳解react內(nèi)聯(lián)樣式使用webpack將px轉(zhuǎn)rem

    詳解react內(nèi)聯(lián)樣式使用webpack將px轉(zhuǎn)rem

    這篇文章主要介紹了詳解react內(nèi)聯(lián)樣式使用webpack將px轉(zhuǎn)rem,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • ReactNative 之FlatList使用及踩坑封裝總結(jié)

    ReactNative 之FlatList使用及踩坑封裝總結(jié)

    本篇文章主要介紹了ReactNative 之FlatList使用及踩坑封裝總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 如何用webpack4.0擼單頁/多頁腳手架 (jquery, react, vue, typescript)

    如何用webpack4.0擼單頁/多頁腳手架 (jquery, react, vue, typescript)

    這篇文章主要介紹了如何用webpack4.0擼單頁/多頁腳手架 (jquery, react, vue, typescript),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南

    JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南

    這篇文章主要介紹了JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南,React Web的目的即是把本地的React Native應(yīng)用程序項目變?yōu)閃eb應(yīng)用程序,需要的朋友可以參考下
    2016-05-05
  • D3.js(v3)+react 實現(xiàn)帶坐標與比例尺的散點圖 (V3版本)

    D3.js(v3)+react 實現(xiàn)帶坐標與比例尺的散點圖 (V3版本)

    散點圖(Scatter Chart),通常是一橫一豎兩個坐標軸,數(shù)據(jù)是一組二維坐標,分別對應(yīng)兩個坐標軸,與坐標軸對應(yīng)的地方打上點。由此可以猜到,需要的元素包括circle(圓)和axis(坐標軸),接下來通過本文大家分享D3.js(v3)+react 實現(xiàn)帶坐標與比例尺的散點圖 (V3版本) ,一起看看
    2019-05-05
  • 如何使用Redux Toolkit簡化Redux

    如何使用Redux Toolkit簡化Redux

    redux-toolkit是目前redux官方推薦的編寫redux邏輯的方法,針對redux的創(chuàng)建store繁瑣、樣板代碼太多、依賴外部庫等問題進行了優(yōu)化,官方總結(jié)了四個特點是簡易的/有想法的/強勁的/高效的,總結(jié)來看,就是更加的方便簡單了
    2022-12-12
  • React 組件通信的多種方式與最佳實踐

    React 組件通信的多種方式與最佳實踐

    在現(xiàn)代前端開發(fā)中,組件化是 React 的核心理念之一,組件之間的通信是構(gòu)建復(fù)雜應(yīng)用的重要組成部分,在這篇文章中,我們將深入探討 React 組件通信的多種方式,包括它們的優(yōu)缺點、使用場景以及最佳實踐,需要的朋友可以參考下
    2024-11-11
  • react-router-dom5如何升級到6

    react-router-dom5如何升級到6

    這篇文章主要介紹了react-router-dom5如何升級到6問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

江源县| 郴州市| 汕尾市| 颍上县| 焦作市| 眉山市| 衡山县| 万源市| 永川市| 屯昌县| 定结县| 德庆县| 紫金县| 象山县| 固镇县| 长汀县| 黄浦区| 赤峰市| 金沙县| 睢宁县| 庆城县| 洱源县| 利津县| 新巴尔虎右旗| 达孜县| 禹城市| 岳普湖县| 桑日县| 绩溪县| 合作市| 大英县| 永兴县| 星子县| 五常市| 涪陵区| 阳信县| 普安县| 奇台县| 呼玛县| 古丈县| 康定县|