Vue3下使用Vuex(store)实现响应式全局变量


本文记录了如何使用vuex建立响应式全局变量,内容有:按类别建立多模块、如何引入、使用、如何不借助第三方工具在localStorage、sessionStorage中实现数据持久化,以及vuex store state的赋值问题。

1 安装

项目路径下,终端内执行

vue add vuex -S

或者

yarn install vuex -S

2 编写vuex配置文件

2.1 目录及文件结构

在这里插入图片描述

2.2 index.js文件

可以在此文件内直接编辑全局根参数,或引入模块级参数

import {createStore} from 'vuex'  
export default createStore({
  state: {
  },
  getters: {},
  mutations: {},
  actions: {},
  modules: {} 
  })

2.3 编写vuex模块级参数文件

在store/modeules目录下新建模块级参数文件。例如

/**
 * app全局变量
 *@author MuYi
 *@date 2022/3/21 8:58
 *@version 1.0
 */
export default {
  namespace: 'true',
  state() {
    return {
      /**
       * app信息
       */
      appInfo: {
        registerCompany: '请联系注册您的公司',
        version: '1.0.0',
        copyright: 'WinTown Software studio All rights reserved.',
        copyrightYear: '©2021-2022',
        author: ''
      }, 
      theme: { 
        menuMode: 'vertical', 
        colorBackground: '#009999',
      }
    }
  },
  mutations: {
    /**
     * 设置app信息
     * @param appInfo
     */
    saveAppInfo(state, appInfo) {
     state.appInfo = appInfo;
    }, 
    saveTheme(state, theme) {
      state.theme = theme;
    }
  },
  actions: {
    updateTheme(context, theme) {
      context.commit("theme", theme);
    },
    updateAppInfo(context, appInfo) {
      context.commit("appInfo", appInfo)
    }
  },
  getters: {
    theme(state) {
      return state.theme;
    },
    appInfo(state) {
      return state.appInfo;
    }
  }
}

2.4 index.js中引入模块级参数

import {createStore} from 'vuex'
import appGlobal from "@/store/modules/appGlobal";

export default createStore({
  state: {
  },
  getters: {},
  mutations: {},
  actions: {},
  modules: {
    /**
     * app全局参数
     */
    appGlobal,
  }
})

3 引入

main.js文件中

import store from './store'

4 使用

程序片段

<template>
	 <p class="appTitle ">{{appInfo.registerCompany}}</p>
	 ... ...
<script>
	  import {reactive, toRefs, computed, getCurrentInstance} from "vue";
	  import {useStore} from "vuex"
	  export default {
    	name: "LoginView",
	    setup() {
      		const appInfo = computed(() => useStore().state.appGlobal.appInfo)
      		... ...
      		return { appInfo ... ...}
    ... ...  		

5 持久化

随着浏览器的刷新,存储在auex中的数据会被自动清除。vuex中的数据持久化,可以采用vuex-persistedstate link插件实现vuex数据同步到本地。

默认自动同步所有数据,但可以实现指定字段存储。目前仅支持一种存储介质(localStorage、cookie或sessionStorage)。

出于安全考虑,store中的数据按使用类别,应存储在不同类型的本地存储介质中,建议手动编写处理方法,虽然麻烦,但自由度高。

5.1 vuex值存储在sessionStorge中

/**
* 系统非公开信息,同步保存在session中,退出应被清除
*@author MuYi
*@date 2022/3/29 16:23
*@version 1.0
*/
/**
* 初始值。
* sessionStorage不为空时,填写该值
* @param key
* @return {string}
*/
function parseInitState(key) {
 return sessionStorage.getItem(key) !=null? sessionStorage.getItem(key) : "";
}

export default {
 namespace: 'true',
 state: {
   token: parseInitState('token')
 },
 mutations: {
   /**
    * 保存令牌,同步session保存
    * @param state
    * @param token
    */
   saveToken(state, token) {
     state.token = token;
     sessionStorage.setItem("token", token);
   },
   /**
    *清空所有,同步清空session
    */
   clearSystemInfo(state) {
     state.token = "";
     sessionStorage.removeItem("token");
   }
 },
 actions: {
   saveToken(context, token) {
     context.commit("saveToken", token);
   },
   clearSystemInfo(context) {
     context.commit("clearSystemInfo")
   }

 },
 getters: {
   token(state) {
     return state.token;
   }
 }
}

5.1 vuex值存储在localStorge中

/**
 * app全局变量
 *@author MuYi
 *@date 2022/3/21 8:58
 *@version 1.0
 */
const moduleName = "theme"
const defaultTheme = {
  /**
   * element元素尺寸
   */
  size: 'small',
  /**
   * 纵向菜单
   * false/true 对应horizontal / vertical
   */
  menuIsVertical: true,
  /**
   * 背景色
   */
  colorBackground: '#009999',
  /**
   * 个人信息背景色
   */
  colorProfile: '#007777',
  /**
   * 当前项背景色
   */
  colorBackgroundActive: '#00BBBB',
  /**
   * 前景色
   */
  colorNormal: '#FFFFFF',
  /**
   * 当前项色
   */
  colorActive: '#00FFFF',
  /**
   * 图标色
   */
  colorIcon: '#eef1f6',
  /**
   * 当前项图标色
   */
  colorIconActive: '#feffff',
  /**
   * 菜单收紧
   */
  menuIsCollapse: false,
}
Object.freeze(defaultTheme)
export default {
  namespace: 'true',
  state: localStorage.getItem(moduleName) != null ?
    JSON.parse(localStorage.getItem(moduleName)) : defaultTheme,
  mutations: {
    /**
     * 设置app样式
     * @param theme
     */
    saveTheme(state, theme) {
      if (!theme.menuIsVertical && theme.menuIsCollapse) {
        theme.menuIsCollapse = false
      }
      for (let item in theme) {
        state[item]=theme[item]
      }
      localStorage.setItem(moduleName, JSON.stringify(state))
    },
    resetTheme(state) {
      for (let item in defaultTheme) {
        state[item]=defaultTheme[item]
      }
      localStorage.setItem(moduleName, JSON.stringify(state))
    },

    /**
     * 切换纵横菜单方向,当切换后为横向时自动theme.menuIsCollapse = false
     * @param state
     */
    changeMenuIsVertical(state) {
      state.menuIsVertical = !state.menuIsVertical;
      if (!state.menuIsVertical) {
        state.menuIsCollapse = false;
      }
      localStorage.setItem(moduleName, JSON.stringify(state))
    },
    changeMenuCollapse(state) {
      if (!state.menuIsVertical) {
        state.menuIsCollapse = false
      } else
        state.menuIsCollapse = !state.menuIsCollapse;
      localStorage.setItem(moduleName, JSON.stringify(state))
    },
  },
  actions: {
    saveTheme(context, theme) {
      context.commit("saveTheme", theme);
    },
    resetTheme(context) {
      context.commit("resetTheme");
    },
  },
  getters: {
    theme(state) {
      return state;
    },
  }
}

注意

初学乍道,以下总结不对的,请留言指出。

  • 使用模块化参数定义,尽量避免参数全部定义在根下。
  • state为proxy类型,如果自定义数据为json类型时,可以采用state.xxx=newValue的方式赋值,否则应采用最后例子中的方法遍历枚举赋值
  • localStorage、sessionStorage中存取数据为string类型,需要使用JSON.xxx方法转换
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue 3中使用Vuex,你需要按照以下步骤进行设置: 1. 安装Vuex:在终端中运行以下命令安装Vuex: ``` npm install vuex@next ``` 2. 创建一个Vuex store:在你的项目中创建一个新的文件(例如store.js),并导入`createStore`函数和你的模块文件(如果有的话): ```javascript import { createStore } from 'vuex'; import moduleA from './moduleA'; export default createStore({ modules: { moduleA } }); ``` 3. 创建模块(可选):如果你的应用程序需要使用模块来组织状态,你可以创建一个或多个模块文件。在上面的示例中,我们导入了一个名为moduleA的模块。 4. 在Vue应用程序中使用Vuex:在你的main.js文件中导入创建的store,并将其与Vue应用程序实例关联: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import store from './store'; const app = createApp(App); app.use(store); app.mount('#app'); ``` 现在,你可以在你的Vue组件中使用Vuex的功能,包括状态管理、mutations、actions和getters等。 例如,在组件中访问和修改状态: ```javascript import { useStore } from 'vuex'; export default { setup() { const store = useStore(); // 访问状态 const count = computed(() => store.state.moduleA.count); // 修改状态 const increment = () => { store.commit('moduleA/increment'); }; return { count, increment }; } }; ``` 这就是在Vue 3中使用Vuex的基本步骤。你可以在官方文档中了解更多关于Vuex的信息:https://next.vuex.vuejs.org/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muyi517

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值