vue 五、vuex 的使用(狀態管理)

前篇:vuex 是什麼?有什麼用?

vuex 是什麼?

Vuex 可以幫助我們管理共享狀態,並附帶了更多的概念和框架。這需要對短期和長期效益進行權衡。

如果您不打算開發大型單頁應用,使用 Vuex 可能是繁瑣冗餘的。確實是如此——如果您的應用夠簡單,您最好不要使用 Vuex。一個簡單的 store 模式就足夠您所需了

什麼時候用vuex?

老生常談的話題,每個人的使用動機不同可能結果就不同,站在系統架構的角度上來,vuex雖然能很好幫助我們管理狀態, 但隨之也帶來更多的概念讓我們花時間來消化,一般情況下我們會根據項目的實際大小來決定是否需要引入vuex

隨着 JavaScript 單頁應用開發日趨複雜,JavaScript 需要管理比任何時候都要多的 state (狀態)。 這些 state 可能包括服務器響應、緩存數據、本地生成尚未持久化到服務器的數據,也包括 UI 狀態,如激活的路由,被選中的標籤,是否顯示加載動效或者分頁器等等。

在應用中,組件之間的通信其實是歸根於應用的狀態管理;而應用的狀態是來自多方面的,如何對狀態進行管理,提高代碼的可維護性,提升開發效率。Vue 的核心庫只關注視圖層,單文件組件,其模板、邏輯和樣式是內部耦合的,側重數據和視圖的同步;Vue 本身並沒有對數據狀態的管理進行處理,但其提供了另外一個解決方案 Vuex,一個集中式狀態管理的庫;也就是說,你可能不需要 Vuex,它只是對你應用狀態進行管理的一個庫。

一、安裝vuex 創建

當前項目下使用命令

npm install vuex --save     #安裝vuex

在這裏插入圖片描述

二、配置 vuex (main.js)

1、引入

import Vuex from 'vuex';

2、安裝插件

Vue.use(Vuex);

3、 定義狀態數據num,及getters方法讀取num

定義狀態數據 num

var store = new Vuex.Store({
	state: {
		num: 1
	}
})

// 定義了 getters 方法獲取 num 數據的 store (讀取數據)

var store = new Vuex.Store({
	state: {
		num: 1
	},
	getters: {
		getNum: function (state) {
			return state.num;
		}
	}
})

// 定義了 getters (查詢)+ mutations (修改)

// Vuex 配置
var store = new Vuex.Store({
	state: {
		num: 1
	},
	getters: {
		getNum: function (state) {
			return state.num;
		}
	},
	mutations:{
		// 參數一爲當前state,參數二爲傳遞值
		updNum: function(state,payload){
			state.num += payload;
		}
	}
})

4、vue實例添加 store,

new Vue({
	store,   //實例添加vuex
	router,
	render: h => h(App),
}).$mount('#app')

如下:
在這裏插入圖片描述

三、vuex 讀取狀態數據的三種方式

1、 讀取一(直接讀取變量值)

{{$store.state.num}}

2、 讀取二(getters方式讀取變量值)

store 添加getters

	getters: {
		getNum: function (state) {
			return state.num;
		}
	},

讀取

{{$store.getters.getNum}}

3、 讀取三(定義簡寫, 讀取變量值)

KaTeX parse error: Expected '}', got 'EOF' at end of input: …太長,每次定義不友好,在 {{store.getters.getNum}} 的方法上配置簡寫

store 添加getters

	getters: {
		getNum: function (state) {
			return state.num;
		}
	},

添加配置簡寫

<script type="text/javascript">
	import {mapGetters} from 'vuex';
	export default {
		computed:{
			...mapGetters({
				getNum:'getNum'
			})
		}
	}
</script>

直接使用簡寫讀取

 {{getNum}}

4、配置vuex的完整代碼(main.js)

// 核心組件
import Vue from 'vue'
import Vuex from 'vuex';
import axios from 'axios';
import VueRouter from 'vue-router';
// 當前項目組件
import App from './App.vue'
import HelloWorld from './components/HelloWorld';

// 關閉生產模式下給出的提示
Vue.config.productionTip = false;


// 安裝插件
Vue.use(Vuex);
Vue.use(axios);
Vue.use(VueRouter);


// Vuex 配置
var store = new Vuex.Store({
	state: {
		num: 1
	},
	getters: {
		getNum: function (state) {
			return state.num;
		}
	}
})


// axios 配置
var instance = axios.create({
	baseURL: 'http://localhost:8088',
});
Vue.prototype.$axios = instance;


// 路由配置
let router = new VueRouter({
	routes: [{
		path: '/',
		component: HelloWorld
	}, ]
})


/**
 *  路由攔截
 * to: Route: 即將要進入的目標 路由對象, from: Route: 當前導航正要離開的路由 
 */
router.beforeEach((to, from, next) => {
	window.console.log(to);
	next(); //url放行
})


//定義實例
new Vue({
	store,
	router,
	render: h => h(App),
}).$mount('#app')

5、3種方式的讀取完整代碼

<template>
	<div>
		store1 = {{$store.state.num}} <br />
		store2 = {{$store.getters.getNum}} <br />
		store3 = {{getNum}}
	</div>
</template>

<script type="text/javascript">
	import {mapGetters} from 'vuex';
	export default {
		computed: {
			...mapGetters({
				getNum: 'getNum'
			})
		}
	}
</script>

<style>
</style>

效果
在這裏插入圖片描述

四、使用 vuex 修改狀態數據(mutations)

1、添加 mutations

store 添加mutations 的mutations 方法

mutations:{
		// 參數一爲當前state,參數二爲傳遞值
		updNum: function(state,payload){
			state.num += payload;
		}
	}

2、添加點擊事件

	<button @click="updNum"> num+10</button>

3、點擊事件修改狀態值

this.$store.commit
參數1 : mutations 內的函數名
參數2 : 傳遞的參數,可以爲對象數據 {}

methods: {
			updNum() {
				//參數updNum = mutations 內的函數名
                 this.$store.commit('updNum',10);
			}
		},

五、Action(處理異步請求)

Action 類似於 mutations,唯一的區別就是Action 是處理異步數據的

Action 需要調用mutations 執行同步操作
在Action 中調用 mutations 完成數據修改

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

使用store.dispatch 觸發函數

store.dispatch('increment')

六、Module

Module = State+Getter +Mutation+Action

把 State+Getter +Mutation+Action 抽取出來定義,也可以單獨定義爲一個json 文件引入使用

發佈了198 篇原創文章 · 獲贊 30 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章