Vue 2.0 中的 Vuex Store 状态管理器核心概念和组成部分

Vue 2.0 中的 Vuex Store 状态管理器核心概念和组成部分

  1. State(状态):
    Vuex Store 的核心就是集中式存储应用的所有组件的状态。它是一个单一状态树,所有的组件都从这个状态树中读取数据并可以响应状态的变化。
const state = {
  count: 0,
  user: null,
  // 更多的状态...
}
  1. Getters(获取器):
    类似于 Vue 组件中的计算属性,Getters 接受 State 作为输入,并返回处理过的状态数据。它们允许你定义从 State 派生出的新状态,且当 State 改变时自动更新。
const getters = {
  formattedCount: state => `Count is ${state.count}`,
  loggedInUser: state => state.user && state.user.loggedIn ? state.user : null,
  // 更多的获取器...
}
  1. Mutations(突变)
    修改 Vuex Store 中的状态的唯一方式是通过提交 mutation。每个 mutation 都是一个纯函数,接受 State 作为第一个参数,并接收 payload 作为额外参数来修改 State。
const mutations = {
  increment(state) {
    state.count++;
  },
  setUser(state, user) {
    state.user = user;
  },
  // 更多的突变...
}
  1. Actions(动作)
    Actions 是用于触发 mutations 并包含异步操作的地方。它们通常用来执行异步逻辑(如 AJAX 请求),并在完成后提交 mutation 来改变 State。某些情况下,可能需要通过异步操作来设置某个store状态,这时可以创建一个action来处理整个过程,并在成功后调用mutation更新状态。
const actions = {
  async incrementAsync({ commit }) {
    setTimeout(() => {
      commit('increment');
    }, 1000);
  },
  fetchUser({ commit }) {
    return axios.get('/api/user')
      .then(response => {
        commit('setUser', response.data);
      });
  },
  // 更多的动作...
}
  1. Modules(模块)
    在大型应用中,Store 可以被细分为多个模块,每个模块拥有自己的 State、Getters、Mutations 和 Actions。这样有助于组织代码,使得状态管理更加清晰和可维护。
// example module
const userModule = {
  state: { ... },
  getters: { ... },
  mutations: { ... },
  actions: { ... },
}

export default new Vuex.Store({
  modules: {
    user: userModule,
    // 其他模块...
  }
})
  1. 完整应用示例
    文件结构:
    store/modules/…:被细分的模块
    store/index.js:总和被细分的模块
    store/getters.js:接受 State 作为输入,并返回处理过的状态数据, State 改变时自动更新。
    main.js:引入store并应用到vue
    请添加图片描述
    以细分模块user.js为例:
    (1)user.js
import { login, logout } from '@/api/login'  /* 自己封装的登录退出请求*/
import { getToken, setToken, removeToken } from '@/utils/auth' /*cookie管理token文件*/
const user = {
  state: {
    token: getToken(),
    userName: localStorage.getItem("userName")||'',//用户名
    permissions: [],
    isRouter:true,
    isLargeScreen:JSON.parse(localStorage.getItem("isLargeScreen")||"true"),//全屏显示驾驶舱
  },
  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    USER_NAME: (state, userName) => {
      state.userName = userName
    },
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions
    },
    IS_ROUTER: (state, isRouter) => {
      state.isRouter = isRouter
    },
    IS_LargeScreen(state, isLargeScreen){
      state.isLargeScreen = isLargeScreen
    },
    changeStateMutations1(state, data) {
    	//data:{key:需要修改的名,data:修改的内容}
    	state[data.key] = data.data;
    	if (typeof(state[data.key]) != "undefined") {
    		return true;
    	} else {
    		return false;
    	}
    },
    system_ID:(state, systemId)=>{
      state.systemId = systemId
    },
    IS_System:(state, isSystem)=>{
      state.isSystem = isSystem
    }
  },

  actions: {
    setSuperAdminType({ commit, state }, view) {
      return new Promise(resolve => {
        resolve([...state.superAdminType])
      })
    },
    // 登录
    Login({ commit }, userInfo) {
      const username = userInfo.username.trim()
      const password = userInfo.password

      return new Promise((resolve, reject) => {
        login(username, password).then(res => {
         //console.log(res.isAiAdmin,"登录返回值");
          setToken(res.content.token)
          commit('SET_TOKEN', res.content.token)
          //用户名
          localStorage.setItem("userName",res.content.userName)
          commit('USER_NAME', res.content.userName)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

    // 退出系统
    LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
        logout({token:state.token}).then(() => {
          commit('SET_TOKEN', '')
          commit('USER_NAME', [])
          removeToken()
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },

    // 前端 登出
    FedLogOut({ commit }) {
      return new Promise(resolve => {
        commit('SET_TOKEN', '')
        removeToken()
        resolve()
      })
    },
    //修改数据
    changeStateData(context, data) {
    //data:{key:需要修改的名,data:修改的内容}
      context.commit('changeStateMutations1', data)
    },
  }
}

export default user

(2)@/utils/auth(机制跟localstorage类似可以不用该文件)

import Cookies from 'js-cookie'

const TokenKey = 'Admin-cms-Token'

export function getToken() {
  return Cookies.get(TokenKey)
}

export function setToken(token) {
  return Cookies.set(TokenKey, token)
}

export function removeToken() {
  return Cookies.remove(TokenKey)
}

(3)getters.js

const getters = {
  sidebar: state => state.app.sidebar,
  size: state => state.app.size,
  device: state => state.app.device,
  visitedViews: state => state.tagsView.visitedViews,
  cachedViews: state => state.tagsView.cachedViews,
  token: state => state.user.token,
  avatar: state => state.user.avatar,
  userName: state => state.user.userName,
  introduction: state => state.user.introduction,
  permissions: state => state.user.permissions,
  permission_routes: state => state.permission.routes,
  topbarRouters:state => state.permission.topbarRouters,
  defaultRoutes:state => state.permission.defaultRoutes,
  sidebarRouters:state => state.permission.sidebarRouters,
  isRouter: state => state.user.isRouter,
  isLargeScreen:state => state.user.isLargeScreen,

}
export default getters

(4)index.js

import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import user from './modules/user'
import tagsView from './modules/tagsView'
import permission from './modules/permission'
import settings from './modules/settings'
import getters from './getters'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    app,
    user,
    tagsView,
    permission,
    settings
  },
  getters
})
export default store

(5)main.js中引入store并运用到vue上

import Vue from 'vue'

import Cookies from 'js-cookie'

import Element from 'element-ui'
import './assets/styles/element-variables.scss'

import '@/assets/styles/index.scss' // global css
import '@/assets/styles/ruoyi.scss' // ruoyi css
import './assets/icons'
import Common from "@/utils/common.js";


import App from './App'
import store from './store'
import router from './router'
import directive from './directive' // directive
import plugins from './plugins' // plugins


import './permission' // permission control
import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
// 分页组件
import Pagination from "@/components/Pagination";
//右上角菜单
import TopMenu from "@/components/topMenu";
// 自定义表格工具组件
import RightToolbar from "@/components/RightToolbar"
// 分页组件
import newInput from "@/components/newInput";

// 头部标签组件
import VueMeta from 'vue-meta'

// 全局方法挂载
Vue.prototype.parseTime = parseTime
Vue.prototype.resetForm = resetForm
Vue.prototype.addDateRange = addDateRange
Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.handleTree = handleTree

// 全局组件挂载
Vue.component('Pagination', Pagination)
Vue.component('RightToolbar', RightToolbar)
Vue.component('newInput', newInput)
Vue.component('TopMenu', TopMenu)

Vue.use(directive)
Vue.use(plugins)
Vue.use(VueMeta)
Vue.use(Common)

Vue.use(Element, {
  size: Cookies.get('size') || 'medium' // set element-ui default size
})

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式 | 简介

设计模式的重要性: 软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。 这个术语由埃里希 伽玛(Erich Gamma)等人在1…

2024,中国零售行业数字化走到哪了?

对于如今的中国零售业数字化而言,仍有许多亟待解决的问题,其像一根根“鱼刺”,卡在零售企业增长的“喉咙”中。 作者|斗斗 编辑|皮爷 出品|产业家 熙熙攘攘的人群,琳琅满目年货,一张张喜庆的春联、福字、窗花……

爬虫基本库的使用(requests库的详细解析)

注:本文一共4万多字,希望读者能耐心读完!!! 前面,我们了解了urllib库的基本用法(爬虫基本库的使用(urllib库的详细解析)-CSDN博客)。其中,确实又不方便的地方。例如处理网页验证…

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间:2024-02-19 最后编辑时间:2024-02-23 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【LeetCode每日一题】 单调栈的案例 42. 接雨水

这道题是困难,但是可以使用单调栈,非常简洁通俗。 关于单调栈可以参考单调栈总结以及Leetcode案例解读与复盘 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 …

TensorFlow2.x 精选笔记(1)数据基本操作与线性代数

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning 一、数组与张量 虽然张量看起来是复杂的对象,但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表,向量是一…

1.0 vue环境安装

1、安装node.js 1.1 下载最新版本Node.js (nodejs.org)Node.js 1.2 开始安装 普通的安装过程,也记录下吧 安装完成! 1.3 检查nodejs是否安装成功 代开cmd命令窗口输入 node -v,如果看到了刚才下载的版本号,则表示已经安装成功…

建立不同类型网站分别大概需要多少钱??

如今,越来越多的企业会考虑建立一个企业官方网站来展示企业形象,或者建立一个电子商务网站平台来拓展业务渠道,或者建立一个企业内部网来协助企业进行网上工作。 网站建设的类型有很多种,不同类型的网站成本差异很大。 因此&#…

怎么在wifi中实现手机和电脑文件互传

有时我们想手机电脑文件互传,数据线却不在身边,这时我们可以用MiXplorer来实现wifi中手机和电脑互相访问文件。 MiXplorer是一款来自著名安卓开发者论坛XDA的作品,免费且功能强大,被很多人誉为是“全能文件管理器”。 1.在手机上…

【RT-DETR有效改进】利用YOLOv9的GELAN模块替换RepC3结构(附轻量化版本 + 高效涨点版本 + 手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进RT-DETR的RepC3结构,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时…

ChatGPT plus 的平替:9个可以联网的免费AI搜索引擎

ChatGPT plus 的平替:9个可以联网的免费AI搜索引擎。 由于ChatGPT 训练数据截止到2021年9月,在该时间点之后发生的事件,ChatGPT均无法给出答复。所以,大家现在都非常期待ChatGPT能够联网,访问实时的信息。 ChatGPT pl…

【Docker】构建pytest-playwright镜像并验证

Dockerfile FROM ubuntu LABEL maintainer "langhuang521l63.com" ENV TZAsia/Shanghai #设置时区 #安装python3依赖与下载安装包 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \&& apt update \&&…

fpga_cpu加速

一 cpu流水线执行指令 二 计算机体系结构 注:ARM就是典型的哈佛结构 三 cpu加速 同样采用流水线,哈佛结构的指令效率更高,通过指令预取,提高了流水线的并行度。

Linux环境安装jira

jira 是项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 jira 软件安装包直接搜官网,然后可以选择免费的来下载: 安装 jira 之前,需要 Java 和 mysql 环境的…

深度学习中数据的转换

原始(文本、音频、图像、视频、传感器等)数据被转化成结构化且适合机器学习算法或深度学习模型使用的格式。 原始数据转化为结构化且适合机器学习和深度学习模型使用的格式,通常需要经历以下类型的预处理和转换: 文本数据&#xf…

代码随想录算法训练营第四十天|343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 链接:. - 力扣(LeetCode) 思路: 动态规划的题目虽然说是要先确定dp数组的含义,再确定递归公式,但是总感觉这两者是相辅相成的,是一起出来的,但是到此,dp数组…

运维SRE-14 自动化批量管理

1.批量管理基础内容-SSH服务-远程连接服务 1.1SSH服务 SSH服务-OpenSSH,远程连接服务端:openssh-server客户端:openssh-clients openssh-7.4p1-21.el7.x86_64 openssh-server-7.4p1-21.el7.x86_64 #服务端 openssh-clients-7.4p1-21.el7.…

BERT学习笔记

论文:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,2019 代码:[tensorflow],[pytorch] 来源:李沐精度BERT 0、摘要 与之前模型的区别: GPT考虑的是一个单向…

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测

为了满足汽车电子用户的测量需求,我司特推出汽修专用版示波器,一键测量,轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中,工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…

Promethues的Agent 模式代理转发的实施教程

目录 一、为什么需要代理转发? 二、Prometheus Agent模式的实施步骤 1、升级Prometheus的版本 2、配置B服务器的配置文件 3、启动代理点B服务器的Prometheus 4、接收端C服务器的Prometheus的安装同步骤1 5、启动接收端C服务器的Prometheus 6、验证是否能够正…