Vue自定义重置Vuex的某个模块

2021-03-02  本文已影响0人  Luciena

背景

在前端SPA项目开发中,我们往往会用Vuex来管理共享状态。在庞大的项目中,我们可能会遇到需要reset某一个store或者是全部(比如退出登录)

方案

1.对外抛出一个clearStore方法
2.基于传入的数据,去对应的reset这一个store

具体代码

/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import problem from './modules/problem'
import week from './modules/week'
import library from './modules/library'
import global from './modules/global'
import main from './modules/main'
import final from './modules/final'

import getters from './getters'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    global,
    week,
    problem,
    library,
    main,
    final
  },
  getters
})
export default store

// 重置state数据
export function clearState(state, initData) {
  Object.keys(state).forEach(key => {
    if (!initData[key]) {
      delete state[key]
    }
  })
  Object.keys(initData).forEach(key => {
    state[key] = initData[key]
  })
}
// 清除store
export function clearStore(index) {
  if (!store) return
  const modules = ['Global', 'Problem', 'Library', 'Week', 'Main']
  if (index) {
    store.commit('clear' + modules[index])
  } else {
    modules.forEach(item => {
      store.commit('clear' + item)
    })
  }
}

/store/modules/global.js

import { clearState } from '../index.js'

// 初始化数据
const initState = () => ({
  forward: false,
  fromPageName: ''
})

const global = {
  state: initState(),
  mutations: {
    setForward(state, forward) {
      state.forward = forward
    },
    setFromPageName(state, fromPageName) {
      state.fromPageName = fromPageName
    },
    clearGlobal(state) {
      clearState(state, initState())
    }
  }
}

export default global

/views/demo.vue

import { clearStore } from '@/store/index.js'

// 重置global的store
clearStore(0)
// 重置所欲模块的store
clearStore()
上一篇下一篇

猜你喜欢

热点阅读