亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue的Flux框架之Vuex狀態管理器

2019-11-19 15:57:03
字體:
來源:轉載
供稿:網友

學習vue之前,最重要是弄懂兩個概念,一是“what”,要理解vuex是什么;二是“why”,要清楚為什么要用vuex。

Vuex是什么?

Vuex 類似 React 里面的 Redux 的狀態管理器,用來管理Vue的所有組件狀態。

為什么使用Vuex?

當你打算開發大型單頁應用(SPA),會出現多個視圖組件依賴同一個狀態,來自不同視圖的行為需要變更同一個狀態。
遇到以上情況時候,你就應該考慮使用Vuex了,它能把組件的共享狀態抽取出來,當做一個全局單例模式進行管理。這樣不管你在何處改變狀態,都會通知使用該狀態的組件做出相應修改。

下面講解如何使用Vuex

一個簡單的Vuex示例

本文就講解安裝Vuex,直接通過代碼講解Vuex使用。

import Vue from 'vue';import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({  state: {    count: 0  },  mutations: {    increment (state) {      state.count++    }  }})

上面就是一個簡單的Vuex示例,每一個Vuex應用就是一個store,在store中包含組件中的共享狀態state和改變狀態的方法(暫且稱作方法)mutations。

需要注意的是只能通過mutations改變store的state的狀態,不能通過store.state.count = 5;直接更改(其實可以更改,不建議這么做,不通過mutations改變state,狀態不會被同步)。

使用store.commit方法觸發mutations改變state:

store.commit('increment');console.log(store.state.count) // 1

一個簡簡單單的Vuex應用就實現了。

在Vue組件使用Vuex

如果希望Vuex狀態更新的時候,組件數據得到相應的更新,那么可以用計算屬性computed獲取state的更新狀態。

const Counter = {  template: `<div>{{ count }}</div>`,  computed: {    count () {      return store.state.count;    }  }}

每一個store.state都是全局狀態,在使用Vuex時候需要在根組件或(入口文件)注入。

// 根組件import Vue from 'vue';import Vuex from 'vuex';Vue.use(Vuex);const app = new Vue({  el: '#app',  store,  components: {    Counter  },  template: `    <div class="app">      <counter></counter>    </div>  `})

通過這種注入機制,就能在子組件Counter通過this.$store訪問:

// Counter 組件const Counter = {  template: `<div>{{ count }}</div>`,  computed: {    count () {      return this.$store.state.count    }  }}

mapState函數

computed: {  count () {    return this.$store.state.count  }}

上面通過count計算屬性獲取同名state.count屬性,如何每一次獲取都要寫一個這樣的方法,是不顯得重復又麻煩?可以使用mapState函數簡化這個過程。

import { mapState } from 'vuex';export default {  computed: mapState ({    count: state => state.count,    countAlias: 'count',  // 別名 `count` 等價于 state => state.count  })}

還有更簡單的使用方法:

computed: mapState([ 'count'  // 映射 this.count 為 store.state.count])

Getters對象

如果我們需要對state對象進行做處理計算,如下:

computed: {  doneTodosCount () {    return this.$store.state.todos.filter(todo => todo.done).length  }}

如果多個組件都要進行這樣的處理,那么就要在多個組件中復制該函數。這樣是很沒有效率的事情,當這個處理過程更改了,還有在多個組件中進行同樣的更改,這就更加不易于維護。

Vuex中getters對象,可以方便我們在store中做集中的處理。Getters接受state作為第一個參數:

const store = new Vuex.Store({ state: {  todos: [   { id: 1, text: '...', done: true },   { id: 2, text: '...', done: false }  ] }, getters: {  doneTodos: state => {   return state.todos.filter(todo => todo.done)  } }})

在Vue中通過store.getters對象調用:

computed: { doneTodos () {  return this.$store.getters.doneTodos }}

Getter也可以接受其他getters作為第二個參數:

getters: { doneTodos: state => {   return state.todos.filter(todo => todo.done) }, doneTodosCount: (state, getters) => {  return getters.doneTodos.length }}

mapGetters輔助函數

與mapState類似,都能達到簡化代碼的效果。mapGetters輔助函數僅僅是將store中的getters映射到局部計算屬性:

import { mapGetters } from 'vuex'export default { // ... computed: {  // 使用對象展開運算符將 getters 混入 computed 對象中  ...mapGetters([   'doneTodosCount',   'anotherGetter',   // ...  ]) }}

上面也可以寫作:

computed: mapGetters([   'doneTodosCount',   'anotherGetter',   // ...  ])

所以在Vue的computed計算屬性中會存在兩種輔助函數:

import { mapState, mapGetters } from 'vuex';export default {  // ...  computed: {    ...mapGetters([ ... ]),    ...mapState([ ... ])  }}

Mutations

之前也說過了,更改Vuex的store中的狀態的唯一方法就是mutations。

每一個mutation都有一個事件類型type和一個回調函數handler。

調用mutation,需要通過store.commit方法調用mutation type:

store.commit('increment')

Payload 提交載荷

也可以向store.commit傳入第二參數,也就是mutation的payload:

mutaion: {  increment (state, n) {    state.count += n;  }}store.commit('increment', 10);

單單傳入一個n,可能并不能滿足我們的業務需要,這時候我們可以選擇傳入一個payload對象:

mutation: {  increment (state, payload) {    state.totalPrice += payload.price + payload.count;  }}store.commit({  type: 'increment',  price: 10,  count: 8})

mapMutations函數

不例外,mutations也有映射函數mapMutations,幫助我們簡化代碼,使用mapMutations輔助函數將組件中的methods映射為store.commit調用。

import { mapMutations } from 'vuex'export default { // ... methods: {  ...mapMutations([   'increment' // 映射 this.increment() 為 this.$store.commit('increment')  ]),  ...mapMutations({   add: 'increment' // 映射 this.add() 為 this.$store.commit('increment')  }) }}

Actions

注 Mutations必須是同步函數。

如果我們需要異步操作和提交多個Mutations,Mutations就不能滿足我們需求了,這時候我們就需要Actions了。

Actions

Action 類似于 mutation,不同在于:

  1. Action 提交的是 mutation,而不是直接變更狀態。
  2. Action 可以包含任意異步操作。

讓我們來注冊一個簡單的 action:

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

分發 Action

Action 函數接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調用 context.commit 提交一個 mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters。

分發 Action

Action 通過 store.dispatch 方法觸發:

乍一眼看上去感覺多此一舉,我們直接分發 mutation 豈不更方便?實際上并非如此,還記得 mutation必須同步執行這個限制么?Action就不受約束! 我們可以在 action 內部執行異步操作:

actions: { incrementAsync ({ commit }) {  setTimeout(() => {   commit('increment')  }, 1000) }}

Actions 支持同樣的載荷方式和對象方式進行分發:

// 以載荷形式分發store.dispatch('incrementAsync', { amount: 10})// 以對象形式分發store.dispatch({ type: 'incrementAsync', amount: 10})

mapActions

同樣地,action也有相對應的mapActions 輔助函數

mapActions

mapActions 輔助函數跟mapMutations一樣都是組件的 methods 調用:

import { mapActions } from 'vuex'export default { // ... methods: {  ...mapActions([   'increment' // 映射 this.increment() 為 this.$store.dispatch('increment')  ]),  ...mapActions({   add: 'increment' // 映射 this.add() 為 this.$store.dispatch('increment')  }) }}

mutation-types

關于mutation-types方面的講解官方文檔很少說明,但在實際的中大項目中,對==mutation-types==的配置是必不可少的,Vuex的文檔只講解了state,getters,mutation,actions四個核心概念,下面我簡單補充下mutation-types的使用。

顧名思義,==mutation-types==其實就是mutation實例中各個方法的設定,一般要mutation方法前先在mutation-types用大寫寫法設定,再在mutation里引入使用,下面看看項目實際使用:

項目組織結構


在mutation-types定義好mutation的方法結構:

//SET_SINGER,SET_SONG 為mutation中要使用的方法名export const SET_SINGER = 'SET_SINGER'export const SET_SONG = 'SET_SONG'

在mutation中導入使用:

import * as types from ',/mutation-types.js'const mutations = {  [types.SET_SINGER](state, singer) {    ....   },  [types.SET_SONG](state, song) {    ....   }}

結語

看完上面對vuex的講解相信你已經入門了,現在可以看看具體的項目加深理解,可以參考我的github一個購物車例子: https://github.com/osjj/vue-shopCart

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品日本亚洲专区61| 91精品国产99| 91系列在线观看| 欧美最近摘花xxxx摘花| 亚洲综合中文字幕在线观看| 国产成人精品综合久久久| 国产亚洲精品久久久久动| 热99久久精品| 欧美日韩精品在线视频| 国产成+人+综合+亚洲欧美丁香花| 成人午夜在线影院| 黄色91在线观看| 狠狠综合久久av一区二区小说| 国产精品一区二区久久久久| 日韩欧美一区二区三区| 91精品国产综合久久香蕉最新版| 国产91久久婷婷一区二区| 亚洲精品中文字幕av| 深夜福利91大全| 亚洲毛片在线免费观看| 亚洲男女自偷自拍图片另类| 欧美在线中文字幕| 一区二区在线视频播放| 欧美激情中文网| 欧美日韩亚洲一区二区三区| 成人久久18免费网站图片| 日韩网站在线观看| 国产精品专区第二| 91沈先生作品| 在线观看精品自拍私拍| 欧美日韩一区二区三区在线免费观看| 中文字幕日韩欧美在线视频| 欧美另类99xxxxx| 亚洲第一福利网| 狠狠躁18三区二区一区| 欧美国产日本高清在线| 91在线高清免费观看| 国产成人久久精品| 国产欧美精品xxxx另类| 久久理论片午夜琪琪电影网| 久久人人97超碰精品888| 亚洲跨种族黑人xxx| 国产一区二区成人| 在线看欧美日韩| 精品国产91久久久久久老师| 国产一区二区三区网站| 久久中文字幕视频| 亚洲人成伊人成综合网久久久| 国产一区二区精品丝袜| 久久久亚洲国产| 亚洲欧洲激情在线| 一本色道久久88精品综合| 中文字幕av一区二区三区谷原希美| 国产一区二区三区视频| 精品动漫一区二区| 欧美二区乱c黑人| 精品国产网站地址| 欧美大胆在线视频| 97精品伊人久久久大香线蕉| 九九久久精品一区| www.日韩视频| 国产欧美一区二区白浆黑人| 日韩av资源在线播放| 亚洲天堂男人天堂| 亚洲最新av在线网站| 97成人超碰免| 日韩精品免费在线视频| 亚洲午夜精品视频| 成人激情视频小说免费下载| 精品久久久久久久久久久久| 成人激情视频网| 欧美福利视频网站| 久久伊人免费视频| 欧美中文在线字幕| 成人春色激情网| 国产精品高清在线| 国产成人精品电影久久久| 国产免费一区视频观看免费| 国产精品99久久久久久久久久久久| 最近2019年好看中文字幕视频| 欧美亚洲国产精品| 久久综合色影院| 欧美日本啪啪无遮挡网站| 欧美中文在线字幕| 亚洲欧美中文日韩在线| 91成人免费观看网站| 国产999视频| 日韩欧美在线观看视频| 日韩亚洲欧美成人| 亚洲大胆人体在线| 日韩高清a**址| 亚洲欧美激情另类校园| 亚洲片av在线| 欧美在线性视频| 久久精品亚洲94久久精品| 国产丝袜一区二区| 国产精品久久久久免费a∨大胸| 午夜精品一区二区三区av| 欧美日韩午夜剧场| 欧美性猛交xxxx黑人猛交| 成人亚洲综合色就1024| 亚洲色图第三页| 亚洲一品av免费观看| 久久久久久久久亚洲| 欧美专区在线播放| 欧美在线视频一区| 亚洲精品97久久| 久久久久久网址| 伊人av综合网| 亚洲精品v天堂中文字幕| 色综合视频网站| 亚洲一区美女视频在线观看免费| 一本色道久久88精品综合| 日韩av黄色在线观看| 国内精品免费午夜毛片| 在线看欧美日韩| 国产精品igao视频| 91国内揄拍国内精品对白| 欧美中文在线免费| 在线观看视频99| 亚洲免费av网址| 一区二区中文字幕| 992tv成人免费影院| 亚洲香蕉伊综合在人在线视看| 亚洲日本中文字幕免费在线不卡| 日韩不卡中文字幕| 亚洲经典中文字幕| 欧美激情精品久久久久久大尺度| 欧美成人四级hd版| 久久久午夜视频| 午夜精品在线观看| 不卡av电影院| …久久精品99久久香蕉国产| 国产精品极品尤物在线观看| 久久91超碰青草是什么| 欧美高清在线播放| 亚洲一区二区三区四区视频| 国产成人精品网站| 欧美综合一区第一页| 久久人人看视频| 亚洲另类图片色| 午夜剧场成人观在线视频免费观看| 日韩有码片在线观看| 欧美国产精品va在线观看| 欧美亚洲成人网| 亚洲国产欧美一区| 色系列之999| 麻豆国产精品va在线观看不卡| 亚洲综合视频1区| 97视频在线观看亚洲| 久久69精品久久久久久久电影好| 亚洲欧美另类中文字幕| 97热在线精品视频在线观看| 91久久国产婷婷一区二区| 日韩美女福利视频| 国产女人18毛片水18精品| 国产精品久久久久久影视| 亚洲激情视频网站| 精品高清一区二区三区| 日韩av影片在线观看| 中文字幕欧美日韩精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 成人黄色大片在线免费观看| 精品人伦一区二区三区蜜桃网站|