1. 程式人生 > >一個基於原生微信小程式的全域性狀態管理庫——wxMiniStore

一個基於原生微信小程式的全域性狀態管理庫——wxMiniStore

wxMiniStore

一個基於原生小程式的mini全域性狀態管理庫,五行程式碼即可引入。git地址戳我

  • 全域性狀態state支援所有Page和Component,狀態完全同步,並提供api更新狀態。
  • 週期監聽pageLisener能監聽所有頁面的onLoad,onShow等週期事件。
  • 全域性事件methods,全域性可用的方法。
  • 適合原生小程式,可以隨時引入,不影響原有的業務,拓展性強。

導航

開始

1. 引入

將本專案中util下的store.js複製到你的專案中,並引入:

const Store = require('util/store.js'
);

2. 例項化一個全域性狀態 state

Store 允許傳一個引數,型別為Object,全域性狀態寫入物件state中,讀取請使用store.$state。

let store = new Store({
  state: {
    msg: '這是一個全域性狀態'
  }
})
console.log(store.$state.msg); //這是一個全域性狀態

3.在App中注入store

這麼做是為了在其他頁面中使用store。

App({
  onLaunch: function () {

  },
  store: store
})

4.頁面上使用

在所有wxml中,可使用s

tate.xstate.x。 其中state為全域性狀態的容器,裡面包含了所有的全域性狀態。

  <view>{{$state.user.name}}:{{$state.msg}}</view>

顯示為 李四:這是一個全域性狀態。

如果在template檔案中使用,需在屬性data中引用$state

  <!-- 這是一個template -->
  <template name="t1">
    <view>{{$state.msg}}</view>
  </template>

<!-- 這是引用位置 -->
<template is="t1" data="{{$state,arg1,arg2}}" /> <!-- 相當於<template is="t1" data="{{$state:$state,arg1:arg1,arg2:arg2}}" /> -->

5.如何修改狀態

js中使用app中的store來進行操作狀態。具體參見下面api說明。

const app = getApp()
Page({
  data: {

  },
  onLoad: function () {
    //所有wxml中的$state.msg會同步更新
    app.store.setState({
       msg: "我被修改了,嗚嗚..."
    });
  }
});

週期監聽 pageLisener

在有的場景,我希望每個頁面在onLoad時執行一個方法(如統計頁面,監聽等)。原本做法是一個一個的複製貼上,很麻煩。
現在我們可以把某個週期,寫入pageLisener中,Store會自動在相應週期優先執行pageLisnner然後再執行原頁面週期內事件

1.加入監聽

現在以監聽onLoad為例, 在Store中新增一個pageLisener物件,將需要監聽的週期寫入:

// store中
let store = new Store({
    //狀態
    state: {
		//...
    },
    //方法
    methods: {
		//...
    },
    //頁面監聽
    pageLisener: {
        onLoad(options){
            console.log('我在' + this.route, '引數為', options);
        }
    }
})

就這樣所有頁面的onLoad,將會優先執行此監聽。接下來看頁面內程式碼:

// index/index.js 頁面
Page({
    onLoad(){
        console.log(2)
    }
})

執行結果為:

// 我在index/index 引數為 {...} 
// 2

2.沒有第二步…

總結:

  • 先執行pageLisener監聽,後執行原本頁面中週期。
  • 還支援其他週期事件 [‘onLoad’, ‘onShow’, ‘onReady’, ‘onHide’, ‘onUnload’, ‘onPullDownRefresh’, ‘onReachBottom’, ‘onShareAppMessage’, ‘onPageScroll’, ‘onTabItemTap’]

全域性方法 methods

新增methods,全域性可使用。
適用於各個wxml中的互動事件(bindtap等), 你可以封裝一些常用的互動事件,如 行為埋點,型別跳轉等。

1.建立一個全域性方法

在原有狀態基礎上,新增一個methods物件,寫入你的全域性方法:

let store = new Store({
  //狀態
  state: {
      msg: '這是一個全域性狀態'
  },
  //方法
  methods: {
      goAnyWhere(e){
          wx.navigateTo({
              url: e.currentTarget.dataset.url
          })
      },
      sayHello(){
          console.log('hello')
      }
  }
})

這裡建立了一個全域性封裝的跳轉 goAnyWhere。

2.使用全域性方法

在wxml中,直接使用方法名呼叫:

<view bindtap="goAnyWhere" data-url="/index/index">
  首頁
</view>

在js中,直接使用 this.方法名 來呼叫:

Page({
  onLoad(){
      this.sayHello();
  }
})

在非頁面的js中,我們不建議使用Store中的全域性方法。但你可使用getCurrentPage().pop().sayHello() 來呼叫。

3.說明

  • 儘量封裝複用率高的全域性方法
  • 非互動型事件(即非bindxx)的公用方法,建議不寫入Store中。寫入App中更好。

api

這裡列舉了所有涉及到Store的屬性與方法。

new Store(options: Object) *已更新

該函式使用new關鍵字返回一個Store型別的例項。
引數options,為配置引數,
options.state 為初始全域性狀態。
options.methods 為全域性方法。

Store.prototype.setState(Object data, Function callback)

用於修改全域性狀態,用法與微信小程式的 Page.prototype.setData完全一致。在頁面中呼叫setState的資料為同步,渲染為非同步。在頁面未載入完成時,呼叫setState的資料為非同步(頁面週期attached時完成),渲染為非同步。
提示:頁面中應避免使用this.setData({$state: …})去操作當前頁面下的$state。如有相關需求,請使用頁面其他狀態儲存。

store.$state : Object

該物件為例項.$state, 返回的是全域性狀態(部分引用)。應避免直接操作修改它。

store.$r : Object

該物件為所有頁面或元件的例項。

總結及建議

考慮到後期的app.js內store不直觀,可以把整套store單獨寫入一個js中,通過require引入。如:

// mystore.js中
const Store = require('../util/store.js');
module.exports = new Store({
  state: {},
  methods: {}
})
//---------------------------
// app.js中
let store = require('store/mystore.js')
App({
  store
})

適用於全域性的狀態大範圍同步變動,如使用者資訊,臨時的購物車資訊,等等應用場景。原理實現上,原始碼很清晰,後期慢慢優化,歡迎指正。

給個star再走好伐… 戳我~

相關推薦

一個基於原生程式全域性狀態管理——wxMiniStore

wxMiniStore 一個基於原生小程式的mini全域性狀態管理庫,五行程式碼即可引入。git地址戳我 全域性狀態state支援所有Page和Component,狀態完全同步,並提供api更新狀態。 週期監聽pageLisener能監聽所有頁面的onLoad

程式全域性狀態管理,並提供Vuex的開發體驗

1. 概要 微信小程式的開發體驗類似vue和react,但是卻沒有提供全域性狀態管理的機制,所以狀態的共享只能通過屬性傳遞的方式來實現。這種做法在小規模的應用中尚可以滿足開發效率,但是在複雜的應用中元件的巢狀層次很深,屬性傳遞的路徑過長。 於是我就想利用小程式Page中的data

程式全域性狀態管理 wxscv

微信小程式中,資料狀態不同頁面中不能跨頁面同步更新,也就是缺失類似vuex,mobx,redux全域性的資料狀態管理功能。 有些人移植了這些庫,但是畢竟不是微信小程式生態的東西。 Tencent也釋出了類似的庫,叫做 westore,基於小程式開發,非常小巧好用,非常推薦。 但是由於重寫了Page方法,而現在

基於mpvue程式 promise+wx.request 封裝請求

第一步: 在微信小程式中引入es6-promise 如果是基於mpvue框架進行微信小程式開發,只需要 npm install es6-promise 第二步: 在專案中建立一個utils資料夾,主要用來裝一些用到的工具 然後再utils下面建立一個requet.js

使用mpvue開發微程式——原生程式、mpvue、wepy對比

mpvue是什麼?為什麼使用它? 目前小程式開發主要有三種形式:原生、wepy、mpvue,其中wepy是騰訊的開源專案;mpvue是美團開源的一個開發小程式的框架,全稱mini program vue(基於vue.js的小程式),vue開發者使用了這個框架後,開發小程式的效率將得到

基於base64程式生成二維碼外掛-weapp-qrcode.js

weapp-qrcode PS: 主要在node-yaqrcode專案基礎上進行改造適應微信小程式 說明 只需要在 wxml 檔案中增加個image標籤動態引用base64編碼即可 <image src="{{qrcodeURL}"> </image> JS呼叫例子: c

基於mpvue程式 es6-promise.js封裝請求

在微信小程式中,實現前後臺互動用到的介面是wx.request() 在開發的過程中,每個涉及到互動的檔案都要使用wx.request()顯得很繁瑣,而且統一處理起來不方便,比如要改請求頭的話就需要每個檔案去改 所以我就嘗試對wx.request()進行封裝,統一管理起來

程式全域性配置檔案app.json中window:backgroundColor“不生效”

標題中"不生效"帶著引號你就知道大概不是真的不生效了,而是沒搞明白這個屬性到底代表的是哪一部分的背景色。從小程式官方文件中看到圖1畫框處這樣的說明:圖1.以為指的是小程式中所有頁面的背景色,於是滿心歡喜的設定了這個屬性值,結果出現圖2的樣子:圖2以為是頁面的page.json

程式 全域性變數

做了幾天頗有心得 微信小程式裡面有個app.js,我們可以在這個裡面設定全域性變數,像醬 App({ data:{ servsers:"http://192.168.0.2

開發之兩天快速開發一個自己的程式

一.寫在前面 1.為什麼要學小程式開發?     對於前端開發而言,微信小程式因為其簡單快速、開發成本低、使用者流量巨大等特點,也就成了前端開發工程師必會的一個技能。 2.先看看小程式效果 (1)歡迎頁 (2)首頁:輪播頭圖,天氣,豆瓣電影正在熱映

如何在原生程式中實現資料雙向繫結歡迎使用CSDN-markdown編輯器

在原生小程式開發中,資料流是單向的,無法雙向繫結,但是要實現雙向繫結的功能還是蠻簡單的! 下文要講的是小程式框架 minapp 中實現雙向繫結的原理,在 minapp 中,你只需要在 wxml 模板中給元件的屬性名後加上 .sync 就可以實現雙向繫

程式用什麼開發?快速開發一個自己的程式教程

一.寫在前面  1.為什麼要學小程式開發?  對於前端開發而言,微信小程式因為其簡單快速、開發成本低、使用者流量巨大等特點,也就成了前端開發工程師必會的一個技能。  2.開發準備:  (1)有人開玩笑說,會vue小程式根本都不用學:  微信小程式雖然是騰訊自己搞的,但是核心的

程式全域性視窗屬性設定和單個視窗屬性設定

如果要實現全域性視窗設定則要在app.json中設定window對應的屬性程式碼如下{ "pages":[ "pages/index/index", "pages/logs/logs", "pages/mediaImage/index",

程式全域性變數改變監聽

問題來源 最近工作需要寫小程式頁面,其中有個頁面情況為:父頁面中包含了一個元件頁面,元件頁面中又包含了另外一個元件頁面。需求為:點選最後一個元件頁面中的一個view,需要顯示最外層父頁面中的一個彈出層,並且動態的展示值,這個值的來源就是最後一個元件頁面中的內容。 處理辦法 當時想到的就是使用全域性變數,

從0開始,手把手教你開發並部署上線一個知識測驗程式

## 上線專案演示 微信搜尋[放馬來答]或掃以下二維碼體驗: ![](https://gitee.com/kamiba/images4mk2/raw/master/20200709074129.png) ## 專案原始碼 [ 專案原始碼](https://gitee.com/kamiba/wecha

程式 使用 TGit管理程式碼

1、在微信公眾號平臺,"開發者工具" 中開通 TGit許可權(若沒開通 ,根據提示步驟先開通騰訊雲,再開通 TGit); 2、windows版本,安裝git;https://git-scm.com/download/win(下載git安裝程式); 3、安裝完成,開啟 Git Bash; 

程式不同狀態下的分頁載入

之前做小程式的時候有一個需求是訂單列表有幾個不同訂單狀態的選項卡,要求之間點不同的訂單狀態頁面不重新整理,而且也要做分頁,所以比較棘手的問題就是每次分頁的資料不會錯亂,要準確的插入到指定的狀態之中去。我的思路是這樣的,page,offset,total,dataend全部設定

程式登入狀態java後臺解密

一、登入流程圖 二、微信小程式端 doLogin:function(callback = () =>{}){ let that = this; wx.login({ success:function(loginRes){ if(l

讓Wordpress成為你程式的文章管理利器

Wordpress,相信很多很多人都用過,是一款大名鼎鼎的內容管理系統(CMS),因其社群的強大,外掛的豐富,用它來建網站和部落格真的是非常方便好用。它擁有功能強大的管理後臺,使得對目錄、文章以及標籤的建立和管理,都變得輕鬆簡單。 我們在設計和開發我們的微信小程式的時候,可

基於Ubuntu搭建程式服務

準備域名和證書 小程式後臺服務需要通過 HTTPS 訪問,在實驗開始之前,我們要準備域名和 SSL 證書。 域名註冊 如果您還沒有域名,可以在騰訊雲或者阿里雲上選購。 域名解析 域名購買完成後, 需要將域名解析到實驗雲主機上,實驗雲主機的 IP 為: <您的 CVM