vueX 自动匹配modules,vueX插件vuex-persistedstate自动存储本地,vue 自动引入所有路由,vue批量引入组件

2 篇文章 0 订阅

vueX按模块写,需要手动引入模块,可以通过代码自动引入,方便快捷

代码: index.js

// 自动匹配modules目录下的js文件作为store的modules,所以新增store模块的时候必须添加在modules目录下
const moduleFiles = require.context('./modules', true, /\.js$/);
const modules = moduleFiles.keys().reduce((modules, modulePath) => {
	const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
	const value = moduleFiles(modulePath)
	modules[moduleName] = value.default
	return modules
}, {});


//const moduleFiles = require.context('./modules', true, /\.js$/)
//const modules = {}
//moduleFiles.keys().map(key => {
//  const filename = key.replace(/^\.\/(.*)\.\w+$/, '$1')
//  modules[filename] = moduleFiles(key).default || moduleFiles(key)
//})

const store = new vuex.Store({
	modules,
})

目录格式:

modules->app.js 


const state = {
};
const mutations = {
 
};
const actions = {
 
};
export default { 
    namespaced: true, //命名空间
    state, 
    mutations, 
    actions 
};

 

vue 自动引入所有路由

// 获取./children下得所有js
const routerFiles = require.context('./children', true, /\.js$/)
// 获取每一个文件抛出得数据,并组合到routerObject
const routerObject = routerFiles.keys().reduce((allArray, key) => allArray.push(...(routerFiles(key).default || routerFiles(key))) && allArray, [])

const createRouter = () =>
  new Router({
    scrollBehavior: () => ({
      y: 0
    }),
    routes: routerObject 
 })

// 或者
const createRouter = () =>
  new Router({
    scrollBehavior: () => ({
      y: 0
    }),
    routes: [
          path: '/first',
          meta: {
          title: '第一路由'
        },
        component: Layout,
        children:routerObject
    ]
 })

vue批量引入组件 

const componentsFiles = require.context('@/components', true, /\.vue$/)
// 组件懒加载
// const componentsFiles = require.context('@/components', true, /\.vue$/, 'lazy')
const componentsObject = componentsFiles.keys().reduce((allObject, key) => {
let KeyName = key.replace(/(\.\/|\.vue)/g, '')
KeyName = KeyName.replace(/[a-zA-Z]/, (n) => n.toUpperCase()) // 首字母大写
  .replace(/\/[0-9|a-zA-Z]/g, (n) => n.replace(/\//, '').toUpperCase()) // 替换/以及驼峰大写
  .replace(/-[0-9|a-zA-Z]/g, (n) => n.replace(/-/, '').toUpperCase()) // 替换-以及驼峰大写
  .replace(/_[0-9|a-zA-Z]/g, (n) => n.replace(/_/, '').toUpperCase()) // 替换_以及驼峰大写
 allObject[KeyName] = componentsFiles(key).default || componentsFiles(key)
// 组件懒加载
// allObject[KeyName] = () => (componentsFiles(key).default || componentsFiles(key))
 return allObject
}, {})
console.log(componentsObject)
export default {
    ...
 
    components:componentsObject
 
    ...
}

 匹配的组件:

相关信息:

vueX自动存本地

npm install vuex-persistedstate --save

import Vue from 'vue'
import Vuex from 'vuex'
import persistedState from "vuex-persistedstate";
import getters from './getters.js'

// 自动匹配modules目录下的js文件作为store的modules,所以新增store模块的时候必须添加在modules目录下
const moduleFiles = require.context('./modules', true, /\.js$/);
const modules = moduleFiles.keys().reduce((modules, modulePath) => {
	const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
	const value = moduleFiles(modulePath)
	modules[moduleName] = value.default
	return modules
}, {});

Vue.use(Vuex)

export default new Vuex.Store({
  getters,
  modules,
  plugins: [persistedState({
    key: "thisVueX", // 浏览器中的名字
    paths: ["user"] // 需要存储起来的参数模块
  })]
})

特殊处理

// import CryptoJS from "crypto-js";
// const KEY1 = "cs2022606storage";
// const IVS1 = 'SpjSm53GXrBCK2XU'
// /**
//  * 
//  * 其他数据加密
//  */
//  export function DecryptAESOther(data) {
//   let dataData=JSON.parse(data)
//   let dataObject={}
//   if(dataData && dataData!=''){
//     Object.keys(dataData).forEach(item=>{
//       dataObject[item]=DecryptAESOther1(dataData[item])
//     })
//     return dataObject;
//   }else{
//     return {}
//   }
 
  
// }

// function DecryptAESOther1(data){
//   if (!data || data.length <= 0) return data;
//   var key = CryptoJS.enc.Utf8.parse(KEY1);
//   var iv = CryptoJS.enc.Utf8.parse(IVS1);
//   var decrypted = CryptoJS.AES.decrypt(data, key, {
//     iv: iv,
//     mode: CryptoJS.mode.CBC
//   });
//   // padding: CryptoJS.pad.Pkcs7
//   let returnData=decrypted.toString(CryptoJS.enc.Utf8).toString()
//   try{
//   	return JSON.parse(returnData);
//   }catch(e){
//   	//TODO handle the exception
// 	return returnData;
//   }
// }
// /**
//  * 
//  * 其他数据解密
//  */
//  export function EncryptAESOther(datas) {
//   let data = JSON.stringify(datas);
//   if (!data || data.length <= 0) return data;
//   var key = CryptoJS.enc.Utf8.parse(KEY1);
//   var iv = CryptoJS.enc.Utf8.parse(IVS1);
//   var encrypted = CryptoJS.AES.encrypt(data, key, {
//     iv: iv,
//     mode: CryptoJS.mode.CBC,
//     padding: CryptoJS.pad.Pkcs7
//   });
//   let jsonStr = encrypted.toString();
//   return jsonStr;
// }




//加解密方法
import {EncryptAESOther,DecryptAESOther} from '@/assets/utils/encrypt'

// 自动匹配modules目录下的js文件作为store的modules,所以新增store模块的时候必须添加在modules目录下
const moduleFiles = require.context('./modules', true, /\.js$/);
const modules = moduleFiles.keys().reduce((modules, modulePath) => {
	const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
	const value = moduleFiles(modulePath)
	modules[moduleName] = value.default
	return modules
}, {})


// 方法一:
export default new Vuex.Store({
  getters,
  modules,
  plugins: [persistedState({
    key: "vueX", // 浏览器中的名字
    // paths: ["user","public"], // 需要存储起来的参数模块,不能与reducer同时存在
    storage:{
      getItem:key=>DecryptAESOther(localStorage.getItem(key)),
      setItem: (key, value) => localStorage.setItem(key, value),
      removeItem: key => localStorage.removeItem(key)
    },
    reducer(value){
      return {
        user:EncryptAESOther(value.user),
        public:EncryptAESOther(value.public),
      }
    },
  })]

// 方法二:
export default new Vuex.Store({
  getters,
  modules,
  plugins: [persistedState({
    key: "vueX", // 浏览器中的名字
    // paths: ["user","public"], // 需要存储起来的参数模块,不能与reducer同时存在
    storage:{
      getItem:key=>DecryptAESOther1(localStorage.getItem(key)),
      setItem: (key, value) => localStorage.setItem(key, EncryptAESOther(value)),
      removeItem: key => localStorage.removeItem(key)
    }
  })]
})

createPersistedState([options])使用给定的选项创建插件的新实例。可以提供以下选项来配置您的特定需求的插件:

key :存储持久状态的键。(默认:vuex)

paths :部分持续状态的任何路径的数组。如果没有路径给出,完整的状态是持久的。(默认:[])

reducer :一个函数,将被调用来基于给定的路径持久化的状态。默认包含这些值。

subscriber :一个被调用来设置突变订阅的函数。默认为store => handler => store.subscribe(handler)

storage :而不是(或与)getState和setState。默认为localStorage。

getState :将被调用以重新水化先前持久状态的函数。默认使用storage。

setState :将被调用来保持给定状态的函数。默认使用storage。

filter :将被调用来过滤将setState最终触发存储的任何突变的函数。默认为() => true

vuex-persistedstate
vuex-persistedstate(github)
 

最后:
也可以通过vuex-persist插件实现,配置基本相同,具体点击查看文档

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuex持久化插件vuex-persistedstate是一个用于在Vue.js应用中实现Vuex状态的持久化的插件。它可以将Vuex中的某些状态保存在本地存储中,以便在页面刷新或重新加载后,仍然可以保持这些状态的值。 在使用vuex-persistedstate插件时,我们首先需要通过npm安装它,可以使用以下命令进行安装: npm install vuex-persistedstate --save 接下来,在我们的Vue应用中,我们需要在Vuex的store文件中引入vuex-persistedstate插件,并将其添加到Vuex的plugins选项中。以一个具体的例子来说明,如果我们想要给tab模块的state中的menu做持久化,我们可以使用如下代码配置我们的store: import Vue from 'vue' import Vuex from 'vuex' import tab from './tab.js' import createPersistedState from "vuex-persistedstate" Vue.use(Vuex) export default new Vuex.Store({ modules: { tab }, plugins: [ createPersistedState({ paths: ['tab.menu'] }) ] }) 在上述代码中,我们引入了createPersistedState方法并将其作为插件传递给Vuex的plugins选项。通过传递一个对象给createPersistedState方法的paths选项,我们可以指定需要持久化的状态的路径。在这个例子中,我们指定了tab模块下的menu状态需要进行持久化。 这样,当我们在应用中对tab模块的menu状态进行修改后,这个修改将会被自动保存在本地存储中。当我们刷新或重新加载页面时,这个状态的值将会被还原,以便我们可以继续使用之前保存的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vuex持久化存储插件vuex-persistedstate](https://blog.csdn.net/weixin_51382988/article/details/128584817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值