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.passwordreturn 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' // pluginsimport './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 = falsenew Vue({el: '#app',router,store,render: h => h(App)
})

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

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

相关文章

Ubuntu20.04 查看系统版本号

目录 uname -auname -vlsb_release -acat /etc/issuecat /proc/version uname -a 查看系统发行版本号和操作系统版本 uname -v 查看版本号 lsb_release -a 查看发行版本信息 cat /etc/issue 查看系统版本 cat /proc/version 查看内核的版本号

计算机网络面经_体系结构一文说清

编辑:平平无奇的羊 目录 基础 1. 计算机网络结构体系 三种模型之间的区别: 如何背诵: 进阶 OSI七层模型: TCP/IP四层模型: TCP/IP五层模型 总结 字节实习生为大家带来的是计算机网络面经系列博文,由浅…

分散的产品开发团队

分散的产品开发团队指的是各个团队或成员在地理位置上分布在不同地方,通过互联网和现代通讯技术进行协作和沟通,以共同完成产品开发任务的团队模式。 这种团队模式的优势在于可以充分利用各地的人才资源,降低团队的管理和协作成本&#xff0…

SpringBoot和SpringCloud的区别,使用微服务的好处和缺点

SpringBoot是一个用于快速开发单个Spring应用程序的框架,通过提供默认配置和约定大于配置的方式,快速搭建基于Spring的应用。让程序员更专注于业务逻辑的编写,不需要过多关注配置细节。可以看成是一种快速搭建房子的工具包,不用从…

ThreeJS 几何体顶点position、法向量normal及uv坐标 | UV映射 - 法向量 - 包围盒

文章目录 几何体的顶点position、法向量normal及uv坐标UV映射UV坐标系UV坐标与顶点坐标设置UV坐标案例1:使用PlaneGeometry创建平面缓存几何体案例2:使用BufferGeometry创建平面缓存几何体 法向量 - 顶点法向量光照计算案例1:不设置顶点法向量…

P18 位运算

位运算是一种对二进制的位进行操作的运算方式 它直接对二进制数的每一位进行逻辑操作&#xff0c;而不考虑整个数的数组。 &与运算 |或运算 ^异运算 [相同位0 不同为1] ~取反 <<按位左移动低位补0&#xff0c;如果数据类型有符号整 5<<3 5*(2^3) >&g…

【行人检测数据集】

数据集&#xff1a; INRIA Person DataBase http://pascal.inrialpes.fr/data/human/ ftp://ftp.inrialpes.fr/pub/lear/douze/data/INRIAPerson.tar Caltech Pedestrian Detection Benchmark http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/ https://zh…

探讨javascript中运算符优先级

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 深入理解JavaScript运算符优先级运算符优先级概述示例演示示例1&#xff1a;加法和乘法运算符的优先级示…

CentOS7 安装Python3.8

在 CentOS 7 上&#xff0c;按照以下步骤安装 Python 3.8&#xff1a; 添加EPEL仓库&#xff1a;首先安装 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;仓库 sudo yum install epel-release安装Software Collections (SCL)仓库&#xff1a;随后&#xff0…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis&#xff0c;一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xf…

证件照(兼容H5,APP,小程序)

证件照由uniappuyui开发完成&#xff0c;并同时兼容H5、App、微信小程序、支付宝小程序&#xff0c;其他端暂未测试。 先看部分效果图吧具体可以下方复制链接体验demo 首页代码 <template><view class""><view class"uy-m-x-30 uy-m-b-20"…

adb push 使用

adb push命令用于将文件从本地计算机推送到Android设备。要使用adb push命令&#xff0c;需要先连接Android设备并启动ADB调试模式。以下是使用adb push命令的基本步骤&#xff1a; 打开终端&#xff08;命令提示符&#xff09;。 使用cd命令导航到存储要推送文件的文件夹。 …

R语言【ClusterR】——KMeans_rcpp()

Package ClusterR version 1.3.2 Description 使用RcppArmadillo计算k-means。 Usage KMeans_rcpp(data,clusters,num_init = 1,max_iters = 100,initializer = "kmeans++",fuzzy = FALSE,verbose = FALSE,CENTROIDS = NULL,tol = 1e-04,tol_optimal_init = 0.3,se…

Redis 事务机制之ACID属性

事务属性 事务是对数据库进行读写的一系列操作。在事务执行时提供ACID属性保证&#xff1a; 包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;…

如何申请代码签名证书?

代码签名证书是一种关键的数字证书&#xff0c;它的功能在于为软件代码提供安全签名和验证服务&#xff0c;从而提升软件整体的安全性和用户信任度。获取代码签名证书的过程通常涉及多个严谨步骤&#xff0c;确保通过正式流程获得的证书能有效加强软件完整性和真实性保护。以下…

Innodb底层原理与Mysql日志机制深入剖析

MySQL的内部组件结构 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函…

力扣hot100题解(python版10-12题)

哎- -最近本来就没时间写算法 这算法怎么还这么难。。。 10、和为 K 的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1]…

uniappQQ登录是如何实现的,请说明其流程

QQ登录功能的实现分成以下几个步骤&#xff1a; 注册QQ互联账号并创建应用&#xff0c;获取 appid 配置回调地址 recirect_uri在页面中放置 QQ登录按钮&#xff0c;点击按钮后跳转到 QQ 登录页面&#xff0c;链接地址是由 QQ 平台提供的&#xff0c;需要拼接上申请的 appid登录…

华为配置WDS手拉手业务示例

配置WDS手拉手业务示例 组网图形 图1 配置WDS手拉手业务示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。但企业考虑到AP通过有线部署的成本较高&#xff0c;所以通过建立…

Android 开发一个耳返程序(录音,实时播放)

本文目录 点击直达 Android 开发一个耳返程序程序编写1. 配置 AndroidManifast.xml2.编写耳返管理器3. 录音权限申请4. 使用注意 最后我还有一句话要说怕相思&#xff0c;已相思&#xff0c;轮到相思没处辞&#xff0c;眉间露一丝 Android 开发一个耳返程序 耳返程序是声音录入…