vuex裏mapState,mapGetters使用詳解

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 ++;
 }
}
*/
複製代碼
相關文章
相關標籤/搜索