您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Vuex下Store模塊化拆分的示例分析的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
模塊化拆分
vue.js的項(xiàng)目文件結(jié)構(gòu)在這里就不說了,大家可以通過vue-cli初始化項(xiàng)目,腳手架會為你搭建一個start項(xiàng)目的最佳實(shí)踐。
默認(rèn)你已經(jīng)搭架好了一個項(xiàng)目,而且需要建立或者已經(jīng)是一個復(fù)雜的Store,但是還沒有進(jìn)行模塊拆分,你可以嘗試對其進(jìn)行模塊拆分,當(dāng)然在一開始你不必一定需要這么做。
1. 安裝Vuex,建立文件結(jié)構(gòu)
在項(xiàng)目根目錄下安裝vuex:
npm install vuex -S
安裝完畢后,在項(xiàng)目的src文件夾下新建一個store文件夾,并且分別在其中新建modules,actions,mutations,getters,constants子文件夾和一個index.js文件。
目錄結(jié)構(gòu)如下:
└─ demo/ ├── build/ ├── config/ ├── node_modules/ ├── src/ │ ├── assets/ │ ├── components/ │ ├── store/ │ │ ├── actions/ │ │ │ ├──aAction.js │ │ │ ├──bAction.js │ │ │ └──cAction.js │ │ ├── constants/ │ │ │ └── types.js │ │ ├── getters/ │ │ │ └── aGetter.js │ │ ├── modules/ │ │ │ ├── aModules.js │ │ │ ├── bModules.js │ │ │ ├── cModules.js │ │ │ └── index.js │ │ ├── mutations/ │ │ │ ├── aMutation.js │ │ │ ├── bMutation.js │ │ │ └── cMutation.js │ │ └── index.js │ ├── App.vue │ └── main.js ├── static/ ├── utils/ ├── test/ └── index.html
好了,基本的文件結(jié)構(gòu)大概就是上面?這樣的。
2. 編寫模塊A
在編寫模塊之前,首先設(shè)定一些type類,例如:
types.js
module.exports = keyMirror({ FETCH_LIST_REQUEST: null, FETCH_LIST_SUCCESS: null, FETCH_LISR_FAILURE: null }) function keyMirror (obj) { if (obj instanceof Object) { var _obj = Object.assign({}, obj) var _keyArray = Object.keys(obj) _keyArray.forEach(key => _obj[key] = key) return _obj } }
上面自己實(shí)現(xiàn)keyMirror的方法,大家也可以使用下面這個包:
https://github.com/STRML/keyMirror
keyMirror的作用就是下面這個一個形式?,作用其實(shí)也不是很大:
Input: {key1: null, key2: null}
Output: {key1: key1, key2: key2}
actions/aAction.js
import { FETCH_LIST_REQUEST, FETCH_LIST_SUCCESS, FETCH_LISR_FAILURE } from '../constants/types' import { toQueryString } from '../../utils' import axios from 'axios' export const fetchListAction = { fetchList ({ commit, state }, param) { commit(FETCH_LIST_REQUEST) axios.get('http://youdomain.com/list') .then(function (response) { commit(FETCH_LIST_SUCCESS, { data: response.data }) console.log(response); }) .catch(function (error) { commit(FETCH_LIST_FAILURE, { error: error }) console.log(error); }); } }
getters/aGetter.js
export const = fetchListGetter = { hotList (state) { return state.list.data.slice(0, 10) } }
mutations/aMutation.js
import { FETCH_LIST_REQUEST, FETCH_LIST_SUCCESS, FETCH_LISR_FAILURE } from '../constants/types' export const fetchListMutation = { [FETCH_LIST_REQUEST] (state) { state.isFetching = true }, [FETCH_LIST_SUCCESS] (state, action) { state.isFetching = false state.data = action.data state.lastUpdated = (new Date()).getTime() }, [FETCH_LIST_FAILURE] (state, action) { state.isFetching = false state.error = action.error } }
modules/aModule.js
import { fetchListAction } from '../actions/aAction' import { fetchListGetter } from '../getters/aGetter' import { fetchListMutation } from '../mutations/aMutation' export const list = { state: { isFetching: false, data: [] } actions: fetchListAction, getters: fetchListGetter, mutations: fetchListMutation }
modules/index.js
import { list } from './aModule' module.exports = { list: list }
3. 掛載store
index.js
import Vue from 'vue' import Vuex from 'vuex' import createLogger from 'vuex/dist/logger' import { list } from './modules' Vue.use(Vuex) const store = new Vuex.Store({ modules: { list: list }, plugins: [createLogger()], strict: process.env.NODE_ENV !== 'production' }) if (module.hot) { module.hot.accept(['./mutations'], () => { const newMutations = require('./mutations').default store.hotUpdate({ mutations: newMutations }) }) } export default store
4. store注入vue實(shí)例
main.js
···· import store from './store' ···· var vue = new Vue({ store, ···· }) vue.$mount('#app')
5. 在Component中使用
Vuex 提供了組件中使用的mapState,mapAction,mapGetter方法,因此可以很方便的調(diào)用。
Example.vue
<template> ········· </template> <script> import { mapState, mapActions, mapGetters } from 'vuex' module.exports = { ······· methods: { ...mapActions([ 'fetchList' ]) }, computed: { ...mapState{ list: state => state.list }, ...mapGetters{[ 'hotList' ]} } } </script> <style> ······· </style>
復(fù)用模塊
模塊化拆分之后可以實(shí)現(xiàn)較為復(fù)雜的數(shù)據(jù)流,特別地,如果對action和mutation稍加改造,就可以復(fù)用模塊:
比如我們在Example.vue中發(fā)起Action:
Example.vue
<template> ········· </template> <script> import { mapState, mapActions, mapGetters } from 'vuex' module.exports = { ······· mounted () { this.fetchList({ request: 'week' }) }, methods: { ...mapActions([ 'fetchList' ]) }, computed: { ...mapState{ list: state => state.list }, ...mapGetters{[ 'hotList' ]} } } </script> <style> ······· </style>
在上面的例子中,我們在組件掛載完成之后發(fā)起了一個fetchList的action,并添加了一個名為request的參數(shù),這里給一個week值,也可以給按照業(yè)務(wù)需要給month、year之類的值,接下來對aAction.js做一些修改。
actions/aAction.js
import { FETCH_LIST_REQUEST, FETCH_LIST_SUCCESS, FETCH_LISR_FAILURE } from '../constants/types' import { toQueryString } from '../../utils' import axios from 'axios' export const fetchListAction = { fetchList ({ commit, state }, param) { commit(FETCH_LIST_REQUEST, { request: param['request'] }) axios.get(`http://youdomain.com/${param['request']}list`) .then(function (response) { commit(FETCH_LIST_SUCCESS, { request: param['request'] data: response.data }) console.log(response); }) .catch(function (error) { commit(FETCH_LIST_FAILURE, { request: param['request'] error: error }) console.log(error); }); } }
請求成功之后,在 commit()中加入了一個request的參數(shù),這樣Mutation就可以從里面獲取相應(yīng)的參數(shù),最后對aMutation做一些修改。
mutations/aMutation.js
import { FETCH_LIST_REQUEST, FETCH_LIST_SUCCESS, FETCH_LISR_FAILURE } from '../constants/types' export const fetchListMutation = { [FETCH_LIST_REQUEST] (state, action) { state[action.request].isFetching = true }, [FETCH_LIST_SUCCESS] (state, action) { state[action.request].isFetching = false state[action.request].data = action.data state[action.request].lastUpdated = (new Date()).getTime() }, [FETCH_LIST_FAILURE] (state, action) { state[action.request].isFetching = false state[action.request].error = action.error } }
state加入了[action.request],以區(qū)分不同的接口數(shù)據(jù)。
完成以上修改后,只需要在組件調(diào)用相應(yīng)的action時加入不同的參數(shù),就可以調(diào)用相同類型但數(shù)據(jù)不同的接口。
感謝各位的閱讀!關(guān)于“Vuex下Store模塊化拆分的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。