1、基本用法vue
1. 初始化并建立一个项目webpack
1
2
3
|
vue init webpack-simple vuex-demo
cd vuex-demo
npm install
|
2. 安装 vuexes6
1
|
npm
install
vuex -S
|
3. 在 src 目录下建立 store.js 文件,并在 main.js 文件中导入并配置web
store.js 中写入vuex
1
2
3
4
|
import Vue from
'vue'
//引入 vuex 并 use
import Vuex from
'vuex'
Vue.use(Vuex)
|
main.js 文件npm
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 以前,咱们仍是须要看懂这个流程图,其实很简单。bash
vuexapp
① 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;
|
方式一、 在 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>
|
方式二、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 ++; } } */