1. 程式人生 > >Vuex基本使用

Vuex基本使用

當頁面有很多個元件之間需要進行復雜的資料傳遞時時,如果我們將公共資料放在一個公共地方統一管理,當一個元件改變了公共的資料時,其他元件頁面就能感覺到(獲取到改變後的資料),這是我們用到Vuex
Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式,它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。簡單可理解為一個集中管理資料的一個地方。
官方圖:
在這裡插入圖片描述

右邊虛線部分是公共儲存區域。state儲存所有的公共資料,當元件需要改變state裡的資料時我們需要走一個流程:元件通過dispatch呼叫actions(這裡儲存一些非同步方法或批量的同步方法)裡的方法,然後actions通過commit呼叫Mutations(放一個一個的對state的修改)裡的方法,只有通過mutations才能最終修改state的值。
有時可以元件直接通過commit來呼叫mutation裡的方法。

使用:
安裝
npm install --save vuex
建立一個src/store/index.js
state屬性儲存通用資料
getter屬性類似於計算屬性computed,對state裡的資料進行再次計算,
actions:存放一系列方法,並通過ctx.commit()方法提交給mutations最終修改資料
mutaitions:存放一些列方法,最終修改資料

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
export default new Vuex.Store({
   state:{
		city:'北京',
	},
	
	actions:{
		change(ctx,city){//ctx上下文便於呼叫mutations,city資料
			console.log('action',city)
			ctx.commit('change',city)
		}
	},
	getter:{
    	doubleCity(state){
        	return state.city + ' ' + state.city
        }
    }
	mutations:{
		change(state,city){//state資料,city傳過來的資料
			console.log('mutations',city)
			state.city = city
		}
	},
})

main.js引入

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import store from './store'

/* eslint-disable no-new */
new Vue({
  el: '#app',
  store,
  components: { App },
  template: '<App/>'
})

元件使用:
我們寫在App.vue裡,使用this.$store.state.屬性,獲取裡邊資料,然後使用this.$store.commit('方法名','資料')將資料傳遞到mutations執行改變資料或this.$store.dispatch('方法名','資料')將資料傳遞到actions呼叫mutations執行改變資料。

<template>
    <div>
       <div id="demo">
          {{city}}
          {{this.$store.state.doubleCity}}
        </div>
        <button @click="changeState">改變城市</button>
    </div>
</template>
<script>
export default{
    computed:{
       city(){
         return this.$store.state.city
       }
    },
    methods:{
        changeState(){
            //this.$store.commit('change','廣東')
            this.$store.dispatch('change','廣東')
        }
    },
}
</script>

高階使用(使用mapState,mapMutations對映函式):
App.vue

<template>
    <div>
       <div id="demo">
          {{this.city}}
        </div>
        <button @click="changeState">改變城市</button>
    </div>
</template>
<script>
import { mapState ,mapMutations} from 'vuex'
import { mapState ,mapMutations} from 'vuex'
export default{
    computed:{
       ...mapState(['city'])//將
    },
    methods:{
        changeState(){
            this.change('廣東')//直接呼叫change方法
        },
        ...mapMutations(['change'])//將將change方法對映到mutations的change方法
    },
}
</script>

總結
上述簡單描述了一下vuex儲存或改變資料的流程
vuex的基本用法如上,更多用法參見文件