国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

基于Mobx的多頁面小程序的全局共享狀態(tài)管理實(shí)踐

SexySix / 1661人閱讀

摘要:所以雖然是是用在小程序上,不過我想對于的狀態(tài)管理,也有這么一丟丟啟發(fā)。在目錄下放入和這兩個(gè)庫,同時(shí)在目錄下新建用于存放全局狀態(tài)。建立由于小程序中不支持裝飾器,所以采用了的寫法。另外,小程序中不支持路徑的省略。

what

名字很長很繞靠口,總的來說,本文是對開發(fā)小程序過程中使用mobx的一個(gè)總結(jié)。

狀態(tài)管理,相比大家也很熟悉,顧名思義,是對前端頁面繁復(fù)的狀態(tài)進(jìn)行管理,在此,我也不過多贅述。

所以雖然是是用在小程序上,不過我想對于WebApp的狀態(tài)管理,也有這么一丟丟啟發(fā)。

why

為什么要進(jìn)行狀態(tài)管理?
現(xiàn)在的小程序儼然是Hybrid App,又像是PWA,但當(dāng)然也是一個(gè)WebApp,更不用說他的語法和vue略微有這么一丟丟相似。有reactvue的實(shí)踐在前,所以對于小程序上那么多的頁面狀態(tài)和數(shù)據(jù)緩存,勢必也要引入一個(gè)狀態(tài)管理工具

為什么是mobx
方便,快捷,學(xué)習(xí)成本低,當(dāng)然也是仁者見仁智者見智

how

在小程序中引入mobx
在這里我使用了wechat-weapp-mobx這個(gè)庫。在./libs目錄下放入mobx.jsobserver.js這兩個(gè)庫,同時(shí)在./store目錄下新建store.js用于存放全局狀態(tài)。

建立store
由于小程序中不支持@decorate裝飾器,所以采用了extendObservable的寫法。另外,小程序支持import語法和require語法。我比較喜歡import語法,你們呢?我認(rèn)為在action中不該寫入復(fù)雜邏輯代碼,保持簡潔性和可復(fù)用性,你們怎么看

// store.js
// 引入必須的庫
const mobx = require("../libs/mobx");
const extendObservable = require("../libs/mobx").extendObservable;
const computed = require("../libs/mobx").computed;
const toJS = require("../libs/mobx").toJS;

let store = function () {
  extendObservable(this, {

    // observable data
    players: [],

    // computed data
    get count() {
      return this.players.length;
    }
  });

  // action
  this.addPlayer = name => {
    let len = this.count;    //此處調(diào)用computed data
    let id = len === 0 ? 1 : this.players[len - 1].id + 1;
    this.players.push(new player(name, id));
  }
}

export default store;

全局引入store
眾所周知,使用mobxstore要使用new store(),如果我們想全局調(diào)用,勢必不可能在每個(gè)頁面都new一個(gè)sotre,因?yàn)檫@樣的話每個(gè)頁面的store都是一個(gè)全新的store。在這里,我在app.js里引入store,并掛載在全局變量globalData下。另外,小程序中不支持路徑的省略。

//app.js
const observer = require("./libs/observer").observer;
import store from "./stores/index";  // 小程序中不支持省略調(diào)用

App(observer({
  onLaunch: function () {
  },
  globalData: {
    store: new store()
  }
}))

在pages里調(diào)用全局的store
可以同時(shí)使用內(nèi)置的data進(jìn)行雙向綁定哦

// index.js
const observer = require("../../libs/observer").observer;

let app = getApp();
Page(observer({
  data: {
    mes: "hello jim green"
  },
  props: {
    store: app.globalData.store
  },
}))

在頁面中調(diào)用store


      // 調(diào)用observable data
    {{item.id}}:{{item.name}}
  
  {{props.sotre.count}}    //  調(diào)用computed data

更新多個(gè)頁面的store
問題來了,這個(gè)時(shí)候,多個(gè)頁面的store還是獨(dú)立的,如何全部更新呢?答案就是在onShowonHide或者onUnload這三個(gè)生命周期函數(shù)中跟新全局的store

onShow: function() {    // 顯示時(shí)更新本頁面store
  this.props.store = app.globalData.store
},
onHide: function() {   // 隱藏時(shí)更新全局store
  app.globalData.store = this.props.store;
},
onUnload: function() {    // 頁面跳轉(zhuǎn)返回時(shí)更新全局store
  app.globalData.store = this.props.store;
},

store和localStorage的長效存儲(chǔ)
考慮到網(wǎng)絡(luò)還有程序崩潰的問題,我將store存儲(chǔ)在localStorage中以便恢復(fù),我在index.jsonLoad中調(diào)用get storage,在onHideset storage。由于toJS方法返回了一個(gè)不支持[Symbol.iterator]()的對象,所以在store里進(jìn)行了如下設(shè)置

// index.js
onLoad: function () {
  let store = wx.getStorageSync("store");
  if(store) {
    this.props.store.formStorageToStore(store);
  }
},
onHide: function () {
  
  let store =this.props.store.currentStore;
  wx.setStorageSync("store", store)
},

// store.js
  get currentStore() {
    let {players,games,currentGame,hidden,filter} = toJS(this);
    return {players,games,currentGame,hidden,filter};
  }
  this.formStorageToStore = ({players,games,currentGame,hidden,filter}) => {
    this.players = players;
    this.games = games;
    this.currentGame = currentGame;
    this.hidden = hidden;
    this.filter = filter;
  }

others

講點(diǎn)其他

本項(xiàng)目的示例小程序地址weapp-bmscore,歡迎各位老鐵點(diǎn)個(gè)關(guān)注666

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84366.html

相關(guān)文章

  • React組件設(shè)計(jì)實(shí)踐總結(jié)05 - 狀態(tài)管理

    摘要:要求通過要求數(shù)據(jù)變更函數(shù)使用裝飾或放在函數(shù)中,目的就是讓狀態(tài)的變更根據(jù)可預(yù)測性單向數(shù)據(jù)流。同一份數(shù)據(jù)需要響應(yīng)到多個(gè)視圖,且被多個(gè)視圖進(jìn)行變更需要維護(hù)全局狀態(tài),并在他們變動(dòng)時(shí)響應(yīng)到視圖數(shù)據(jù)流變得復(fù)雜,組件本身已經(jīng)無法駕馭。今天是 520,這是本系列最后一篇文章,主要涵蓋 React 狀態(tài)管理的相關(guān)方案。 前幾篇文章在掘金首發(fā)基本石沉大海, 沒什么閱讀量. 可能是文章篇幅太長了?掘金值太低了? ...

    ideaa 評論0 收藏0
  • MobX 開啟 Time-Travelling 引擎

    摘要:將收集到的實(shí)例及各類做標(biāo)識(shí)并做好關(guān)系映射。但這并不意味著在序列化不友好的體系里不能實(shí)現(xiàn)從中喚醒應(yīng)用。最后作為一個(gè)多范式的信徒,在一出現(xiàn)便取代了我心中在前端狀態(tài)管理領(lǐng)域的地位。 原文鏈接 注意:本文并非 mobx-state-tree 使用指南,事實(shí)上全篇都與 MST(mobx-state-tree) 無關(guān)。 showImg(https://segmentfault.com/img/bV...

    琛h。 評論0 收藏0
  • 【譯】Redux 還是 Mobx,讓我來解決你困惑!

    摘要:我現(xiàn)在寫的這些是為了解決和這兩個(gè)狀態(tài)管理庫之間的困惑。這甚至是危險(xiǎn)的,因?yàn)檫@部分人將無法體驗(yàn)和這些庫所要解決的問題。這肯定是要第一時(shí)間解決的問題。函數(shù)式編程是不斷上升的范式,但對于大部分開發(fā)者來說是新奇的。規(guī)模持續(xù)增長的應(yīng) 原文地址:Redux or MobX: An attempt to dissolve the Confusion 原文作者:rwieruch 我在去年大量的使用...

    txgcwm 評論0 收藏0
  • 利用Dawn工程化工具實(shí)踐MobX數(shù)據(jù)流管理方案

    摘要:新的項(xiàng)目目錄設(shè)計(jì)如下放置靜態(tài)文件業(yè)務(wù)組件入口文件數(shù)據(jù)模型定義數(shù)據(jù)定義工具函數(shù)其中數(shù)據(jù)流實(shí)踐的核心概念就是數(shù)據(jù)模型和數(shù)據(jù)儲(chǔ)存。最后再吃我一發(fā)安利是阿里云業(yè)務(wù)運(yùn)營事業(yè)部前端團(tuán)隊(duì)開源的前端構(gòu)建和工程化工具。 本文首發(fā)于阿里云前端dawn團(tuán)隊(duì)專欄。 項(xiàng)目在最初應(yīng)用 MobX 時(shí),對較為復(fù)雜的多人協(xié)作項(xiàng)目的數(shù)據(jù)流管理方案沒有一個(gè)優(yōu)雅的解決方案,通過對MobX官方文檔中針對大型可維護(hù)項(xiàng)目最佳實(shí)踐的...

    0x584a 評論0 收藏0
  • Redux 問題:React、MobX 和 Realm 能解決嗎?

    摘要:它是由一個(gè)非常聰明的人開發(fā)的,用來緩解在單頁面應(yīng)用中管理狀態(tài)的問題。的問題沒有一種適合所有場景的完美工具。為設(shè)計(jì)的是世界的另一個(gè)新增內(nèi)容,但目前僅適用于。這將導(dǎo)致最后期限延長,并且留下更多需要我們維護(hù)的代碼。 原文:The Problems with Redux: Can React, MobX, and Realm save us? 作者:Erich Reich 首先,我不討厭 ...

    snifes 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<