亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳解Vuex下Store的模塊化拆分實踐

2019-11-19 11:06:04
字體:
來源:轉載
供稿:網友

前言

最近的項目用到了 vue.js + vuex + vue-router 全家桶,版本為 >2.0,在搞Store的時候發現,圈子里大部分關于vuex的文章都是比較基礎的Demo搭建方式,很少有涉及到比較復雜的模塊化拆分的Store實踐,而且事實上也有朋友在實踐中問到過這方面的內容,vuex自身提供了模塊化的方式,因此在這里總結一下我自己在項目里的心得。

模塊化拆分

vue.js的項目文件結構在這里就不說了,大家可以通過vue-cli初始化項目,腳手架會為你搭建一個start項目的最佳實踐。

默認你已經搭架好了一個項目,而且需要建立或者已經是一個復雜的Store,但是還沒有進行模塊拆分,你可以嘗試對其進行模塊拆分,當然在一開始你不必一定需要這么做。

1. 安裝Vuex,建立文件結構

在項目根目錄下安裝vuex:

npm install vuex -S

安裝完畢后,在項目的src文件夾下新建一個store文件夾,并且分別在其中新建modules,actions,mutations,getters,constants子文件夾和一個index.js文件。

目錄結構如下:

└─ 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

好了,基本的文件結構大概就是上面?這樣的。

2. 編寫模塊A

在編寫模塊之前,首先設定一些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 }}

上面自己實現keyMirror的方法,大家也可以使用下面這個包:

https://github.com/STRML/keyMirror

keyMirror的作用就是下面這個一個形式?,作用其實也不是很大:

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實例

main.js

 ????import store from './store' ???? var vue = new Vue({ store,  ???? })vue.$mount('#app')

5. 在Component中使用

Vuex 提供了組件中使用的mapState,mapAction,mapGetter方法,因此可以很方便的調用。

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>

復用模塊

模塊化拆分之后可以實現較為復雜的數據流,特別地,如果對action和mutation稍加改造,就可以復用模塊:
比如我們在Example.vue中發起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>

在上面的例子中,我們在組件掛載完成之后發起了一個fetchList的action,并添加了一個名為request的參數,這里給一個week值,也可以給按照業務需要給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的參數,這樣Mutation就可以從里面獲取相應的參數,最后對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],以區分不同的接口數據。

完成以上修改后,只需要在組件調用相應的action時加入不同的參數,就可以調用相同類型但數據不同的接口。

總結

以上是我在Vuex實踐中總結的一些東西,分享給大家,如果有不合理或者錯誤❌的地方,也希望各位老司機不吝賜教,有機會多交流。也希望大家多多支持武林網。

微信號:pasturn
Github:https://github.com/pasturn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美福利视频| 国产成+人+综合+亚洲欧洲| 欧美亚洲视频在线看网址| 国产精品久久久av| 91久久在线播放| 欧美激情亚洲一区| 91久久久精品| 亚洲成人激情在线观看| 日本免费一区二区三区视频观看| 国产成人精品一区二区| 国产一区二区精品丝袜| 欧美电影院免费观看| 国内免费精品永久在线视频| 国产精品成人av在线| 国产精品久久久久久久久久久不卡| 国产精品无av码在线观看| 欧美日韩亚洲国产一区| 亚洲精品永久免费| 亚洲人成电影网站色…| 国产精品视频大全| www.日本久久久久com.| 国产精品羞羞答答| 亚洲视频国产视频| 91网站在线免费观看| 91免费在线视频网站| 精品亚洲一区二区| 国产精品视频一区二区高潮| 亚洲伊人久久综合| 成人淫片在线看| 国产精品激情av在线播放| 日韩免费高清在线观看| www.亚洲天堂| 亚洲一区亚洲二区| 亚洲精品一区二区久| 国产精品久久视频| 日本国产一区二区三区| 高清视频欧美一级| 亚洲视频999| 欧美日韩一区二区免费视频| 亚洲区一区二区| 国产主播喷水一区二区| 精品亚洲一区二区三区四区五区| 555www成人网| 欧美成人免费在线视频| 8090成年在线看片午夜| 色诱女教师一区二区三区| 精品视频一区在线视频| 欧美猛少妇色xxxxx| 97精品伊人久久久大香线蕉| 日韩电影中文字幕在线| 啪一啪鲁一鲁2019在线视频| 精品一区二区三区电影| 一区二区三区视频免费| 欧美电影免费看| 在线精品91av| 久99九色视频在线观看| 亚洲人成网站999久久久综合| 国产日韩在线视频| 国产精品成人免费电影| 清纯唯美亚洲激情| 92版电视剧仙鹤神针在线观看| 78色国产精品| 色偷偷88888欧美精品久久久| 精品久久久久久久久久ntr影视| 国产精品久久婷婷六月丁香| 红桃av永久久久| 久久99久久久久久久噜噜| 色噜噜狠狠色综合网图区| 97av在线视频| 成人乱人伦精品视频在线观看| 精品国内自产拍在线观看| 亚洲精品ady| 性视频1819p久久| 日韩欧美亚洲综合| 欧美另类69精品久久久久9999| 成人欧美一区二区三区黑人孕妇| 亚洲国产成人久久综合一区| 欧美重口另类videos人妖| 精品一区二区三区四区| 欧美孕妇毛茸茸xxxx| 欧美精品久久久久a| 久久这里有精品| 午夜精品福利在线观看| 久久这里只有精品视频首页| 中文字幕视频一区二区在线有码| 成人激情视频免费在线| 亚洲电影免费观看| 在线观看亚洲视频| 国内精品久久久久影院 日本资源| 亚洲自拍偷拍在线| 欧美成人午夜激情| 91精品国产乱码久久久久久久久| 国产精品日韩电影| 亚洲va欧美va在线观看| 91久久精品美女| 亚洲第一区第二区| 亚洲精品97久久| 最近2019年日本中文免费字幕| 久热国产精品视频| 亚洲欧美精品一区| 日韩欧美高清视频| 日本最新高清不卡中文字幕| 亚洲视频999| 国产精品久久久久久久午夜| 成人午夜激情免费视频| 91a在线视频| 91久久久久久久久久| 热re91久久精品国99热蜜臀| 精品国产区一区二区三区在线观看| 久久综合电影一区| 中国china体内裑精亚洲片| 亚洲大胆人体在线| 亚洲精品一区久久久久久| 亚洲国产欧美一区二区三区同亚洲| 性日韩欧美在线视频| 久久精品成人一区二区三区| 国产精品中文字幕在线| 成人在线视频网| 性欧美办公室18xxxxhd| 国产91网红主播在线观看| 亚洲视频在线观看免费| 亚洲美女免费精品视频在线观看| 亚洲女人被黑人巨大进入| 亚洲国产三级网| 日韩精品日韩在线观看| 亚洲香蕉成人av网站在线观看| 日韩成人av在线播放| 久久亚洲精品网站| 欧美理论电影网| 国产91精品久久久久久| 欧美丰满老妇厨房牲生活| 亚洲美女久久久| 永久555www成人免费| 91国自产精品中文字幕亚洲| 久久影视电视剧凤归四时歌| 日韩高清电影好看的电视剧电影| 国产精品美女www| 神马国产精品影院av| 国产日韩精品在线| 国产在线精品成人一区二区三区| 全球成人中文在线| 国产精品美女久久久久av超清| 国产一区二区日韩精品欧美精品| 亚洲精品永久免费| 欧美精品18videos性欧美| 欧美乱大交xxxxx| 成人国产精品一区| 国内揄拍国内精品| 俺去啦;欧美日韩| 97国产精品人人爽人人做| 中文字幕亚洲一区在线观看| 中文字幕欧美在线| 精品亚洲aⅴ在线观看| 北条麻妃一区二区在线观看| 国产一区二区三区视频免费| 亚洲国产精品高清久久久| 在线观看国产精品日韩av| 中文字幕亚洲一区在线观看| 精品国产福利视频| 精品亚洲一区二区三区四区五区| 欧美黑人一级爽快片淫片高清| 国自在线精品视频| 中文字幕欧美亚洲| 欧美在线性视频|