成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

微信小程序全局狀態(tài)管理,并提供Vuex的開(kāi)發(fā)體驗(yàn)

fuyi501 / 2323人閱讀

摘要:概要微信小程序的開(kāi)發(fā)體驗(yàn)類(lèi)似和,但是卻沒(méi)有提供全局狀態(tài)管理的機(jī)制,所以狀態(tài)的共享只能通過(guò)屬性傳遞的方式來(lái)實(shí)現(xiàn)。安裝將放入微信小程序項(xiàng)目的文件夾中,例如。

1. 概要

微信小程序的開(kāi)發(fā)體驗(yàn)類(lèi)似vue和react,但是卻沒(méi)有提供全局狀態(tài)管理的機(jī)制,所以狀態(tài)的共享只能通過(guò)屬性傳遞的方式來(lái)實(shí)現(xiàn)。這種做法在小規(guī)模的應(yīng)用中尚可以滿(mǎn)足開(kāi)發(fā)效率,但是在復(fù)雜的應(yīng)用中組件的嵌套層次很深,屬性傳遞的路徑過(guò)長(zhǎng)。

于是我就想利用小程序Page中的data對(duì)象來(lái)構(gòu)建一個(gè)全局store,這個(gè)store滿(mǎn)足一下幾點(diǎn)需求:

store可以被當(dāng)前頁(yè)面中任意一個(gè)組件訪問(wèn),并且這種訪問(wèn)時(shí)直接的而不是通過(guò)屬性傳遞。

全局store對(duì)于組件是相應(yīng)式的,也就是說(shuō)store的變化可以使組件發(fā)生重繪。

頁(yè)面和組件都可以修改store的狀態(tài),并且這種修改不破壞原來(lái)的響應(yīng)式。

提供類(lèi)似Vuex的開(kāi)發(fā)體驗(yàn),減小學(xué)習(xí)成本。

先附上源碼 github地址

2. 使用

我們先跳過(guò)原理來(lái)看使用方法。

2.1 安裝

將Store.js放入微信小程序項(xiàng)目的文件夾中,例如/lib/Store.js。

2.2 創(chuàng)建Page對(duì)象

這里我們通過(guò)wxappStore.createPage來(lái)創(chuàng)建。對(duì)比一下Store.js和原來(lái)的創(chuàng)建方法的區(qū)別

// 原來(lái)的創(chuàng)建方法
Page({
  data: {
    message: ""
  },
  onLoad: function () {
    this.setData({
        message: "hello world"
    })
  }
})
// 增加全局狀態(tài)管理之后
import wxappStore from "../../lib/Store.js";

Page(wxappStore.createPage({
    // 第一個(gè)參數(shù)和原來(lái)傳入Page方法的option沒(méi)有區(qū)別。其中的data會(huì)作為全局共享對(duì)象來(lái)使用。
    data: {
        message: ""
    },
    onLoad: function () {
        // 通過(guò)dispatch方法,進(jìn)行一個(gè)異步操作。  
        this.store.dispatch({ 
            name: "testAction",
            payload: "hello world"
        });
        // 通過(guò)commit方法,修改全局狀態(tài)。
        this.store.commit({ 
            name: "testMutation",
            payload: "hello world"
        });
    }
}, 
// 第二個(gè)參數(shù)是一個(gè)對(duì)象,其中包含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方法有兩個(gè)參數(shù)。

第一個(gè)參數(shù)和原來(lái)傳入Page方法的option沒(méi)有區(qū)別。其中的data會(huì)作為全局共享對(duì)象來(lái)使用。

第二個(gè)參數(shù)是一個(gè)對(duì)象,其中包含mutationsactions

2.3 使用mutation

mutation和Vuex中的mutation類(lèi)似,它通過(guò)同步的方式修改狀態(tài)??梢酝ㄟ^(guò)commit調(diào)用。

2.3.1 定義mutation

mutations在wxappStore.createPage的第二個(gè)參數(shù)中定義,它用于修改全局狀態(tài)。mutation通常同步的。mutation方法的參數(shù)是一個(gè)對(duì)象,包含三個(gè)屬性:

setData function: 用來(lái)修改全局狀態(tài),在微信小程序中直接修改狀態(tài)不會(huì)觸發(fā)頁(yè)面重匯。

payload object:修改的狀態(tài),可以是一個(gè)對(duì)象,也可以是String等基礎(chǔ)數(shù)據(jù)類(lèi)型

data object:當(dāng)前狀態(tài)

mutations: {
    testMutation: function({ setData, payload, data }) {
        setData({
            message: payload
        });
    }
},
2.3.2 調(diào)用mutation

通過(guò)commit方法調(diào)用mutation,它的參數(shù)是一個(gè)對(duì)象,包含兩個(gè)屬性:

name String:mutation的名稱(chēng)

payload Object:需要修改的狀態(tài),和Vuex的payload類(lèi)似。

this.store.commit({ 
    name: "testMutation",
    payload: "hello world"
});
2.4 使用action

action和Vuex中action概念類(lèi)似,通常包含異步操作,在異步操作完成后進(jìn)行commit操作。

2.4.1 定義action

action方法的參數(shù)是一個(gè)參數(shù),包含3個(gè)屬性:

commit function:執(zhí)行commit操作

payload Object:數(shù)據(jù)對(duì)象,和Vuex類(lèi)型

data Object:當(dāng)前狀態(tài)

actions: {
    testAction: function ({ commit, payload, data }) {
        setTimeout(() => {
            commit({
                name: "testMutation",
                payload: payload
            });
        });
    }
}
2.4.2 調(diào)用action

通過(guò)dispatch方法調(diào)用action,它的參數(shù)是一個(gè)對(duì)象,包含兩個(gè)屬性:

name String:action的名稱(chēng)

payload Object:需要修改的狀態(tài),和Vuex的payload類(lèi)似。

this.store.dispatch({ 
    name: "testAction",
    payload: "hello world"
});
2.5 創(chuàng)建Component

在Component中我們需要完成兩項(xiàng)工作

第一將全局狀態(tài)綁定到當(dāng)前組件的data屬性上,并將組件的data屬性綁定到頁(yè)面元素上。

第二組件需要使用commit或者dispatch完成全局狀態(tài)的修改。

這里Store.j通過(guò)wxappStore.createComp來(lái)創(chuàng)建Component,它會(huì)通過(guò)代理的方式為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()
    })
  }
}))
讀取全局狀態(tài):{{localtimeData}}
2.5.1 全局狀態(tài)綁定

全局狀態(tài)綁定通過(guò)getGlobalData這個(gè)實(shí)例方法實(shí)現(xiàn),這個(gè)方法并不在小程序的運(yùn)行環(huán)境中,它是Store.js執(zhí)行的過(guò)程中插入到Component實(shí)例中的。

getGlobalData 不能再created回調(diào)中調(diào)用,應(yīng)為component的實(shí)例方法setData不能再created中調(diào)用。

getGlobalData的參數(shù)是一個(gè)對(duì)象,包含兩個(gè)屬性:

globalDataKey String:這個(gè)屬性表示需要全局狀態(tài)的屬性名,這個(gè)全局狀態(tài)將于component的本地狀態(tài)綁定。

localDataKey String:這個(gè)屬性表示本地狀態(tài)的屬性名,這個(gè)本地狀態(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)置的,同樣是通過(guò)Store.js插入到每一個(gè)component實(shí)例中。它的使用方法和Page中的類(lèi)似。

3. 這套框架的不足

Store.js借用了Page對(duì)象的data屬性來(lái)完成全局狀態(tài)管理,所以data屬性的職責(zé)并不單一。data屬性兼具了頁(yè)面ViewModel的功能和全局狀態(tài)的功能。但是Page中的data屬性本來(lái)也具有全局意義,所以?xún)烧叩臎_突并不大。

component中的data屬性職責(zé)并不單一。它兼具了本地屬性的功能和綁定全局狀態(tài)的功能。而且直接通過(guò)setData修改component中的data并不能觸發(fā)全局狀態(tài)的改變,因?yàn)閐ata的作用域僅限于當(dāng)前component,必須通過(guò)store.commit或者store.dispatch觸發(fā)發(fā)全局狀態(tài)的改變。

如果你發(fā)現(xiàn)其他問(wèn)題,歡迎留言,我們共同進(jìn)步!

4. 寫(xiě)完好累,原理等下次更新吧。。。。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94511.html

相關(guān)文章

  • 【開(kāi)源】小程序And公眾號(hào)商城,外加后臺(tái),功能齊全!

    摘要:前言一個(gè)集微信公眾號(hào)商城小程序商城商城后臺(tái)的一個(gè)開(kāi)源項(xiàng)目,后臺(tái)是基于開(kāi)發(fā)的,是一個(gè)簡(jiǎn)潔而強(qiáng)大的開(kāi)源微信公眾平臺(tái)開(kāi)發(fā)框架,微信功能插件化開(kāi)發(fā)多公眾號(hào)管理配置簡(jiǎn)單。微信小程序項(xiàng)目下載整個(gè)包之后,進(jìn)行根目錄文件夾。 前言 一個(gè)集微信公眾號(hào)商城/小程序商城/商城后臺(tái)的一個(gè)開(kāi)源項(xiàng)目,后臺(tái)是基于WeiPHP5.0開(kāi)發(fā)的,WeiPHP是一個(gè)簡(jiǎn)潔而強(qiáng)大的開(kāi)源微信公眾平臺(tái)開(kāi)發(fā)框架,微信功能插件化開(kāi)發(fā),多...

    VishKozus 評(píng)論0 收藏0
  • 【開(kāi)源】小程序And公眾號(hào)商城,外加后臺(tái),功能齊全!

    摘要:前言一個(gè)集微信公眾號(hào)商城小程序商城商城后臺(tái)的一個(gè)開(kāi)源項(xiàng)目,后臺(tái)是基于開(kāi)發(fā)的,是一個(gè)簡(jiǎn)潔而強(qiáng)大的開(kāi)源微信公眾平臺(tái)開(kāi)發(fā)框架,微信功能插件化開(kāi)發(fā)多公眾號(hào)管理配置簡(jiǎn)單。微信小程序項(xiàng)目下載整個(gè)包之后,進(jìn)行根目錄文件夾。 前言 一個(gè)集微信公眾號(hào)商城/小程序商城/商城后臺(tái)的一個(gè)開(kāi)源項(xiàng)目,后臺(tái)是基于WeiPHP5.0開(kāi)發(fā)的,WeiPHP是一個(gè)簡(jiǎn)潔而強(qiáng)大的開(kāi)源微信公眾平臺(tái)開(kāi)發(fā)框架,微信功能插件化開(kāi)發(fā),多...

    linkFly 評(píng)論0 收藏0
  • 詳解 mpvue 小程序框架 及和原生差異

    摘要:在這一步,實(shí)例已完成以下的配置數(shù)據(jù)觀測(cè),屬性和方法的運(yùn)算,事件回調(diào)??梢灾苯訉?xiě)等標(biāo)簽的寫(xiě)法之前會(huì)的工程師上手框架的成本較低 簡(jiǎn)介 1.美團(tuán)工程師推出的基于Vue.js封裝的用于開(kāi)發(fā)小程序的框架2.融合了原生小程序和Vue.js的特點(diǎn)3.可完全組件化開(kāi)發(fā) 特點(diǎn) 1.組件化開(kāi)發(fā)2.完成的Vue.js開(kāi)發(fā)體驗(yàn)(前提是熟悉Vue)3.可使用Vuex管理狀態(tài)4.Webpack構(gòu)建項(xiàng)目5.最終H5...

    IamDLY 評(píng)論0 收藏0
  • 也許你不需要第三方小程序框架

    摘要:所以在小程序出現(xiàn)之后,一股框架之風(fēng)也很快的出現(xiàn),微信小程序剛推出之后,就出現(xiàn)了兩個(gè)比較出名的小程序開(kāi)發(fā)框架,。 原文地址:https://ant-move.github.io/we... 這里說(shuō)的去除小程序框架其實(shí)并不嚴(yán)謹(jǐn),因?yàn)樾〕绦虮旧硪菜闶且粋€(gè)框架,而且是一個(gè)功能更加完善的框架系統(tǒng)。在前端的概念中,我們一般說(shuō)一個(gè)框架是指一個(gè)用來(lái)幫助開(kāi)發(fā)者構(gòu)建用戶(hù)界面的框架,而小程序框架本身不僅僅包...

    red_bricks 評(píng)論0 收藏0
  • 信小程序 + 騰訊地圖SDK 實(shí)現(xiàn)路線規(guī)劃

    摘要:業(yè)內(nèi)開(kāi)發(fā)框架層出不窮,,,等等,都在朝著更快,更強(qiáng)大的方向發(fā)展,有統(tǒng)一微信支付寶百度和頭條小程序的大趨勢(shì)。最近升級(jí)為版本,支持微信支付寶百度和頭條小程序。 原文鏈接 最近小程序的發(fā)展越來(lái)越火了,作為各個(gè)產(chǎn)品線的extra服務(wù)入口,以輕便、快速、強(qiáng)大的社交鏈吸引著大量的用戶(hù)和開(kāi)發(fā)者。業(yè)內(nèi)開(kāi)發(fā)框架層出不窮,wepy,mpvue,taro等等,都在朝著更快,更強(qiáng)大的方向發(fā)展,有統(tǒng)一 H5、微...

    keithyau 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<