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

news2024/11/18 21:26:20

Vue3下使用Vuex store

  • 1 安装
  • 2 编写vuex配置文件
    • 2.1 目录及文件结构
    • 2.2 index.js文件
    • 2.3 编写vuex模块级参数文件
    • 2.4 index.js中引入模块级参数
  • 3 引入
  • 4 使用
  • 5 持久化
    • 5.1 vuex值存储在sessionStorge中
    • 5.1 vuex值存储在localStorge中
  • 注意


本文记录了如何使用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方法转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java后端Date类型返回给前端变为时间戳解决方法

今天在制作个人博客的分页功能时候&#xff0c;发现了这个问题 后端查询数据正确&#xff0c;2022-11-12 数据库MySQL5.7 用的date类型 因为写文章一般yyyy-MM-dd 类型就够用了 如果你需要yyyy-MM-dd HH-mm-SS 这种带时分秒的用datetime类型 数据存的也是2022-11-12 格式正确…

【JSP入门】只知道HTML却不知道JSP?

前言 今天我们继续来总结学习JSP相关知识&#xff0c;上一篇我们学习了Servlet的基础入门&#xff0c;如果你还对Servlet那么建议你先去看一下上篇博客再回来。 传送门&#xff1a;【Servlet入门】一篇文章让你从没听过到了熟于心 在之前我们已经学习了HTML&#xff0c;CSS&…

html静态登录、注册页面

登录 代码如下 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <style> body { background: url(https://cdn.pixabay.com/photo/2018/08/14/13/23/ocean-3605547_1280.j…

windows7安装node14版本及以上

前言&#xff1a; gitee上拉了一个项目&#xff0c;npm install一直报错。一直没有解决&#xff0c;就去gitee上看前端启动教程。作者说要运行在node14或者16上。我就去官网下载node14的msi。这个是不支持windows7的。我就百度&#xff0c;他们说要下载压缩包。 我之前走了好…

sourcemap文件泄露漏洞

最近进行渗透测试时&#xff0c;时常遇到xray扫出sourcemap文件&#xff0c;每次扫到都要百度&#xff0c;因此做个笔记。 漏洞原理 在日常测试时&#xff0c;经常会遇到以js.map为后缀的文件 这是jQuery中的一个新功能&#xff0c;支持Source Map 非常多Webpack打包的站点都…

Vue3: vue3 props接多个不同类型的参数,默认false

哪天的问题来着...嘶...(挠头)... 之所以会卡在这里&#xff0c;是因为在我的经验及认知里&#xff0c;封装组件中props的使用&#xff0c;接参时从来都是一个参数对应一个值&#xff0c;尤其是在ts中&#xff0c;还更为严格地设定了参数类型&#xff0c;所以我的业务需求不知道…

保姆级教程!如何在安卓手机上安装使用油猴脚本

浏览器插件成千上万&#xff0c;但是大家都有一个共识&#xff0c;那就是油猴无插件能敌&#xff0c;原因就在于它一个插件就可以实现众多插件的功能。 首先需要明确一点的是&#xff0c;油猴插件本身是没有任何功能的&#xff0c;它需要依靠脚本来实现功能。至于脚本&#xf…

红队web打点信息收集

目录 红蓝对抗 ICP备案查询—查询主域 主站域名一键查询 敏感信息收集 googlehack语法 目标邮箱号收集 子域名收集 被动信息收集 证书透明 fofa_viewer 在线子域名查询 第三方DNS服务 google语法 主动信息收集 oneforall Sylas—从burp历史记录中提取子域 Lay…

【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件

目录 前言 初识express 使用express创建基本的web服务器 初识express路由 路由匹配概念 路由模块化 中间件 中间件和路由的区别 定义中间件函数 中间件作用 局部生效中间价 中间件分类 1.应用级别中间件 2.路由级别的中间件 3.错误级别中间件 4.内置中间件 5.自定义…

带你深入理解js事件循环机制

同步任务和异步任务&#xff08;微任务和宏任务&#xff09; JavaScript是一门单线程语言 分为同步任务和异步任务 同步任务是指在主线程上排队执行的任务&#xff0c;只有前一个任务执行完毕&#xff0c;才能继续执行下一个任务。 异步任务指的是&#xff0c;不进入主线程…

Pro1:图片的隐藏和显示

什么是JavaScript&#xff1f;实现目标实现代码实现效果实现方法&#x1f49b;作者主页&#xff1a;静Yu &#x1f9e1;简介&#xff1a;CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家&#xff0c;前端知识交流社区创建者 &#x1f49b;社区地址&#xff1a;前端知识交…

axios 中如何取消请求_从不会使用到精通原理_番茄出品

start 最近频繁遇到一个问题&#xff0c;axios 是如何取消请求的&#xff1f;这篇文章将从新手小白的视角出发&#xff0c;从 axios 取消逻辑的基础使用&#xff0c;到原理分析&#xff0c;带你彻底了解并掌握 axios 中取消请求的“秘密”。编写时间&#xff1a;2023/02/24-23…

520到了,教你做个JavaWeb表白墙小项目

目录 1.配置 Maven 项目 1.1 创建 Maven 项目 1.2 引入相关依赖 1.3 项目总结构 2. 约定前后端交互接口 3.服务端代码 3.1 创建Message类 3.2 创建工具类 3.3 添加信息类&#xff08;AddMessage&#xff09; 3.4 查询信息类&#xff08;MessageList&#xff09; 4. …

vue3中的配置代理

如图&#xff0c;配置代理就是在客户端与服务器中充当中介的角色 目录 关于配置代理&#xff0c;首先我们的要知道为什么要配置代理&#xff0c;配置代理做了什么事情 一、跨域是什么 二、如何解决 三、配置代理案例 1. 下面是我自己在后端尝试解决跨域的例子 2.然后在vue中…

【Vue项目实战】Vue3中动态修改样式和级联样式优先顺序详解

Vue实战笔记目录前言一、ref修改样式1、通过 Vue 的 ref 组件获取 DOM 元素节点注&#xff1a;这边比较一下&#xff0c;和 DOM操作 document.getElementById(id) 这个方法有什么区别2、通过 ref 修改 DOM 元素节点样式二、通过v-bind对Html元素的样式(style)进行动态绑定三、v…

端午假期整理了仿天猫H5 APP项目vue.js+express+mongo

效果 源码 源码太多&#xff0c;放github上了点击 遇到的问题 连接mongodb数据库多个集合&#xff08;model文件&#xff09; mongodb与mysql数据库连接不同&#xff0c;sql在定义查询语句时可以连接不同的表mongodb需要在开始定义好连接要用到的表 module.exports {dbPr…

echarts-wordcloud 血泪总结使用说明 (配置项及其不足点优化)

基本使用方法 echarts-wordcloud是基于echarts的一个词云库&#xff0c;是我常用的一个组件&#xff0c;业务上用的多一点&#xff0c;但是这个库在echarts的官网文档里面没有说明&#xff0c;git上的说明也很少&#xff0c;有些配置需要自己摸索&#xff0c;下面都是我的血泪…

css动画效果

动画1&#xff08;沿着椭圆转动&#xff09; 其实是个2D转动&#xff0c;只不过咱们设置椭圆&#xff0c;然后加上scale缩放&#xff08;近大远小&#xff09;&#xff0c;看上去就是3D效果 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head…

使用Node.js手撸一个建静态Web服务器,内部CV指南

文章里有全部代码&#xff0c;也可以积分下载操作步骤如上图文章结束 话说这个键盘真漂亮~~ 文章目录使用Node.js手撸一个建静态Web服务器一、动静态服务器的概念1.1 静态Web服务器概念1.2 静态Web服务器的优点1.3 快速搭建的途径二、 手撸指南2.1 框架搭建2.2 CtrlC/V2.3 启动…

Vue使用ElementUI对table的指定列进行合算

前言 最近有一个想法&#xff0c;就是记录自己花销的时候&#xff0c;table中有一项内容是花销的金额。然后想在table的底部有一项内容是该金额的总计。 然后我就顺着elementui的table组件寻找相关的demo&#xff0c;还真发现了一个这样的demo。 对于这个demo&#xff0c;官方…