vue學習筆記(五):對於vuex的理解 + 簡單實例

優勢:經過定義和隔離狀態管理中的各類概念並強制遵照必定的規則,咱們的代碼將會變得更結構化且易維護。使用vuex來引入外部狀態管理,將業務邏輯切分到組件外,能夠避免重複的從服務端抓取數據。html

 詳情請參考官網文檔__連接vue

規則:vue-router

1:應用層級的狀態應該集中到單個 store 對象中。vuex

2:提交 mutation 是更改狀態的惟一方法,而且這個過程是同步的npm

3:異步邏輯都應該封裝到 action 裏面app

 

使用場景1:例如要實如今一個顯示組件中提交表單,另外一個組件的內容須要隨之改變:異步

沒有使用vuex前: (與服務端交互2次)函數

表單組件提交內容時,咱們須要與服務端交互一次(提交);this

顯示組件更新內容時:咱們又須要與服務端交互一次(獲取)。eslint

使用vuex後: (與服務端交互1次)

表單組件提交內容時,咱們在actions中與服務端交互,而後觸發mutation,改變state中的數據狀態;

顯示組件直接使用getters獲取states中的數據。

 

使用場景2若是組件只在本地改變數據,不與服務端交互,而且顯示組件也要隨之改變。那不使用vuex是很是難實現的。

沒有使用vuex前:

?

使用vuex後:

觸發mutation,改變state中的數據狀態;

顯示組件直接使用getters獲取states中的數據。

 

 

實例1:加減法,實現組件間的值一同變化

文件目錄:

 

1:編寫app.vue

<template>
  <div id="app">
    <router-view></router-view>
    <div>
      count is {{count}}
     <router-link to="/component1">組件1</router-link>
     <router-link to="/component2">組件2</router-link>
    </div>
  </div>
</template>

<script>
import {mapGetters, mapActions} from 'vuex'
export default {
  name: 'app',
  computed: mapGetters([
    'count'
  ])
}
</script>

這裏須要知道mapGetters的含義: mapGetters 輔助函數僅僅是將 store 中的 getters 映射到局部計算屬性。 傳送門

 

2:編寫 component1.vue和 component2.vue。

這兩個組件的內容同樣(組件二中,請改成 組件2 count is,是爲了好區分):

<template>
  <div class="hello">
    組件1count is {{count}}
    <button @click="increment">+5</button>
    <button @click="decrement">-3</button>
  </div>
</template>

<script>
import {mapGetters, mapActions} from 'vuex'
export default {
  computed: mapGetters([
    'count'
  ]),
  methods: mapActions([
    'increment',
    'decrement'
  ])
}
</script>

  

3:router/index.js 路由文件

import Vue from 'vue'
import Router from 'vue-router'
import component1 from '@/components/component1'
import component2 from '@/components/component2'
Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/component1',
      name: 'component1',
      component: component1
    },
    {
    	path: '/component2',
      name: 'component2',
      component: component2
    }
  ]
})

  

4:編寫vuex/index.js   

import Vue from 'vue'
import Vuex from 'Vuex'
import getters from './getters'
import actions from './actions'
import mutations from './mutations'

Vue.use(Vuex)

const state = {
	count: 0
}

const store = new Vuex.Store({
	state,
	getters,
	actions,
	mutations
})

export default store

這裏須要知道state的含義:傳送門

 

5:編寫vuex/actions.js

const actions = {
	increment : ({commit}) => commit('increment'),
	decrement : ({commit}) => commit('decrement')
}

export default actions

這裏須要知道actions的含義:傳送門

 

6:編寫vuex/mutaions.js

const mutations = {
	increment : state =>{
		state.count = state.count+5
	},
	decrement : state =>{
		state.count = state.count-3
	},
}

export default mutations

這裏須要知道mutaions的含義:傳送門

 

7:編寫vuex/getters.js

const getters = {
	count: state => state.count
}

export default getters

這裏須要知道getters的含義:傳送門

 

8:編寫main.js

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './vuex/index'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

  

npm run dev後,啓動項目:

 

二:直接寫在一個文件中的方式:

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

Vue.use(Vuex)

const state = {
    candidateEduList: [],
    relationList: []
}
const mutations = {
    // 設置教育列表
    setEduList(state, resData) {
        state.candidateEduList = resData
    },
    // 設置關係列表
    setRelationList(state, resData) {
        state.relationList = resData
    }
}
 
const store = new Vuex.Store({
    state,
    mutations
})
 
export default {
    store
}

一、組件中直接commit

this.$store.store.commit('setLogin')

帶參數的方式:

this.$store.store.commit('setLogin',data)

  

 二、組價中讀取

this.$store.store.state
相關文章
相關標籤/搜索