1. 程式人生 > 其它 >基於react使用mobx的使用

基於react使用mobx的使用

1.mobx是一個輕量級的狀態管理器,所以很簡單(單一全域性資料使用class)類有get 資料方法

我們需要把資料做成全域性資料,並且這個資料不能汙染全域性資料 -- 應該是一個閉包(ES6 中class是一個語法糖,本身是一個函式)

所以應該定義一個類,然後匯出一個例項(因為資料要全域性通用,所以不能匯出類,應該匯出例項 -- 單例模式)

import {action , computed,makeObservable,observable} from "mobx"

class Store{
  //在mobx6.x版本中,需要在建構函式中宣告資料型別
  constructor(){
     makeObservable(
    
//指定目標 this, //定義當前mobx類物件中的資料型別 { list:observable, add:action, minus:action, amount:computed} ) } list=Array.from(Array(8),(_,i)=>{ return {id:'ID-'+i,name:`華為手機Mate2${i}`,price:Math.ceil(Math.random() * 2000 + 3000), count: 1} }) //在類中,有一個getter方法,在使用的時候是一個數據 get amount(){
return this.list.reduce((r,it)=>{ r += it.price * it.count return r },0) } } add(key,step){ console.log('-------- add',key,step) this.list= this.list.map(it =>{ if(it.id === key) it.count += step return it }) console.log(this.list) } minus(key,step){ console.log('---------minus',key,step)
this.list=this.list,map(it =>{ if(it.id === key) it.count -=step return it }) } } export default new Store() //new是例項物件 Store類 ,Store是匯出類

輕量級狀態管理器 mobx

mobx是一個可伸縮的、輕量級(與資料複雜度有關的一個指標)的狀態管理器

在專案中有一些資料需要全域性管理(資料存在共用 -- 比如token、使用者資訊,資料存在傳遞、可快取性)

使用一個庫或則一個技術:

  首先要考慮業務 -- 陣列資料 -- 購物車陣列([{key:唯一標識,name:產品名字,price:產品單價,count:數量}]) -- 可以修改數量方法(add/munis需要傳遞每次減少數量,傳遞一個唯一標識) -- 購物車計算總價格(amount,每次資料變化都要重新計算)

  使用庫 -> 安裝:cnpm i -S mobx mobx-react (mobx的5.X和6.X,他們的使用方法和方法名字等區別很多,幾乎沒有任何共同點)

開發過程:還原一個購物車頁面,一切皆元件,最小化到一個元素(因為react是沒有做元件重新渲染優化 - - 賦值和渲染優化是有的)

    標籤元件 + 按鈕元件 => 組成一個行元件 =>組成一個列表元件 => 形成一個購物車頁面元件 => 掛載到專案元件 => index的render方法上

注入使用:在其他元件上使用

import React from 'react'
import List from './List'
import {inject,observer} from 'mobx-react'

function Cart({cart}){
   return(
  <div>
  <h1>{cart.amount}</h1>
</div>
)
} 

export default inject('cart')(observer(Cart))
//inject是純函式 裡面是資料state , observer是觀察方法 裡面是元件

 二、主要技術實現:

1.mobx下載安裝使用

2.用class類做全域性資料例項, new匯出例項物件

3.a.引入store資料例項物件, -- 它的原理還是react的Context原理,import {Provider} from 'mobx-react'

b.使用Provider來包裹元件進行跨元件傳值 <Provider><App/></Provider>

4.取mobx中的資料,使用注入(inject)手段 import {inject} from 'mobx-react'

a.inject是純函式:它會直接指定要注入到Provider提供的那個屬性就行了,需要加形參就可以使用資料 function List(){return()}

const NewList = inject('cart')(List)   --->資料  - -> 元件名 ===>用時給元件直接加資料形參就直接使用 下發資料

export default NewList    

b.下發資料時使用繫結語法來展開資料

5.mobx 6.x版本

a.建構函式宣告資料型別

constructor(){

  makeObservable(

 //指向

this,

{    //定義當前mobx類物件中資料型別

  list:observable,

  add:action,

  minus:action,

  amount:computed

})

}

b.給頁面元件新增監聽屬性 是給資料新增屬性 import {cart,observer} from 'react-mobx'

let ObersverComponent = observer(List)

export default inject('cart')(observerCompent)

是用來觀察cart中的可被觀察的資料物件是否被髮生變化,如果發生變化,那麼執行頁面重新執行渲染資料

mobx 特點:全域性資料修改方法監聽,有動作傳參有修改,注入資料使用inject注入給元件使用資料,當前頁面渲染初始化資料形參使用,

監聽修改用屬性observer(cart)