Vuex 背后的基本思想: 把组件的共享状态抽取出来,以一个全局单例模式管理,在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!

另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护。

特点:

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用

使用

在 Vue 的单页面应用中使用,需要使用Vue.use(Vuex)调用插件。
使用非常简单,只需要将其注入到Vue根实例中。

import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({state: {count: 0},
getter: {doneTodos: (state, getters) => {return state.todos.filter(todo => todo.done)}},mutations: {increment (state, payload) {state.count++}},
actions: {addCount(context) {// 可以包含异步操作// context 是一个与 store 实例具有相同方法和属性的 context 对象}
}
})
// 注入到根实例
new Vue({el: '#app',store,template: '<App/>',components: { App }
})复制代码

然后改变状态:

this.$store.commit('increment')复制代码

Vuex 主要有四部分:

  1. state:包含了store中存储的各个状态。
  2. getter: 类似于 Vue 中的计算属性,根据其他 getter 或 state 计算返回值。
  3. mutation: 一组方法,是改变store中状态的执行者。
  4. action: 一组方法,其中可以含有异步操作

state

Vuex 使用 state来存储应用中需要共享的状态。为了能让 Vue 组件在 state更改后也随着更改,需要基于state创建计算属性。

const Counter = {template: `<div>{{ count }}</div>`,computed: {count () {return this.$store.state.count  // count 为某个状态}}
}复制代码

getters

类似于 Vue 中的 计算属性,可以在所以来的其他 state或者 getter改变后自动改变。
每个getter方法接受 state和其他getters作为前两个参数

getters: {doneTodos: (state, getters) => {return state.todos.filter(todo => todo.done)}}复制代码

mutations

前面两个都是状态值本身,mutations才是改变状态的执行者。mutations用于同步地更改状态

// ...
mutations: {increment (state, n) {state.count += n}
}复制代码

其中,第一个参数是state,后面的其他参数是发起mutation时传入的参数。

this.$store.commit('increment', 10)复制代码

commit方法的第一个参数是要发起的mutation名称,后面的参数均当做额外数据传入mutation定义的方法中。
规范的发起mutation的方式如下:

store.commit({type: 'increment',amount: 10   //这是额外的参数
})复制代码

额外的参数会封装进一个对象,作为第二个参数传入mutation定义的方法中。

mutations: {increment (state, payload) {state.count += payload.amount}
}复制代码

actions

想要异步地更改状态,需要使用actionaction并不直接改变state,而是发起mutation

actions: {incrementAsync ({ commit }) {setTimeout(() => {commit('increment')}, 1000)}
}复制代码

发起action的方法形式和发起mutation一样,只是换了个名字dispatch

// 以对象形式分发
store.dispatch({type: 'incrementAsync',amount: 10
})复制代码

action处理异步的正确使用方式

想要使用action处理异步工作很简单,只需要将异步操作放到action中执行(如上面代码中的setTimeout)。
要想在异步操作完成后继续进行相应的流程操作,有两种方式:

  1. action返回一个 promise
    dispatch方法的本质也就是返回相应的action的执行结果。所以dispatch也返回一个promise
store.dispatch('actionA').then(() => {
// ...
})
复制代码
  1. 利用async/await。代码更加简洁。
// 假设 getData() 和 getOtherData() 返回的是 Promiseactions: {async actionA ({ commit }) {commit('gotData', await getData())},async actionB ({ dispatch, commit }) {await dispatch('actionA') // 等待 actionA 完成commit('gotOtherData', await getOtherData())}
}复制代码

各个功能与 Vue 组件结合

stategetter结合进组件需要使用计算属性

computed: {count () {return this.$store.state.count // 或者 return this.$store.getter.count2}}
复制代码

mutationaction结合进组件需要在methods中调用this.$store.commit()或者this.$store.commit():

methods: {changeDate () {this.$store.commit('change');},changeDateAsync () {this.$store.commit('changeAsync');}
}复制代码

为了简便起见,Vuex 提供了四个方法用来方便的将这些功能结合进组件。

  1. mapState
  2. mapGetters
  3. mapMutations
  4. mapActions

示例代码:

import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'// ....
computed: {localComputed () { /* ... */ },...mapState({// 为了能够使用 `this` 获取局部状态,必须使用常规函数count(state) {return state.count + this.localCount}}),...mapGetters({getterCount(state, getters) {return state.count + this.localCount}})
}
methods: {...mapMutations({add: 'increment' // 将 `this.add()` 映射为`this.$store.commit('increment')`}),...mapActions({add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`})
}
复制代码

如果结合进组件之后不想改变名字,可以直接使用数组的方式。

methods: {...mapActions(['increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`// `mapActions` 也支持载荷:'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`]),
}复制代码

将 store分割为模块。

可以将应用的store分割为小模块,每个模块也都拥有所有的东西:state, getters, mutations, actions
首先创建子模块的文件:

// initial state
const state = {added: [],checkoutStatus: null
}
// getters
const getters = {checkoutStatus: state => state.checkoutStatus
}
// actions
const actions = {checkout ({ commit, state }, products) {}
}
// mutations
const mutations = {mutation1 (state, { id }) {}
}
export default {state,getters,actions,mutations
}
复制代码

然后在总模块中引入:

import Vuex from 'vuex'
import products from './modules/products' //引入子模块Vue.use(Vuex)
export default new Vuex.Store({modules: {products   // 添加进模块中}
})
复制代码

其实还存在命名空间的概念,大型应用会使用。需要时查看文档即可。Vuex的基本使用大致如此。

参考

https://www.jianshu.com/p/aae7fee46c36

https://vuex.vuejs.org/zh/guide/modules.html

转载于:https://juejin.im/post/5b573babf265da0fa50a1cad

Vuex基本使用的总结相关推荐

  1. 【实用】Angular中如何实现类似Vuex的全局变量状态变化功能?

    什么是Vuex?只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index.getters.actions.mutations ...

  2. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)

    前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...

  3. vuex+vue-router拦截

    干就完了 项目中经常遇到这样一个场景,用户信息或者进行增删改的一些模块,需要根据用户是否登录,进行路由拦截,直接上代码 在store文件夹下的store.js中存放一个默认登录状态 /** store ...

  4. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  5. 在vue中使用vuex,修改state的值示例

    1. 安装 vuex npm install vuex -S 2.在目录下创建store文件 3. 在store.js编辑一个修改state的方法 然后在mian.js中全局引入 最后在组件中使用 这 ...

  6. vue之mapMutaions的使用 vuex中 action 用法示例 api.js的使用

    vue之mapMutations的使用 我们通过Mutation来改变store中的state,方法往往是在子组件中使用 this.$store.commit(); 来实现,但是这样的缺点是不容易查看 ...

  7. 基于Vue, Vuex 和 ElementUI 构建轻量单页Hexo主题Lite

    Hexo Theme Lite Keep Calm, Lite and Writing. light single page blog application theme, using Vue, Vu ...

  8. 详解 Vue Vuex 实践

    2019独角兽企业重金招聘Python工程师标准>>> 随着应用复杂度的增加,我们需要考虑如何进行应用的状态管理,将业务逻辑与界面交互相剥离,详细讨论参考笔者的2016-我的前端之路 ...

  9. vue总结 08状态管理vuex

    状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管理库 ...

  10. 使用vue2.0 vue-router vuex 模拟ios7操作

    其实你也可以,甚至做得更好... 首先看一下效果:用vue2.0实现SPA:模拟ios7操作 与 通讯录实现 github地址是:https://github.com/QRL909109/ios7 如 ...

最新文章

  1. CSS实现超过一定的宽度添加省略
  2. javaSE基础之记事本编程
  3. RxSwift 系列(一)
  4. git配置用户信息_git系列教程(4)-单用户配置
  5. 使用shell脚本或命令行添加、删除 crontab 定时任务
  6. 比较经典的java程序_一些经典的java小程序代码,最好能复制后直接使用的 爱问知识人...
  7. BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路
  8. java 线程不安全例子_Java中多线程安全问题实例分析
  9. Leetcode392.判断子序列
  10. MyBatis-Plus——代码自动生成器
  11. Spine(2d动画制作软件)绿色中文最终优化版V3.8.75 | spine动画软件下载
  12. 计算机专业建设委员会会议记录,第一次专业建设工作会议纪要
  13. Java体检系统名称_求购体检中心管理系统JAVA WEB源码
  14. Flutter Scaffold的详细解说
  15. 在centos7下安装云锁
  16. 基于AVpro视频播放器的展馆视频播放
  17. 哪些人适合读博士?哪些人不适合读博士?
  18. win10系统网络连接只显示飞行模式
  19. 超市信息管理系统的测试用例
  20. leetcode top interview题目补充

热门文章

  1. np.nan np.NAN np.NaN
  2. 人体骨骼关键点检测综述
  3. 2013第四届蓝桥杯C/C++ B组省赛
  4. Matlab迭代算法实现
  5. 关于博客笔记大汇总,持续更新迭代
  6. LintCode 661. 把二叉搜索树转化成更大的树
  7. Android的启动流程
  8. matlab图形与动画设计 pdf,MATLAB图形与动画设计
  9. pandas数据日期函数之date_range()、resample()与to_period()
  10. review代码从哪些角度_CodeReview正确的姿势是什么?