vuex的核心概念和基本使用詳解

介紹

Vuex是實現組件全局狀態(數據)管理的一種機制,可以方便的實現組件之間的數據共享

開始

安裝

①直接下載方式

創建一個 vuex.js 文件 將https://unpkg.com/vuex這個網址裡的內容放到該文件夾裡。

②CND方式

<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script>

③NPM方式

npm install vuex --save

④Yarn方式

yarn add vuex

NPM方式安裝的使用方式

1.在 scr 文件裡創建一個 store / index.js 的文件夾,寫入以下內容。

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {},
mutations: {},
actions: {},
modules: {}
})

2.在main.js 裡引入,然後掛載到 Vue 實例裡

import Vue from 'vue'
import store from './store'
new Vue({
  render: h => h(App),
  store
}).$mount('#app')

store概念及使用

概念:

就是組件之間共享數據的。

隻有 mutations 才能修改 store 中的數據

使用:

先定義後使用

定義

state: {
  num: 0
}

使用

方式1(推薦)

<div>{{ numAlias }}</div>

import { mapState } from 'vuex'
export default {
  //計算函數
  computed: mapState({
    // 傳字符串參數 'count' 等同於 `state => state.count`
    numAlias: 'num',//常用key是自己起的名隨便 value接收的數據
    // 箭頭函數可使代碼更簡練
    count: state => state.count,
    // 為瞭能夠使用 `this` 獲取局部狀態,必須使用常規函數
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
    //可以定義其餘的計算函數
  }),
  //或者這樣
  //計算函數
  computed: {
    mapState(['count'])
  }
}

方式2

<div>{{ $store.state.count }}</div>

mutations概念及使用

概念:

修改store裡的數據,嚴格規定不能在其餘的地方修改store的數據,mutations裡不要執行異步操作。

mutation 必須同步執行,不能異步執行。

使用:

先定義方法後使用

定義

mutations: {
	//increment自定義方法 store參數是store數據, parameter參數是接收到的數據,可不要
    increment (state, parameter) {
        // 變更狀態
        state.num++
    }
}

使用

方式1(推薦使用)

import { mapState, mapMutations } from 'vuex'
//方法
methods: {
	...mapMutations([
	    // mutations自定義的方法名
    	'increment'
    ]),
    love() {
    	// 直接this調用 this.increment('需要傳過去的數據,可不要')
        this.increment('Bin')
    }
}

方式2

methods: {
    love() {
    	// this.$store.commit('自定義的名稱', '傳過去的數據,可不傳')
    	this.$store.commit('increment', 'data')
    }
}

action概念及使用

概念:

用於處理異步操作。

如果通過異步操作變更數據,必須通過action,而不能使用mutation,但是在action中還是要通過觸發mutation的方式間接變更數據。

Action 類似於 mutation,不同在於:

  • Action 提交的是 mutation,而不是直接變更數據(狀態)。
  • Action 可以包含任意異步操作。

定義

mutations: {
	//increment自定義方法 store參數是store數據, parameter參數是接收到的數據,可不要
    increment (state, parameter) {
        // 變更狀態
        state.num++
    }
},
actions: {
	//add 自定義方法 context是參數,可以把它當作vuex的實例
    add(context) {
    	//可以通過context.commit('mutations中需要調用的方法')
    	context.commit('increment')
    }
}

使用

方式1(推薦)

import { mapState, mapMutations, mapActions } from 'vuex'
export default {
  methods: {
    ...mapActions([
      'add', // 將 `this.add()` 映射為 `this.$store.dispatch('add')`
      // `mapActions` 也支持載荷:
      'add' // 將 `this.add(amount)` 映射為 `this.$store.dispatch('add', amount)`
    ]),
    ...mapActions({
      add: 'add' // 將 `this.add()` 映射為 `this.$store.dispatch('increment')`
    }),
    love() {
    	// 直接this調用 this.add('需要傳過去的數據,可不要')
    	this.add(data)
    }
  }
}

方式2

methods: {
    love() {
    	// this.$store.dispatch('自定義的名稱', '傳過去的數據,可不傳')
    	this.$store.dispatch('add', data)
    }
}

getters概念及使用

概念:

getter用於對store中的數據進行加工處理形成新的數據。getting可以對store中已有的數據加工處理之後形成新的數據,類似Vue的計算縮寫。

定義

state: {
  num: 0
},
getters: {
    doneTodos: state => {
    	return state.num = 10
    }
}

使用

方式1(推薦)

<div>{{ doneTodos }}</div>

import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
export default {
  //計算函數
  computed: {
  	...mapState(['count']),
  	...mapmapGetters(['doneTodos'])
  }
}

方式2

<div>{{ $store.getters.doneTodos }}</div>

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: