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:不设置顶点法向量…

探讨javascript中运算符优先级

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

CentOS7 安装Python3.8

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

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

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

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

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

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;如日期、时间、数学和加密函…

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

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

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

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

内容检索(2024.02.23)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 电磁兼容理论与实…

fpga_cpu加速

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

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

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

有趣且重要的JS知识合集(19)前端实现图片的本地上传/截取/导出

input[file]太丑了&#xff0c;又不想去改button样式&#xff0c;那就自己实现一个上传按钮的div&#xff0c;然后点击此按钮时&#xff0c;去触发file上传的事件, 以下就是 原生js实现图片前端上传 并且按照最佳宽高比例展示图片&#xff0c;然后可以自定义截取图片&#xff0…

ChatGpt的初步认知(认知搬运工)

前言 ChatGpt火了有一段时间了&#xff0c;对各行各业也有了一定的渗透&#xff0c;当然发展过程中也做了一些安全约束&#xff0c;今天主要是来跟大家分享下关于chatGpt的初步认知。 一、chatGpt是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;英…

X-Rhodamine maleimide ,ROX 马来酰亚胺,实验室常用的荧光染料

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;X-Rhodamine maleimide &#xff0c;X-Rhodamine mal&#xff0c;ROX-maleimide&#xff0c;ROX 马来酰亚胺 一、基本信息 【产品简介】&#xff1a;ROX, also known as Rhodamine 101, is a product whose active …