摘要:概要微信小程序的開發(fā)體驗(yàn)類似和,但是卻沒有提供全局狀態(tài)管理的機(jī)制,所以狀態(tài)的共享只能通過屬性傳遞的方式來實(shí)現(xiàn)。安裝將放入微信小程序項(xiàng)目的文件夾中,例如。
1. 概要
微信小程序的開發(fā)體驗(yàn)類似vue和react,但是卻沒有提供全局狀態(tài)管理的機(jī)制,所以狀態(tài)的共享只能通過屬性傳遞的方式來實(shí)現(xiàn)。這種做法在小規(guī)模的應(yīng)用中尚可以滿足開發(fā)效率,但是在復(fù)雜的應(yīng)用中組件的嵌套層次很深,屬性傳遞的路徑過長。
于是我就想利用小程序Page中的data對象來構(gòu)建一個全局store,這個store滿足一下幾點(diǎn)需求:
store可以被當(dāng)前頁面中任意一個組件訪問,并且這種訪問時(shí)直接的而不是通過屬性傳遞。
全局store對于組件是相應(yīng)式的,也就是說store的變化可以使組件發(fā)生重繪。
頁面和組件都可以修改store的狀態(tài),并且這種修改不破壞原來的響應(yīng)式。
提供類似Vuex的開發(fā)體驗(yàn),減小學(xué)習(xí)成本。
先附上源碼 github地址
2. 使用我們先跳過原理來看使用方法。
2.1 安裝將Store.js放入微信小程序項(xiàng)目的文件夾中,例如/lib/Store.js。
2.2 創(chuàng)建Page對象這里我們通過wxappStore.createPage來創(chuàng)建。對比一下Store.js和原來的創(chuàng)建方法的區(qū)別
// 原來的創(chuàng)建方法 Page({ data: { message: "" }, onLoad: function () { this.setData({ message: "hello world" }) } })
// 增加全局狀態(tài)管理之后 import wxappStore from "../../lib/Store.js"; Page(wxappStore.createPage({ // 第一個參數(shù)和原來傳入Page方法的option沒有區(qū)別。其中的data會作為全局共享對象來使用。 data: { message: "" }, onLoad: function () { // 通過dispatch方法,進(jìn)行一個異步操作。 this.store.dispatch({ name: "testAction", payload: "hello world" }); // 通過commit方法,修改全局狀態(tài)。 this.store.commit({ name: "testMutation", payload: "hello world" }); } }, // 第二個參數(shù)是一個對象,其中包含mutations和actions { mutations: { testMutation: function({ setData, payload, data }) { setData({ message: payload }); } }, actions: { testAction: function ({ commit, payload, data }) { setTimeout(() => { commit({ name: "testMutation", payload: payload }); }); } } }))
wxappStore.createPage方法有兩個參數(shù)。
第一個參數(shù)和原來傳入Page方法的option沒有區(qū)別。其中的data會作為全局共享對象來使用。
第二個參數(shù)是一個對象,其中包含mutations和actions
2.3 使用mutationmutation和Vuex中的mutation類似,它通過同步的方式修改狀態(tài)。可以通過commit調(diào)用。
2.3.1 定義mutationmutations在wxappStore.createPage的第二個參數(shù)中定義,它用于修改全局狀態(tài)。mutation通常同步的。mutation方法的參數(shù)是一個對象,包含三個屬性:
setData function: 用來修改全局狀態(tài),在微信小程序中直接修改狀態(tài)不會觸發(fā)頁面重匯。
payload object:修改的狀態(tài),可以是一個對象,也可以是String等基礎(chǔ)數(shù)據(jù)類型
data object:當(dāng)前狀態(tài)
mutations: { testMutation: function({ setData, payload, data }) { setData({ message: payload }); } },2.3.2 調(diào)用mutation
通過commit方法調(diào)用mutation,它的參數(shù)是一個對象,包含兩個屬性:
name String:mutation的名稱
payload Object:需要修改的狀態(tài),和Vuex的payload類似。
this.store.commit({ name: "testMutation", payload: "hello world" });2.4 使用action
action和Vuex中action概念類似,通常包含異步操作,在異步操作完成后進(jìn)行commit操作。
2.4.1 定義actionaction方法的參數(shù)是一個參數(shù),包含3個屬性:
commit function:執(zhí)行commit操作
payload Object:數(shù)據(jù)對象,和Vuex類型
data Object:當(dāng)前狀態(tài)
actions: { testAction: function ({ commit, payload, data }) { setTimeout(() => { commit({ name: "testMutation", payload: payload }); }); } }2.4.2 調(diào)用action
通過dispatch方法調(diào)用action,它的參數(shù)是一個對象,包含兩個屬性:
name String:action的名稱
payload Object:需要修改的狀態(tài),和Vuex的payload類似。
this.store.dispatch({ name: "testAction", payload: "hello world" });2.5 創(chuàng)建Component
在Component中我們需要完成兩項(xiàng)工作
第一將全局狀態(tài)綁定到當(dāng)前組件的data屬性上,并將組件的data屬性綁定到頁面元素上。
第二組件需要使用commit或者dispatch完成全局狀態(tài)的修改。
這里Store.j通過wxappStore.createComp來創(chuàng)建Component,它會通過代理的方式為Component實(shí)現(xiàn)全局狀態(tài)管理的功能。
import wxappStore from "../lib/Store.js"; Component(wxappStore.createComp({ data: { localtimeData: "" }, ready: function () { // 綁定全局狀態(tài) this.getGlobalData({ globalDataKey: "localtime", localDataKey: "localtimeData" }); // 改變?nèi)譅顟B(tài) this.store.commit({ name: "testMutation", payload: (new Date()).toLocaleTimeString() }) } }))
2.5.1 全局狀態(tài)綁定讀取全局狀態(tài):{{localtimeData}}
全局狀態(tài)綁定通過getGlobalData這個實(shí)例方法實(shí)現(xiàn),這個方法并不在小程序的運(yùn)行環(huán)境中,它是Store.js執(zhí)行的過程中插入到Component實(shí)例中的。
getGlobalData 不能再created回調(diào)中調(diào)用,應(yīng)為component的實(shí)例方法setData不能再created中調(diào)用。
getGlobalData的參數(shù)是一個對象,包含兩個屬性:
globalDataKey String:這個屬性表示需要全局狀態(tài)的屬性名,這個全局狀態(tài)將于component的本地狀態(tài)綁定。
localDataKey String:這個屬性表示本地狀態(tài)的屬性名,這個本地狀態(tài)將于全局狀態(tài)綁定。
// 綁定全局狀態(tài) this.getGlobalData({ globalDataKey: "localtime", localDataKey: "localtimeData" });2.5.2 改變?nèi)譅顟B(tài)
可以使用store.commit或者store.dispatch,store并不是小程序的運(yùn)行環(huán)境中內(nèi)置的,同樣是通過Store.js插入到每一個component實(shí)例中。它的使用方法和Page中的類似。
3. 這套框架的不足Store.js借用了Page對象的data屬性來完成全局狀態(tài)管理,所以data屬性的職責(zé)并不單一。data屬性兼具了頁面ViewModel的功能和全局狀態(tài)的功能。但是Page中的data屬性本來也具有全局意義,所以兩者的沖突并不大。
component中的data屬性職責(zé)并不單一。它兼具了本地屬性的功能和綁定全局狀態(tài)的功能。而且直接通過setData修改component中的data并不能觸發(fā)全局狀態(tài)的改變,因?yàn)閐ata的作用域僅限于當(dāng)前component,必須通過store.commit或者store.dispatch觸發(fā)發(fā)全局狀態(tài)的改變。
如果你發(fā)現(xiàn)其他問題,歡迎留言,我們共同進(jìn)步!
4. 寫完好累,原理等下次更新吧。。。。文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/94511.html
摘要:前言一個集微信公眾號商城小程序商城商城后臺的一個開源項(xiàng)目,后臺是基于開發(fā)的,是一個簡潔而強(qiáng)大的開源微信公眾平臺開發(fā)框架,微信功能插件化開發(fā)多公眾號管理配置簡單。微信小程序項(xiàng)目下載整個包之后,進(jìn)行根目錄文件夾。 前言 一個集微信公眾號商城/小程序商城/商城后臺的一個開源項(xiàng)目,后臺是基于WeiPHP5.0開發(fā)的,WeiPHP是一個簡潔而強(qiáng)大的開源微信公眾平臺開發(fā)框架,微信功能插件化開發(fā),多...
摘要:前言一個集微信公眾號商城小程序商城商城后臺的一個開源項(xiàng)目,后臺是基于開發(fā)的,是一個簡潔而強(qiáng)大的開源微信公眾平臺開發(fā)框架,微信功能插件化開發(fā)多公眾號管理配置簡單。微信小程序項(xiàng)目下載整個包之后,進(jìn)行根目錄文件夾。 前言 一個集微信公眾號商城/小程序商城/商城后臺的一個開源項(xiàng)目,后臺是基于WeiPHP5.0開發(fā)的,WeiPHP是一個簡潔而強(qiáng)大的開源微信公眾平臺開發(fā)框架,微信功能插件化開發(fā),多...
摘要:在這一步,實(shí)例已完成以下的配置數(shù)據(jù)觀測,屬性和方法的運(yùn)算,事件回調(diào)。可以直接寫等標(biāo)簽的寫法之前會的工程師上手框架的成本較低 簡介 1.美團(tuán)工程師推出的基于Vue.js封裝的用于開發(fā)小程序的框架2.融合了原生小程序和Vue.js的特點(diǎn)3.可完全組件化開發(fā) 特點(diǎn) 1.組件化開發(fā)2.完成的Vue.js開發(fā)體驗(yàn)(前提是熟悉Vue)3.可使用Vuex管理狀態(tài)4.Webpack構(gòu)建項(xiàng)目5.最終H5...
摘要:所以在小程序出現(xiàn)之后,一股框架之風(fēng)也很快的出現(xiàn),微信小程序剛推出之后,就出現(xiàn)了兩個比較出名的小程序開發(fā)框架,。 原文地址:https://ant-move.github.io/we... 這里說的去除小程序框架其實(shí)并不嚴(yán)謹(jǐn),因?yàn)樾〕绦虮旧硪菜闶且粋€框架,而且是一個功能更加完善的框架系統(tǒng)。在前端的概念中,我們一般說一個框架是指一個用來幫助開發(fā)者構(gòu)建用戶界面的框架,而小程序框架本身不僅僅包...
摘要:業(yè)內(nèi)開發(fā)框架層出不窮,,,等等,都在朝著更快,更強(qiáng)大的方向發(fā)展,有統(tǒng)一微信支付寶百度和頭條小程序的大趨勢。最近升級為版本,支持微信支付寶百度和頭條小程序。 原文鏈接 最近小程序的發(fā)展越來越火了,作為各個產(chǎn)品線的extra服務(wù)入口,以輕便、快速、強(qiáng)大的社交鏈吸引著大量的用戶和開發(fā)者。業(yè)內(nèi)開發(fā)框架層出不窮,wepy,mpvue,taro等等,都在朝著更快,更強(qiáng)大的方向發(fā)展,有統(tǒng)一 H5、微...
閱讀 2395·2021-11-11 16:54
閱讀 1204·2021-09-22 15:23
閱讀 3644·2021-09-07 09:59
閱讀 1990·2021-09-02 15:41
閱讀 3283·2021-08-17 10:13
閱讀 3037·2019-08-30 15:53
閱讀 1235·2019-08-30 13:57
閱讀 1210·2019-08-29 15:16