vuex的幾個屬性及其使用傳參方式

vuex概念

1.1、組件之間共享數據的方式

父 向 子 傳值:v-bind屬性綁值

子 向 父 傳值:v-on事件綁定

兄弟組件之間共享數據:EventBus

  • $on 接收數據的那個組件
  • $emit 發送數據的那個組件

1.2、Vuex是什麼

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

1.3、使用Vuex同意管理狀態的好處

能夠在vuex中集中管理共享的數據,易於開發和後期維護

能夠高效地實現組件之間的數據共享,提高開發效率

存儲在vuex中的數據都是響應式的,能夠實時保持數據與頁面的同步。

1.4、什麼樣的數據適合存儲到Vuex中

一般情況下,隻有組件之間共享的數據,才有必要存儲到vuex中;對於組件中的私有數據,依然存儲在組件自身的data中即可。

vuex的基本使用

1、安裝vuex依賴包

npm i vuex --save

2、導入vuex包

import Vuex from 'vuex'
Vue.use(Vuex)

3、創建stroe對象

const store = new Vuex.Store({
    //state中存放的就是全局共享的數據
	state:{count:0}
})

4、將store對象掛載到vue實例中

new Vue({
	el:'#app',
	render:h => h(app),
	router,
	//將創建的共享數據對象,掛載到vue實例中
	//所有的組件,就可以直接從stroe中獲取全局的數據瞭
	store
})

vuex的核心概念

1、vuex中的主要核心概念如下

State

State提供唯一的公共數據源, 所有共享的數據都要統放到Store的State中進行存儲。

export default new Vuex.Store({
  state: {
    count: 0
  },
})

組件訪問State中數據的**第一種方式:**Addition.vue

this.$store.state.全局數據名稱

<h3>當前最新的count值為:{{$store.state.count}}</h3>

組件訪問State中數據的第二種方式: Subtraction.vue

// 1. 從 vuex 中按需導入 mapState 函數
import { mapState } from 'vuex'

通過剛才導入的 mapState 函數,將當前組件需要的全局數據,映射為當前組件的 computed 計算屬性:

<h3>當前最新的count值為:{{count}}</h3>


// 2. 將全局數據,映射為當前組件的計算屬性
computed: {
 ...mapState(['count'])
}

Mutation

Mutation 用於變更 Store中 的數據。

隻能通過 mutation 變更 Store 數據,不可以直接操作 Store 中的數據。

② 通過這種方式雖然操作起來稍微繁瑣一些,但是可以集中監控所有數據的變化。

第一種方式

(1)

// 定義 Mutation    store.js
 const store = new Vuex.Store({
 	state: {
 		count: 0
 	},
	mutations: {
 		add(state) {
 		// 不要在 mutations 函數中,執行異步操作
      	// setTimeout(() => {
      	//   state.count++
      	// }, 1000)
	 	// 變更狀態
	 	state.count++
	 	}
 	}
 })

在組件中訪問Mutation Addition.vue

 <button @click="btnHandler1">+1</button>

methods:{
	//觸發mutation
    btnHandler1() {
	  //觸發 mutations 的第一種方式
      this.$store.commit('add')
    },
}

(2)可以在觸發 mutations 時傳遞參數:

 // 定義Mutation
 const store = new Vuex.Store({
 	state: {
 	count: 0
 	},
 	mutations: {
		 addN(state, step) {
 			// 變更狀態
			 state.count += step
		 }
 	}
 })

在組件中訪問Mutation Addition.vue

 <button @click="btnHandler2">+N</button>
 
  methods: {
    btnHandler2() {
      // commit 的作用,就是調用 某個 mutation 函數  攜帶參數
      this.$store.commit('addN', 3)
    },
  }

第二種方式

this.$store.commit() 是觸發 mutations 的第一種方式,觸發 mutations 的第二種方式:

// 1. 從 vuex 中按需導入 mapMutations 函數
import { mapMutations } from 'vuex'

通過剛才導入的 mapMutations 函數,將需要的 mutations 函數,映射為當前組件的 methods 方法:

// 2. 將指定的 mutations 函數,映射為當前組件的 methods 函數
methods: {
 ...mapMutations(['add', 'addN'])
}

完整代碼:

//store.js
export default new Vuex.Store({
  state: {
    count: 0
  },
  // 隻有 mutations 中定義的函數,才有權利修改 state 中的數據
  mutations: {
    //減減
    sub(state) {
      state.count--
    },
      //攜帶參數
    subN(state, step) {
      state.count -= step
    }
  },
})

在組件中Subtraction.vue

<h3>當前最新的count值為:{{count}}</h3>
<button @click="btnHandler1">-1</button>
//<button @click="btnHandler2">-1</button>
<button @click="subN(3)">-N</button>            -----攜帶參數

import { mapState, mapMutations} from 'vuex'


 computed: {
    ...mapState(['count']),
  },
  methods: {
    ...mapMutations(['sub', 'subN']),
    btnHandler1() {
      this.sub()
    },
 	//btnHandler2() {
      //this.subN(3)
    //},
  }

Action

(1)Action 用於處理異步任務。

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

第一種方式

(1)處理異步任務

// 定義 Action
 const store = new Vuex.Store({
	 // ...省略其他代碼
	 mutations: {
 		add(state) {
 			state.count++
 		}
 	},
 	actions: {
 		addAsync(context) {
 			setTimeout(() => {
 				context.commit('add')
 			}, 1000)
 		} 
 	}
 })

在組件中Addition.vue

<button @click="btnHandler3">+1 Async</button>

// 異步地讓 count 自增 +1
btnHandler3() {
    // 這裡的 dispatch 函數,專門用來觸發 action
    this.$store.dispatch('addAsync')
},

(2)攜帶參數

觸發 actions 異步任務時攜帶參數:

// 定義 Action
 const store = new Vuex.Store({
 	// ...省略其他代碼
 	mutations: {
 		addN(state, step) {        -------------攜帶參數
			 state.count += step
 		}
 	},
 	actions: {
 		addNAsync(context, step) {   -------------攜帶參數
 			setTimeout(() => {
 				context.commit('addN', step)
 			}, 1000)
 		} 
 	}
 })

在組件中

<button @click="btnHandler4">+N Async</button>

btnHandler4() {
      this.$store.dispatch('addNAsync', 5)
}

第二種方式

this.$store.dispatch() 是觸發 actions 的第一種方式,觸發 actions 的第二種方式:

// 1. 從 vuex 中按需導入 mapActions 函數
import { mapActions } from 'vuex'

通過剛才導入的 mapActions 函數,將需要的 actions 函數,映射為當前組件的 methods 方法:

// 2. 將指定的 actions 函數,映射為當前組件的 methods 函數
methods: {
 ...mapActions(['addASync', 'addNASync'])
}

完整代碼

export default new Vuex.Store({
  state: {
    count: 0
  },
  // 隻有 mutations 中定義的函數,才有權利修改 state 中的數據
  mutations: {
    //減減
    sub(state) {
      state.count--
    },
    subN(state, step) {
      state.count -= step
    }
  },
  //actions可以處理異步任務
  actions: {
    subAsync(context) {
      setTimeout(() => {
        // 在 actions 中,不能直接修改 state 中的數據;
        // 必須通過 context.commit() 觸發某個 mutation 才行
        context.commit('sub')
      }, 1000)
    },
    subNAsync(context, step) {
      setTimeout(() => {
        context.commit('subN', step)
      }, 1000)
    }
  },
})

組件Subtraction.vue

<h3>當前最新的count值為:{{count}}
<button @click="subAsync">-1 Async</button>
<button @click="subNAsync(5)">-N Async</button>
 
import { mapState, mapMutations, mapActions } from 'vuex'

methods: {
    ...mapActions(['subAsync', 'subNAsync']),
}

**Getter **

不會修改state裡面的數據

Getter 用於對 Store 中的數據進行加工處理形成新的數據。

① Getter 可以對 Store 中已有的數據加工處理之後形成新的數據,類似 Vue 的計算屬性。

② Store 中數據發生變化,Getter 的數據也會跟著變化。

// 定義 Getter
 const store = new Vuex.Store({
	state: {
 		count: 0
 	},
 	getters: {
 		showNum: state => {
 			return '當前最新的數量是【'+ state.count +'】'
 		}
 	}
 })

使用getters的第一種方式

this.$store.getters.名稱

使用getters的第一種方式

{{showNum}}

import { mapGetters } from 'vuex'
computed: {
 ...mapGetters(['showNum'])
}
  • 隻有 mutations 中定義的函數,才有權利修改 state 中的數據
  • actions 中,不能直接修改 state 中的數據必須通過 context.commit() 觸發某個 mutation 才行
  • commit 的作用,就是調用 某個 mutation 函數
  • dispatch 函數,專門用來觸發 action

到此這篇關於vuex的幾個屬性及其使用傳參的文章就介紹到這瞭,更多相關vuex屬性使用傳參內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: