Vuex基本使用的总结
Vuex 背后的基本思想: 把组件的共享状态抽取出来,以一个全局单例模式管理,在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!
另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护。
特点:
Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
你不能直接改变 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 主要有四部分:
- state:包含了
store
中存储的各个状态。 - getter: 类似于 Vue 中的计算属性,根据其他 getter 或 state 计算返回值。
- mutation: 一组方法,是改变
store
中状态的执行者。 - 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
想要异步地更改状态,需要使用action
。action
并不直接改变state
,而是发起mutation
。
actions: {incrementAsync ({ commit }) {setTimeout(() => {commit('increment')}, 1000)}
}复制代码
发起action
的方法形式和发起mutation
一样,只是换了个名字dispatch
。
// 以对象形式分发
store.dispatch({type: 'incrementAsync',amount: 10
})复制代码
action处理异步的正确使用方式
想要使用action
处理异步工作很简单,只需要将异步操作放到action
中执行(如上面代码中的setTimeout
)。
要想在异步操作完成后继续进行相应的流程操作,有两种方式:
action
返回一个promise
。
而dispatch
方法的本质也就是返回相应的action
的执行结果。所以dispatch
也返回一个promise
。
store.dispatch('actionA').then(() => {
// ...
})
复制代码
- 利用
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 组件结合
将state
和getter
结合进组件需要使用计算属性:
computed: {count () {return this.$store.state.count // 或者 return this.$store.getter.count2}}
复制代码
将mutation
和action
结合进组件需要在methods
中调用this.$store.commit()
或者this.$store.commit()
:
methods: {changeDate () {this.$store.commit('change');},changeDateAsync () {this.$store.commit('changeAsync');}
}复制代码
为了简便起见,Vuex 提供了四个方法用来方便的将这些功能结合进组件。
mapState
mapGetters
mapMutations
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基本使用的总结相关推荐
- 【实用】Angular中如何实现类似Vuex的全局变量状态变化功能?
什么是Vuex?只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index.getters.actions.mutations ...
- 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)
前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...
- vuex+vue-router拦截
干就完了 项目中经常遇到这样一个场景,用户信息或者进行增删改的一些模块,需要根据用户是否登录,进行路由拦截,直接上代码 在store文件夹下的store.js中存放一个默认登录状态 /** store ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
- 在vue中使用vuex,修改state的值示例
1. 安装 vuex npm install vuex -S 2.在目录下创建store文件 3. 在store.js编辑一个修改state的方法 然后在mian.js中全局引入 最后在组件中使用 这 ...
- vue之mapMutaions的使用 vuex中 action 用法示例 api.js的使用
vue之mapMutations的使用 我们通过Mutation来改变store中的state,方法往往是在子组件中使用 this.$store.commit(); 来实现,但是这样的缺点是不容易查看 ...
- 基于Vue, Vuex 和 ElementUI 构建轻量单页Hexo主题Lite
Hexo Theme Lite Keep Calm, Lite and Writing. light single page blog application theme, using Vue, Vu ...
- 详解 Vue Vuex 实践
2019独角兽企业重金招聘Python工程师标准>>> 随着应用复杂度的增加,我们需要考虑如何进行应用的状态管理,将业务逻辑与界面交互相剥离,详细讨论参考笔者的2016-我的前端之路 ...
- vue总结 08状态管理vuex
状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管理库 ...
- 使用vue2.0 vue-router vuex 模拟ios7操作
其实你也可以,甚至做得更好... 首先看一下效果:用vue2.0实现SPA:模拟ios7操作 与 通讯录实现 github地址是:https://github.com/QRL909109/ios7 如 ...
最新文章
- CSS实现超过一定的宽度添加省略
- javaSE基础之记事本编程
- RxSwift 系列(一)
- git配置用户信息_git系列教程(4)-单用户配置
- 使用shell脚本或命令行添加、删除 crontab 定时任务
- 比较经典的java程序_一些经典的java小程序代码,最好能复制后直接使用的 爱问知识人...
- BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路
- java 线程不安全例子_Java中多线程安全问题实例分析
- Leetcode392.判断子序列
- MyBatis-Plus——代码自动生成器
- Spine(2d动画制作软件)绿色中文最终优化版V3.8.75 | spine动画软件下载
- 计算机专业建设委员会会议记录,第一次专业建设工作会议纪要
- Java体检系统名称_求购体检中心管理系统JAVA WEB源码
- Flutter Scaffold的详细解说
- 在centos7下安装云锁
- 基于AVpro视频播放器的展馆视频播放
- 哪些人适合读博士?哪些人不适合读博士?
- win10系统网络连接只显示飞行模式
- 超市信息管理系统的测试用例
- leetcode top interview题目补充
热门文章
- np.nan np.NAN np.NaN
- 人体骨骼关键点检测综述
- 2013第四届蓝桥杯C/C++ B组省赛
- Matlab迭代算法实现
- 关于博客笔记大汇总,持续更新迭代
- LintCode 661. 把二叉搜索树转化成更大的树
- Android的启动流程
- matlab图形与动画设计 pdf,MATLAB图形与动画设计
- pandas数据日期函数之date_range()、resample()与to_period()
- review代码从哪些角度_CodeReview正确的姿势是什么?