一、基本用法

1. 初始化并创建一个项目

1
2
3
vue init webpack-simple vuex-demo
cd vuex-demo
npm install

2. 安装 vuex

1
npm install vuex -S

3. 在 src 目录下创建 store.js 文件,并在 main.js 文件中导入并配置

store.js 中写入

1
2
3
4
import Vue from 'vue'
//引入 vuex 并 use
import Vuex from 'vuex'
Vue.use(Vuex)

main.js 文件

1
2
3
4
5
6
7
8
9
10
import Vue from 'vue'
import App from './App.vue'
import store from './assets/store' //导入 store 对象
 
new Vue({
 //配置 store 选项,指定为 store 对象,会自动将 store 对象注入到所有子组件中,在子组件中通过 this.$store 访问该 store 对象
 store,
 el: '#app',
 render: h => h(App)
})

4. 编辑 store.js 文件

在应用 vuex 之前,我们还是需要看懂这个流程图,其实很简单。

vuex

① Vue Components 是我们的 vue 组件,组件会触发(dispatch)一些事件或动作,也就是图中的 Actions;
② 我们在组件中发出的动作,肯定是想获取或者改变数据的,但是在 vuex 中,数据是集中管理的,我们不能直接去更改数据,所以会把这个动作提交(Commit)到 Mutations 中;
③ 然后 Mutations 就去改变(Mutate)State 中的数据;
④ 当 State 中的数据被改变之后,就会重新渲染(Render)到 Vue Components 中去,组件展示更新后的数据,完成一个流程。

Vuex 的核心是 Store(仓库),相当于是一个容器,一个 Store 实例中包含以下属性的方法:

state 定义属性(状态 、数据)

store.js 中写入

1
2
3
4
5
6
7
8
9
10
11
// 定义属性(数据)
var state = {
 count:6
}
// 创建 store 对象
const store = new Vuex.Store({
 state
})
 
// 导出 store 对象
export default store;

方式1、 在 app.vue 中就能通过 this.$store 访问该 store 对象 ,获取该 count 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template>
 <div id="app">
 //把 count 方法直接写入,可自己执行
 <h1>{{count}}</h1>
 </div>
</template>
 
<script>
export default {
 name: 'app',
 computed:{
 count(){
  //返回获取到的数据
  return this.$store.state.count
 }
 }
}
</script>

方式2、vuex 提供的 mapGetters 和 mapActions 来访问

mapGetters 用来获取属性(数据)

① 在 app.vue 中引入 mapGetters

1
import {mapGetters} from 'vuex'

② 在 app.vue 文件的计算属性中调用 mapGetters 辅助方法,并传入一个数组,在数组中指定要获取的属性  count

1
2
3
4
5
6
7
8
9
10
<script>
import {mapGetters,mapActions} from 'vuex'
export default {
 name: 'app',
 computed:mapGetters([
 //此处的 count 与以下 store.js 文件中 getters 内的 count 相对应
 'count'
 ])
}
</script>

③ 在 store.js 中定义 getters 方法并导出

getters 用来获取属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
// 定义属性(数据)
var state = {
 count:6
}
// 定义 getters
var getters={
 //需要传个形参,用来获取 state 属性
 count(state){
  return state.count
 }
}
// 创建 store 对象
const store = new Vuex.Store({
 state,
 getters
})
 
// 导出 store 对象
export default store;

这样页面上就会显示传过来的数据了!接下来我们来通过动作改变获取到的数据

④在 store.js 中定义 actions 和 mutations 方法并导出

actions 定义方法(动作),可以使异步的发送请求。

commit 提交变化,修改数据的唯一方式就是显示的提交 mutations

mutations 定义变化,处理状态(数据)的改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
// 定义属性(数据)
var state = {
 count:6
}
 
// 定义 getters
var getters={
 count(state){
  return state.count
 }
}
 
// 定义 actions ,要执行的动作,如流程的判断、异步请求
const actions ={
 // ({commit,state}) 这种写法是 es6 中的对象解构
 increment({commit,state}){
  //提交一个名为 increment 的变化,名字可自定义,可以认为是类型名,与下方 mutations 中的 increment 对应
  //commit 提交变化,修改数据的唯一方式就是显式的提交 mutations
  commit('increment')
 }
}
 
// 定义 mutations ,处理状态(数据) 的改变
const mutations ={
 //与上方 commit 中的 ‘increment' 相对应
 increment(state){
  state.count ++;
 }
}
// 创建 store 对象
const store = new Vuex.Store({
 state,
 getters,
 actions,
 mutations
})
 
// 导出 store 对象
export default store;

⑤ 在 app.vue 中引入 mapActions ,并调用

mapActions 用来获取方法(动作)

1
import {mapGetters,mapActions} from 'vuex'

调用 mapActions 辅助方法,并传入一个数组,在数组中指定要获取的方法 increment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<template>
 <div id="app">
 //这个 increment 方法与下面 methods 中的 increment 相对应
 <button @click="increment">增加</button>
 <button>减少</button>
 <h1>{{count}}</h1>
 </div>
</template>
 
<script>
import {mapGetters,mapActions} from 'vuex'
export default {
 name: 'app',
 computed:mapGetters([
 'count'
 ]),
 methods:mapActions([
 //该 increment 来自 store.js 中导出的 actions 和 mutations 中的 increment
 'increment',
 ])
}
</script>

这样就能通过 button 来改变获取到的 count 了。

看起来确实是挺绕的,需要在理解了原理的情况下,再细细琢磨,加深理解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 

原文链接:https://www.jianshu.com/p/b014ff74bdb6

/*getter是state的get方法,没有get页面就获取不到数据

获取页面:
import {mapGetters,mapActions} from 'vuex'
<h1>{{count}}</h1>
computed:mapGetters([
'count'
]), store.js: var state = {
count:6
},
var getters={
count(state){
return state.count
}
} 改变数据页面:
<button @click="increment">增加</button>
methods:mapActions([
//该 increment 来自 store.js 中导出的 actions 和 mutations 中的 increment
'increment',
]) 先发给action:
const actions ={
// ({commit,state}) 这种写法是 es6 中的对象解构
increment({commit,state}){
//提交一个名为 increment 的变化,名字可自定义,可以认为是类型名,与下方 mutations 中的 increment 对应
//commit 提交变化,修改数据的唯一方式就是显式的提交 mutations
commit('increment')
}
}
再发给mutations:
const mutations ={
//与上方 commit 中的 ‘increment' 相对应
increment(state){
state.count ++;
}
}
*/

Vuex mapGetters,mapActions的更多相关文章

  1. vuex之 mapState, mapGetters, mapActions, mapMutations 的使用

    一.介绍 vuex里面的四大金刚:State, Mutations,Actions,Getters (上次记得关于vuex笔记 http://www.cnblogs.com/adouwt/p/8283 ...

  2. vuex中的babel编译mapGetters/mapActions报错解决方法

    vex使用...mapActions报错解决办法 vuex2增加了mapGetters和mapActions的方法,借助stage2的Object Rest Operator 所在通过 methods ...

  3. vuex中的辅助函数 mapState,mapGetters, mapActions, mapMutations

    1.导入辅助函数 导入mapState可以调用vuex中state的数据 导入mapMutations可以调用vuex中mutations的方法 四个辅助函数 各自对应自己在vuex上的自己 2.ma ...

  4. 解决 vuex mapGetters 语法报错 (Unexpected token )

    在使用vuex2的mapGetters 和 mapActions 的方法时,借助 stage2 的 Object Rest Operator 特性,可以写出下面代码:  computed: { ... ...

  5. vuex使用mapActions报错解决办法

    先贴上报错: vuex2增加了mapGetters和mapActions的方法,借助stage2的Object Rest Operator 所在通过 methods:{ ...mapActions([ ...

  6. vuex mapGetters

    1.vuex 配置 //vuex的配置 //注意Store是大写 const store = new Vuex.Store({ //数据保存 state: { show: false, count: ...

  7. vuex2中使用mapGetters/mapActions报错解决方法

    解决方案 可以安装整个stage2的预置器或者安装 Object Rest Operator 的babel插件 babel-plugin-transform-object-rest-spread . ...

  8. vuex里mapState,mapGetters使用详解

    这次给大家带来vuex里mapState,mapGetters使用详解,vuex里mapState,mapGetters使用的注意事项有哪些,下面就是实战案例,一起来看一下. 一.介绍 vuex里面的 ...

  9. vuex mapActions

    在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用( ...

随机推荐

  1. 盘点20款主流应用FPS,最Skr帧率测试方法都在这里!

    ​​​无论是手机端还是PC端,画面的流畅度一直被用户视为衡量应用视觉体验的重要标准.用户往往通过主观感觉把视觉体验分为两种状态: 流畅视觉:行云流水,一气呵成: 非流畅视觉:“卡顿”.“抖动”.“迟钝 ...

  2. linux前后台任务切换管理

    liuyuan@ebuinfo:/var/www/projects/PHPExcel/Examples$ vi 33chartcreate-line.php & [] liuyuan@ebui ...

  3. centos7.4 install ss-qt5

    一切都是为了FQ,哦,说错了,是***-- 参考官网安装指南 1.新建repo文件 vim /etc//yum.repos.d/shadowssocks.repo 2.在文件中输入以下内容: [lib ...

  4. svn密码 在服务端 到底是明文保存,还是密文保存

    svn密码 在服务端 到底是明文保存,还是密文保存 之前在ubuntu上搭建svn服务端,记得密码就是明文保存的, 但最近项目,我们老大说,他搭建的是加密后的,我就比较纳闷了, 经过偷偷的瞄一下,不就 ...

  5. Eclipse 编译项目

    Eclipse 编译项目 编译 Java 项目 一个项目可以关联多个编译器. java 项目关联的是 java 编译器.可以通过以下方式来查看项目关联的编译器: 在 Package Explorer ...

  6. cobbler 更换dns和dhcp服务器为dnsmasq

    1) 需要配置/etc/cobbler/module.conf, 把manage_dns和manage_dhcp改为manage_dnsmasq 2) 重启cobbler和dnsmasq服务,dnsm ...

  7. spark通过合理设置spark.default.parallelism参数提高执行效率

    spark中有partition的概念(和slice是同一个概念,在spark1.2中官网已经做出了说明),一般每个partition对应一个task.在我的测试过程中,如果没有设置spark.def ...

  8. 涉及spring的相关概念

    1.pojo 2.为了降低java开发的复杂性,spring采用了4中策略 (1).基于POJO的轻量级和最小侵入性编程 (2).通过依赖注入和接口编程实现松耦合 (3).基于切面和惯例进行声明式编程 ...

  9. Linux文件类型及目录配置

    Linux文件类型与扩展名 在Linux系统中,任何硬件设备或者其他设备都是以文件的形式存在,就连数据通信的接口这些也是由专门的文件来负责的,因此Linux的文件种类就非常多,出了之前我们常见的 - ...

  10. php读取xml的神器

    <?xml version="1.0 encoding="UTF-8"?> <humans> <zhangying> <name ...