[vuex]状态管理vuex
vuex
状态管理vuex,之前一般都是通过一个全局js文件实现全局设置,在vue中通过vuex进行管理
简介
vuex是专为vue.js应用程序开发的状态管理模式。它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。vuex也集成到了官方调试工具devtools extension,提供了诸如零配置的time-travel调试、状态快照导入导出等高级调试功能。
“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:
Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们通过一些工具帮助我们更好地了解我们的应用
核心内容
状态管理有5个核心,分别是state、getter、mutation、action以及module。分别简单的介绍一下它们:
1、state
state为单一状态树,在state中需要定义我们所需要管理的数组、对象、字符串等等,只有在state状态树中定义过,在vue.js的组件中才能获取你定义的对象的状态。
2、getter
getter有点类似vue.js的计算属性,当我们需要从store的state中派生出一些状态,那么我们就需要使用getter,getter会接收state作为第一个参数,而且getter的返回值会根据它的依赖被缓存起来,只有getter中的依赖值(state中的某个需要派生状态的值)发生改变的时候才会被重新计算。
3、mutation
更改store中state状态的唯一方法就是提交mutation,就类似事件。每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中改变。我们要执行这个回调函数,那么我们需要执行一个相应的调用方法:store.commit。
4、action
action可以提交mutation,在action中可以执行store.commit,而且action中可以有任何的异步操作。在页面中如果我们要调用这个action,则需要执行store.dispatch
5、module
module其实只是解决了当state中很复杂臃肿的时候,module可以将store分割成模块,每个模块中拥有自己的state、mutation、action和getter。
使用
使用vue/cli初始化项目的时候选择vuex
或者之后引入:
npm install vuex --save
版本:
“vuex”: “^4.0.2”
而后建立一个store文件夹,建立一个index.js
store/index.js
默认的创建状态管理的文件
import {createStore} from "vuex";
export default createStore({state: {//全局状态typeList: [],formVisible: false,formIndex: null,projectList: []},//被多次使用的状态的处理结果,可以添加getters的处理方法getters: {getProjectList: state => {return state.projectList.filter(item => item.pageURL !== '')},},//触发状态直接发生变化mutations: {typeListAsync(state, data) {state.typeList = data;},changeFormVisible(state, index) {state.formIndex = index;state.formVisible = !state.formVisible;},projectListAsync(state, data) {state.projectList = data;}},//触发异步的状态变化actions: {async typeListAsync(context) {//typeListAsync({commit})// return context.commit('typeListAsync', ["sams"])return http.get("/modules", {file: 'modules',}, (res) => {context.commit('typeListAsync', res.data);})},async changeProjectAsync(context, param) {param.file = 'project';console.log("changeProjectAsync", param);return http.post("/operation", param, (res) => {context.commit('projectListAsync', res.data);})},async getProjectListAsync(context) {// return context.commit('typeListAsync', ["sams"])//异步 aixos 异步return http.get("/search", {file: 'project',}, (res) => {console.log("getProjectListAsync");context.commit('projectListAsync', res.data);})}},modules: {}
});
vue2.x一般通过以下方式引入vue的实例
new Vue({router,store,render: h => h(App)
}).$mount("#app");
vue3.x一般通过以下方式引入vue的实例
createApp(App).use(store).mount("#app")
以下对于vuex的应用主要是vue2.x的用法,在vue3中需要将this.$store
换成:
//vue2.x
//this.$store.state.formVisible
//vue3.x
import { useStore } from 'vuex';
const store = useStore();
store.state.formVisible
store/index.js 文件说明
需要管理的状态,也即以前的需要全局维护的变量,这里主要是维护组件之间都需要使用的数据
获取store中的state值
页面中获取status的值可以直接通过以下方式获取
this.$store.state.formVisible
但是依赖state的值获取到的结果,必须在页面中的计算属性computed中获取,以实现响应性,否则当state对应值发生变化的时候无法正常获取到变化的值,页面没有对应更新,上述取值不可直接使用
computed: {getVisible() {return !this.$store.state.formVisible;}
}
获取store中的state值的处理结果–getters
该方式主要是用于多次获取需要使用特殊处理的state的值getters
:
被多次使用的状态state的处理结果,可以添加getters的处理方法
通过在getters中添加方法,可以使得每次state变更触发对应的getter方法,否则就使用之前的缓存即可
页面中获取status的值可以直接通过以下方式获取
this.$store.state.formVisible
但是如果想保证state的响应性,必须通过计算属性computed中获取,否则当state对应值发生变化的时候无法正常获取到变化的值,页面没有对应更新
computed: {getProjectList() {//return this.$store.state.typeList; 若是不需要处理return this.$store.getters.getProjectList;//需要处理}
}
store.state.prop不可以直接使用在.vue文件的template中,必须通过computed 引用以保留响应性
同步更改store中的state值-mutations
vuex在mutations中直接改变状态中state的值
mutations 中修改state值
mutations: {typeListAsync(state, data) {state.typeList = data;},}
触发store中的mutations方法
页面中通过以下方式触发mutations中的方法:
this.$store.commit(“typeListAsync”);
如果存在参数,直接传递即可
this.$store.commit(“typeListAsync”,null);
mutation 都是同步事务,因此如果存在异步事务,需要处理异步事务的action
异步更改store中的state值-action
action 类似于 mutation,不同在于:
- action 提交 mutation,由mutation改变状态值,而不是直接变更状态值。
- action 可以包含任意
异步
操作。
action 中修改state值
在action方法中通过以下方式触发mutation的方法进行state的值变更
context.commit('projectListAsync',data);
触发store中的action方法
页面中通过以下方式触发action中的方法:
this.$store.dispatch("changeProjectAsync");
如果存在参数,直接传递即可
this.$store.dispatch("changeProjectAsync",param);
store中的action之间的触发
context.dispatch('getUserMenus')
actions: {async login(context, param) {//异步 aixos 异步return http.post(`/login`, param).then((res: any) => {context.dispatch('getUserMenus')})},async logout(context) {return http.get(`/logout`).then((res: any) => {})},async getUserMenus(context) {return http.get('vvvvv/vv').then((res: any) => {})}},
多模块需要状态管理
modules,是多模块时使用的,一般简单的项目不需要使用
vue2.x的应用
设置多模块的时候用于确定当前option是否使用命名空间namespaced:true
modules
export default {namespaced:true,//设置多模块的时候用于确定当前option是否使用命名空间state: {post:""},getters: {},mutations: {},actions: {}
}
引入modules,正常的store文件中添加
import postModules from '/xxx'
export default new Vuex.Store( {state: {},getters: {},mutations: {},actions: {},modules: {postModules}
})
vue3.x的应用
modules:
export default {state: {post:""},getters: {},mutations: {},actions: {}
}
引入modules,正常的store文件中添加
import postModules from '/xxx'
export default createStore({state: {},getters: {},mutations: {},actions: {},modules: {user:postModules}
}
获取多模块的状态值
import {mapGetters,mapState} from 'vuex'computed:{
...mapGetters("postModules",['post'])
}computed:{
...mapState(["stateName"])//引用 stateName 为计算属性...mapState({anotherName:"stateName",anotherName:state=>state.stateName,//引用 默认 store的属性anotherName:state=>state.moduleName.stateName,//引用store 多模块内的属性
})//引用store中state的 stateName 计算属性,并重命名...mapState("moduleName",["stateName"])//引用store中多模块state的 stateName 计算属性...mapState("moduleName",{//引用store中多模块state的 stateName 计算属性,并重命名anotherName:"stateName",anotherName:state=>state.stateName
})...mapGetters("moduleName",["FunctionName"]),
...mapActions("moduleName",["FunctionName"]),getStateProp(){return this.$store.state.modulesName["stateProp"]//可以取到多模块state的值
}getStateProp(){return this.$store.state.stateProp//可以取到state值
}getModuleGetter(){//this.$store.getters.modulesName["gettersProps"]//该方式无法取值//只能使用该方式return this.$store.getters["modulesName/gettersProps"]
}
}
触发更改state值
this.$store.dispatch("modulesName/changeProjectAsync");
namespaced 的 module模块获取根store中的值
export default {namespaced:true,//设置多模块的时候用于确定当前option是否使用命名空间state: {post:""},getters: {getRoot(state,getters,rootState){return `${ rootState.typeList }`}},mutations: {},actions: {function(state,getters,rootState){}}
}
[vuex]状态管理vuex相关推荐
- vue状态管理存取数据_vue状态管理vuex从浅入深详细讲解
1.vuex简介以及创建一个简单的仓库 vuex是专门为vue框架而设计出的一个公共数据管理框架,任何组件都可以通过状态管理仓库数据沟通,也可以统一从仓库获取数据,在比较大型的应用中,数据交互庞大的情 ...
- Vue状态管理vuex
转: https://www.cnblogs.com/xiaohuochai/p/7554127.html 前面的话 由于多个状态分散的跨越在许多组件和交互间各个角落,大型应用复杂度也经常逐渐增长.为 ...
- Vuex 状态管理的工作原理
Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...
- vue2项目复习01-关闭elint检校,src文件别名,路由传参的对象写法,代理解决跨域问题,nprogress,vuex状态管理库,store的模块式开发,节流与防抖,编程式导航+事件委托路由跳转
1.关闭elint语法校验 创建vue.config.js //关闭elint语法校验 {lintOnSave:false; } 2.src文件夹配置别名 jsconfig.json配置别名 @代表s ...
- 【3D商城】使用Vuex状态管理完成购物车模块
[3D商城]使用Vuex状态管理完成购物车模块 创建购物车的全局数据 添加产品到购物车 导航栏的购物车模块 结果 常见问题总结 创建购物车的全局数据 在store的index.js中 ,创建购物车变量 ...
- Vue项目 成员管理系统 Vuex状态管理(10)
Vuex是一个专为Vue.js应用程序开发的状态管理模式.它采用集中式储存管理应用的所有组件的转台并以相应的规则保证装填以一中可预测的方式发生变化. Vuex可以将组件中的某些属性.值或者方法拿出来统 ...
- 在vue项目中引用vuex状态管理工具
在vue项目中引用vuex状态管理工具 一.vuex是什么? 二.使用步骤 1.引入库 2.在main.js文件引入配置 3.配置store/index.js文件 4.获取state数据 5.获取ge ...
- 【vuex状态管理案例mutations和actions区别】
目录 vuex 状态管理 传统组件传值的缺点 案例 加减 效果 现在我们希望它是两个计数器的数同时加加减~ 先来看一下减的 父组件 子组件 加的是一样的逻辑哦 虽然这样可以实现我们想要的效果但是,还是 ...
- vuex状态管理,用最朴实的话讲解最难懂的技术,
一.案例演示 引入vuex 1.利用npm包管理工具,进行安装 vuex.在控制命令行中输入下边的命令就可以了. npm n install vuex --save 需要注意的是这里一定要加上 –sa ...
最新文章
- 一周焦点 | 最强AI芯片麒麟980发布;前端开发者将被取代?
- 性能指标TP99之我解
- QT的QDomElement类的使用
- 编辑函数求n阶乘fact_n!函数用C语言其实可以这样!
- 缴纳满15年养老保险退休金每月1200块钱左右,值得缴吗?
- Oracle 给字符串补空格、补0
- Luogu P1164小A点菜
- 【图像特征提取1】方向梯度直方图HOG---从理论到实践------附带积分图像的解析
- ffmpeg视频播放流程
- Python 函数(一)
- 5-3 面向可维护性的构造技术
- OTT 端性能优化建设之 Weex 实践之路
- 计算机基础教程2 - 计算机发展历程
- 使用Instsrv.exe和Srvany.exe 安装windows服务
- QNX分布式实时操作系统初步认识-QNX系统了解认识
- 【xinfanqie】熟知针式与喷墨打印机之间的区别
- linux ubuntu开放端口查看,ubuntu/linux下查看端口使用情况
- mysql8安装错误,Windows安装MySQL8.0.16 的步骤及出现错误问题解决方法
- 原生Python实现KNN算法,并用鸢尾花(iris)数据集测试
- LeetCode162数组寻峰问题
热门文章
- 启动Tomcat 服务器的两种方式
- 交换机、路由器、VLAN、网关
- php 自带模板标记,关于模板标记的9篇文章推荐
- 航拍深圳大运中心体育馆全景,从2018年到2021年分享
- [Android] 单独编译生成boot.img时mkbootfs: No such file or directory解决方法
- 2021-2027全球与中国单晶圆加工设备市场现状及未来发展趋势
- 单向Boost PFC+全桥LLC串联谐振开关电源Matlab/simulink仿真模型 2kw功率,输出48V,谐振频率100k
- 如何将PPT转成Word?教你3种免费的方法
- 【C语言】打印99乘法表
- 百度网盘android 2.0以上,可满速下载的百度云,终于发布手机App(含电脑版/手机版)...