一、什么是Vuex

官网:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension ,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

通俗的来说,vuex是用于当某一状态需要在多个组件中共享,方便我们使用并追踪这些状态时使用。

二、Vuex的基本结构

1、安装vuex,创建store文件夹并新建index.js文件,写入:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {},getters: {},mutations: {},actions: {},modules: {}
})export default store

2、在main.js中导入,并挂载到Vue实例当中去

三、State详解

1、Vuex采用的是单一状态树模式(SSOT,simple source of truth),这个意味着在vuex中有且仅有一个实例,所有的数据都集中一个实例中,方便我们访问。
2、如果我们在state中定义一个counter,那么在多个组件中均可访问到这个counter

state: {counter:1000
},//在组件中访问
computed:{count() {return this.$store.state.counter}
},

四、Getter详解

1、Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。

state: {students:[{id: 1,name: 'wsh',score: 98},{id: 2,name: 'yj',score: 97},{id: 3,name: 'lisi',score: 87},{id: 4,name: 'zhangs',score: 89}]
},
getters: {goodStu(state){return state.students.filter(item => item.score>=90)}
},

2、Getter 会暴露为 store.getters 对象,我们可以通过属性的形式访问这些值:

//获取得分大于等于90的学生
<p>{{$store.getters.goodStu}}</p>

3、Getter 也可以接受其他 getter 作为第二个参数:

//获取得分大于等于90的学生的个数
getters: {goodStu(state){return state.students.filter(item => item.score>=90)},goodStuNum(state,getters){return getters.goodStu.length}
},
<p>{{$store.getters.goodStuNum}}</p>

4、给 Getter 传参,例如获取得分高于参数 score 的学生

moreScore(state){return function(score){return state.students.filter(item => item.score>=score)}
}
//分数大于等于88的学生
<p>{{$store.getters.moreScore(88)}}</p>

五、Mutation详解

1、更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:

mutations: {increment(state){state.counter++},decrement(state){state.counter--}
},

2、调用store.commit方法来唤醒这个回调函数

methods:{add(){this.$store.commit('increment')},sub(){this.$store.commit('decrement')}
}

2、我们可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload),在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读:

//mutations中
addStu(state,payload){state.students.push(payload)
}
//methods中
addStu(){this.$store.commit('addStu',{id: 5,name: 'kobe',score: 95})
}

3、提交 mutation 的另一种方式是直接使用包含 type 属性的对象:

//其中amount通过payload.amount取出
store.commit({type: 'increment',amount: 10
})

4、Mutation 需遵守 Vue 的响应规则: ①最好提前在你的 store 中初始化好所有所需属性。 ②当需要在对象上添加新属性时,我们应该使用 Vue.set (state.obj, ‘newProp’, 123) 。③当需要在对象上删除某属性时,我们同样不能直接使用delete方法,而是应该使用 Vue.delete (state.obj,‘oldProp’)

5、使用常量替代 Mutation 事件类型。在多人协助的大型项目中会很有帮助,可自行学习。

六、Action详解

1、首先,action主要是用于进行一些异步操作的,因为如果在mutation中进行异步操作会导致无法跟踪的问题,所以所有的异步操作都建议放到action当中去执行,但是需要注意,只要我们需要修改状态,那么都必须通过mutation。

//Action函数接受一个与 store 实例具有相同方法和属性的 context 对象
actions: {updateInfo(context){setTimeout(() => {context.commit('changeInfo')},2000)}
},
//在mutations中
changeInfo(state){state.kobe.age = 99
}
//在methods中,通过store.dispatch方法来触发Action函数
change(){this.$store.dispatch('updateInfo')
}

2、action同样支持payload载荷来传入参数

change(){this.$store.dispatch('updateInfo',{})
}

3、如果我们想知道何时结束这个异步操作,我们可以返回一个Promise:

actions: {updateInfo(context){return new Promise((resolve,reject) => {setTimeout(() => {context.commit('changeInfo')resolve("some message")},2000)})}
},
change(){this.$store.dispatch('updateInfo').then(res => {console.log(res);})
}

七、Module详解

1、由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:

const moduleA = {state:{birthday: 1999},getters:{fullBirth(state){return state.birthday + "01"},fullBirth1(state,getters){return getters.fullBirth + "10"},fullBirth2(state,getters,rootState){return getters.fullBirth1 + rootState.blessing}},mutations:{changeBirth(state,payload){state.birthday = "2000"}},actions:{updateBirth(context){setTimeout(() => {context.commit('changeBirth',{})},1000)}}
}//在store实例中
modules: {a: moduleA
}

2、state :通过store.state.a可以直接获取a模块的状态,这是因为a会被放入到store实例的state当中去:

<h2>{{$store.state.a.birthday}}</h2>

3、getter:子模块中的getters可以拥有第三个参数rootState用于获取根状态,使用如下

<h2>{{$store.getters.fullBirth}}</h2>
<h2>{{$store.getters.fullBirth1}}</h2>
<h2>{{$store.getters.fullBirth2}}</h2>

4、mutation:同样是通过store.commit提交:

this.$store.commit('changeBirth')

5、action:同样通过store.dispatch提交:

this.$store.dispatch('updateBirth')

八、总结

以上就是vuex的五大核心模块,还有一些细节可能并不完善,大家可以去官网进一步学习,如有错误欢迎大家指正。
官网指路

Vuex的基本使用及总结(超详细)相关推荐

  1. react的超详细讲解

    create-react-app 项目目录 在HTML中使用react 1 2 3基础 React的注意事项 模拟的React 和 render React组件 函数组件 类组件 React 的数据源 ...

  2. 超详细!Vue-coderwhy个人学习笔记(二)(Day3)

    前言 本文章接上一篇笔记 超详细!Vue-coderwhy个人学习笔记(一)(Day1-Day2) 这篇主要是Day3笔记,组件化,组件通信,插槽 四.组件化开发 (一).内容概述 认识组件化 注册组 ...

  3. 初用vue2写一个超简陋知乎日报(不与知乎日报api交互)超详细记录

    刚学vue,文档还没看全,写一个超简陋版知乎练手记录,因为css不太会所以很难看 会计量超详细记录,主要为做记录 包含左抽屉式导航,下拉更新,上拉加载,轮播 用到: Font Awesome muse ...

  4. 手把手带你入门前端工程化——超详细教程(高级前端必备)

    本文将分成以下 7 个小节: 技术选型 统一规范 测试 部署 监控 性能优化 重构 部分小节提供了非常详细的实战教程,让大家动手实践. 另外我还写了一个前端工程化 demo 放在 github 上.这 ...

  5. 手把手带你入门前端工程化——超详细教程

    授权自@谭光志 链接:https://segmentfault.com/a/1190000037752931,也可点击阅读原文 本文将分成以下 7 个小节: 技术选型 统一规范 测试 部署 监控 性能 ...

  6. k8s核心组件详细介绍教程(配超详细实例演示)

    本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...

  7. 手把手从零开始搭建k8s集群超详细教程

    本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...

  8. 归并排序(代码注释超详细)

    归并排序: (复制粘贴百度百科没什么意思),简单来说,就是对数组进行分组,然后分组进行排序,排序完最后再整合起来排序! 我看了很多博客,都是写的8个数据呀什么的(2^4,分组方便),我就想着,要是10 ...

  9. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  10. 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划

    作者 | 无名之辈FTER 责编 | 夕颜 出品 | 程序人生(ID:coder_life) 本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展, ...

最新文章

  1. idea工具使用总结
  2. 结构体为什么要4字节对齐
  3. easyui 常用按钮图标
  4. HDU2021 发工资咯
  5. 【opencv】16.截取图像中的一个roi区域时,判断该roi是否越界
  6. 计划策略 : 40 / 20 测试
  7. log.php(157),Log出现permission Denied的错误
  8. matplotlib图表介绍
  9. 我 “大专学历+半路转行” ,从拉垮弱鸡到测试团队骨干,走到这一步很知足
  10. 分页内存与非分页内存导致的蓝屏死机问题
  11. uniwebview按钮被无形遮挡问题
  12. 信号与系统课后题答案分享
  13. mysql中括号_如何快速学习mySQL数据库常规通配符及运算符的用法?
  14. 【Tom原创】我是这样手写Spring的,麻雀虽小五脏俱全
  15. js 前端实现打印功能
  16. Qt Quick事件处理之鼠标 键盘 定时器
  17. 关于内存类型 UDIMM、RDIMM、LRDIMM 的学习结论(转)
  18. C++试题 算法训练 相邻数对、画图
  19. a标签去下划线 菜鸟教程_HTML下划线标签示例教程
  20. Jmeter写入测试结果到excel文件中---jxl.jar

热门文章

  1. flutter入坑指南
  2. 云锁和安全狗哪个好 Bypass阿里云盾、百度云加速、安全宝、安全狗、云锁、360主机卫士SQL注入防御-系统/上网/安全
  3. 深度学习整理:detection 学习(2)——detection细节知识入门
  4. TDB和SPARQL
  5. 微信支付sdk部署在服务器,android接入微信支付SDK
  6. UE4 Chunk分块
  7. 调研:暴力恐怖犯罪识别(图像识别)
  8. 【Linux / 数据库】项目实战:tpshop项目在Linux系统环境搭建
  9. 百练 C/C++测试
  10. 教你如何管理Linux进程和任务