本文主要记录使用vuex的使用场景、重要组成部分和学习心得。

1、说在前面

学习vue有两周的时间了,目前已经对vue的基础使用比较熟悉了。但是一直对vuex的使用耿耿于怀,这么说是因为总是不太理解,还好经过实践和深入阅读官网后现在总算有了一定的掌握,这里做一下学习笔记和使用心得。

2、什么是vuex

vuex是vue的状态管理模式,它集中管理所有组件的共享状态,并且有自己的规则,比如怎么修改状态的值,怎么获取状态的值,是以一种可预测的方式来监听状态的改变。

3、为什么要使用vuex

我们知道,组件的通信(单向数据流)有两种:

  • 1、父->子通信,通过props
  • 2、子->父通信,通过触发$emit的方法

    那么,兄弟组件的通信呢?(当然简单的也可以通过子->父->子的方法传递,但是还是比较麻烦的),那么不相关的组件之间的通信呢?这就是vuex存在的主要意义。用官网上的话就是解决:
  • 1、多个视图依赖同一个状态
  • 2、来自不同视图的行为变更同一个状态

4、vuex的组成

State

state中定义共享的状态值

  1. //state.js
  2. export default state = {
  3. count: 0
  4. }

获取state的值,需要放在计算属性中,保证每次state能够响应式的获取

  1. computed:{
  2. count(){
  3. return this.$stores.state.count //获取值
  4. }
  5. }

这种获取方式是比较繁琐的,因此vuex给我们提供的对应的语法糖 mapState,便于我们简洁性的获取值

  1. import { mapState } from 'vuex'
  2. export default{
  3. computed:{
  4. ...mapState(['count']) //这样我们在组件就可以通过this.count获取对应的值了
  5. }
  6. }

Getter

state的派生状态值,可以理解成是store的计算属性,它一般是一个方法,方法接受一个参数state

  1. //getter.js
  2. export default {
  3. getCount: state => state.count + 1
  4. }

它的辅助函数是mapGetter,一般也放在computed里

  1. import { mapGetters } from 'vuex'
  2. export default {
  3. computed: {
  4. // 使用对象展开运算符将 getter 混入 computed 对象中
  5. ...mapGetters(['getCount'])
  6. }
  7. }

Mutation

vuex规定更改state的值唯一方法是提交 mutation,原因是为了能够明确的追踪状态的变化,它接受2个参数(state,newVal),第二个参数可以是字符串也可以是对象

  1. //mutations.js
  2. export default {
  3. setCount(state,newVal){
  4. state.count = newVal
  5. }
  6. }

必须通过commit的方法触发调用它

  1. this.$store.commit('setCount',20) //此时你把state中的count的值变成了20

它的辅助函数是mapMutations,它一般放在methods中

  1. import { mapMutations } from 'vuex'
  2. export default {
  3. methods: {
  4. ...mapMutations(['setCount'])
  5. }
  6. }

在 Vuex 中,mutation 都是同步事务,不可写入异步操作

Action

Action 类似于 mutation,它主要用于:

  • 批量的同步操作
  • 异步操作

    它接受一个store 实例具有相同方法和属性的 context 对象,注意它提交的是 mutation,而不是直接变更状态
  1. //actions.js
  2. export default {
  3. increment(context){
  4. context.commit('setCount')
  5. }
  6. }

在实践中可以通过参数解构的方法简化代码

  1. increment({commit}){
  2. commit('setCount')
  3. }

在组件中通过分发dispatch的方法来触发action

  1. this.$store.dispatch('increment')

这样做的目的是为了可以在action的内部执行异步操作(比如通过接口请求后才更改state的值)

  1. increment({commit}){
  2. setTimeout(()=>{
  3. commit('setCount')
  4. },1000)
  5. }

也可以同步批量更改state中的值

  1. increment({commit}){
  2. commit('mutation1')
  3. commit('mutation2')
  4. commit('mutation3')
  5. }

它的辅助函数是mapActions,一般放在methods中

  1. import { mapActions } from 'vuex'
  2. export default {
  3. methods: {
  4. ...mapActions(['increment']) //将 this.increment() 映射为 this.$store.dispatch('increment')
  5. }
  6. }

action的返回接收,可以返回一个Promise

  1. export default{
  2. actionA ({ commit }) {
  3. return new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. commit('someMutation')
  6. resolve()
  7. }, 1000)
  8. })
  9. }
  10. }

数据接受后处理

  1. this.$store.dispatch('actionA').then(() => {
  2. // ...
  3. })

5、vuex的定义

我们一般会在src目录下建立一个名为store的文件夹专门放vuex的文件,目录里存放

  • state.js:所有需要管理的状态
  • getters.js:所有需要更派生的状态
  • mutations.js :所有需要更改状态的方法
  • actions.js: 所有需要异步或批量同步更改状态的方法
  • index.js: 主入口文件

    代码
  1. import Vue from 'vue'
  2. import VueX from 'vuex'
  3. import States from './state'
  4. import Getters from './getters'
  5. import Mutations from './mutations'
  6. import Actions from './actions'
  7. Vue.use(Vuex)
  8. export default nex Vuex.Store({
  9. State,
  10. Getters,
  11. Mutations,
  12. Actions
  13. })

然后在根目录下的main.js中全局引入

  1. import store from './store'
  2. new Vue({
  3. el: '#app',
  4. router,
  5. store, //在这里
  6. template: '<App/>',
  7. components: {
  8. App
  9. }
  10. })

6、总结

总的来说,当把所有的应用梳理一遍后vuex也没有那么的高深莫测,一切源于实践吧!实践比直接阅读或看文档更加的印象深刻。当然,还有一些应用官网上说的很明确,这里不在重述。比如:

vuex深入浅出的更多相关文章

  1. 5分钟让你掌握Vuex,深入浅出

    5分钟让你掌握Vuex,深入浅出 一.什么是Vuex? 概念:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预 ...

  2. 深入浅出的webpack4构建工具--webpack4+vue+vuex+mock模拟后台数据(十九)

    mock的官网文档 mock官网 关于mockjs的优点,官网这样描述它:1)可以前后端分离.2)增加单元测试的真实性(通过随机数据,模拟各种场景).3)开发无侵入(不需要修改既有代码,就可以拦截 A ...

  3. 深入浅出的webpack4构建工具--webpack4+vue+route+vuex项目构建(十七)

    阅读目录 一:vue传值方式有哪些? 二:理解使用Vuex 三:webpack4+vue+route+vuex 项目架构 回到顶部 一:vue传值方式有哪些? 在vue项目开发过程中,经常会使用组件来 ...

  4. 一篇文章带你深入浅出Vuex

    在写Vuex之前,我们先用一个简单的例子来实现一个小demo 大家都知道Vue的父传子用在很多场景,比如像这样: 父组件: <template> <div id="app& ...

  5. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库

    应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...

  7. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. vuex复习方案

    这次复习vuex,发现官方vuex2.0的文档写得太简略了,有些看不懂了.然后看了看1.0的文档,感觉很不错.那以后需要复习的话,还是先看1.0的文档吧.

  9. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

随机推荐

  1. P2925 [USACO08DEC]干草出售Hay For Sale 题解

    \(\Huge{dp第一题}\) 题目描述 农民john面临一个很可怕的事实,因为防范失措他存储的所有稻草给澳大利亚蟑螂吃光了,他将面临没有稻草喂养奶牛的局面.在奶牛断粮之前,john拉着他的马车到农 ...

  2. SDUT OJ 顺序表应用6:有序顺序表查询

    顺序表应用6:有序顺序表查询 Time Limit: 1000 ms Memory Limit: 4096 KiB Submit Statistic Discuss Problem Descripti ...

  3. 首字母变大写(stringstream的应用)

    Problem Description 输入一个英文句子,将每个单词的第一个字母改成大写字母.   Input 输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行.   O ...

  4. 【webservice】Two classes have the same XML type name(转)

    引言 需要调用另一个系统的提供的webservice接口,但是调用之后总是报错,用SoapUI测试接口却没有问题: 那就应该是代码的问题了,但是同样的代码也调用过其他系统却没有问题,不过最终还是解决了 ...

  5. redis mac安装配置

    去官网下载redis. 解压后 终端cd 至目标文件夹 编译测试: sudo make test 编译安装: sudo make install 输入redis-server启动服务 停止 redis ...

  6. C++_函数4-函数重载与函数模板

    函数重载 多个函数,函数名相同,但是调用的时候,参数不同. 函数多态是C++在C语言的基础上新增的功能.多态指的是有多种形式,因此函数多态允许函数可以有多种形式.术语“函数重载”指的是可以有多个同名的 ...

  7. ZOJ Monthly, January 2019 Little Sub and his Geometry Problem ZOJ4082(模拟 乱搞)

    在一次被自己秀死... 飞机 题目: 给出N,K, Q; 给出一个N*N的矩阵  , 与K个特殊点 , 与Q次查询 , 每次查询给出一个C , 问 在这个N*N矩阵中 , 有多少的点是满足这样的一个关 ...

  8. vue控制父子组件渲染顺序

    在父组件中,如下图渲染子组件,那如何在父组件中加入一些数据获取逻辑且能控制子组件渲染呢. 就是像在上图中红框圈起来的那样,挂个 ok(其他你自己定义的也可以) 参数,同时在父组件的任何生命周期中去改变 ...

  9. UVA - 11552 DP 划分

    每k个字符划分一个组,该组内字符顺序可以任意重排,定义块为最长的连续的字符子串,求长度为m*k的字符串中最少的块的数目 设\(dp[i][j]\):前\(i\)组中第\(i\)组结尾为\(j\)的最优 ...

  10. PHP_$_SERVER中QUERY_STRING,REQUEST_URI的用法

    $_SERVER存储当前服务器信息,其中有几个值如 $_SERVER["QUERY_STRING"], $_SERVER["REQUEST_URI"], $_S ...