91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解Vue中狀態管理Vuex

發布時間:2020-10-15 19:20:30 來源:腳本之家 閱讀:155 作者:qq_35534823 欄目:web開發

vuex是一個專門為vue.js設計的狀態管理模式,并且也可以使用devtools進行調試。

在vuex出現之前,vue里面的狀態是屬于‘單向數據流'。舉個官網的例子:

new Vue({
  // state
  data () {
    return {
      count: 0
    }
  },
  // view
  template: `<div>{{ count }} </div`,
  // actions
  methods: {
    increment () {
      this.count++
    }
  }
})

其中

  1. state是一個數據源
  2. view以聲明的方式將state映射到視圖
  3. actions 響應在view上的用戶輸入導致的狀態變化

詳解Vue中狀態管理Vuex

但是解決不了 多個組件共享狀態

所以vuex應運而生

詳解Vue中狀態管理Vuex

簡單來說,就是共享的狀態用state來存放,用mutations來操作state,但是需要用store.commit來主動式的操作mutations。

下面來單獨介紹 state,getters,mutations,actions,modules

State

單一狀態樹

vuex使用單一狀態樹,那么就可以用一個對象來包含全部的應用層級狀態。所以state就作為數據源。

如何在組件中獲得vuex狀態?

由于vuex的狀態存儲是響應式的,所以從store實例中讀取狀態的最簡單方法就是使用計算屬性來返回某個狀態:

這個是store/state.js中聲明的數據源

詳解Vue中狀態管理Vuex

這個是在組件中進行的引用

詳解Vue中狀態管理Vuex

不過需要注意的是,在組件中進行引用之前,需要先在入門文件中進行注入
即:

詳解Vue中狀態管理Vuex

如果不在根實例中注冊store選項的話,那么需要在每一個使用state的組件中都要導入。

注冊之后,子組件只需要this.$store即可調用vuex。

Getters

有時候我們需要從state中派生出一些狀態,比如篩選一組列表,并且這個篩選后的數據是有其他組件要用的。那么我們就需要把這個結果進行包裝,形成共享狀態。

例如:

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

如果說這個length是其他組件用的話,那么如何做呢?

Getter就這樣應運而生了。

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

Getter 會暴露為store.getters對象

所以很容易在任何組件中使用它:

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

這是getters.js

詳解Vue中狀態管理Vuex

這是組件中的引用

詳解Vue中狀態管理Vuex

Mutations

更改Vuex的store中的狀態的唯一方法就是提交mutations。

Vuex中的mutations就像一個事件:每個mutations都有一個字符串的事件類型(type)和一個回調函數(handler)。這個回調函數接受state作為第一個參數。

但是我們又不能直接來調用一個mutations的handler。要喚醒一個mutations handler,需要以相應的type來調用store.commit方法。

這個是在mutations.js中注冊的一些的事件

詳解Vue中狀態管理Vuex

這是在組件中來觸發這個事件

詳解Vue中狀態管理Vuex

當然,我們注意到,mutations中可以傳遞額外的參數,這個參數就叫做mutations的載荷。
在更多的情況下,載荷應該是一個對象。這樣可以包含更多的字段。

但是mutations必須是同步函數。

那我們如何來異步的更新State呢?

答案是: Actions

Actions

Actions類似于 mutations 不同的是:

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

這也就形成了 actions —— mutations —— state 的過程

Actions函數接受一個與store實例具有相同方法和屬性的context對象,因此可以通過context.commit來提交一個mutations。但是如何觸發呢?

答案: store.dispatch

詳解Vue中狀態管理Vuex

詳解Vue中狀態管理Vuex 

詳解Vue中狀態管理Vuex

Modules

使用單一狀態樹,導致應用的所有狀態都集中到了一個很大的對象。所以,store對象容易變得臃腫。

為了解決這個問題, Vuex允許咱們把store進行一個功能拆分,分割成不同的模塊(module)。每個模塊都擁有自己的store,mutations,action,getters。

項目結構

├── index.html
├── main.js
├── api
│  └── ... # 抽取出API請求
├── components
│  ├── App.vue
│  └── ...
└── store
  ├── index.js     # 我們組裝模塊并導出 store 的地方
  ├── actions.js    # 根級別的 action
  ├── mutations.js   # 根級別的 mutation
  └── modules
    ├── cart.js    # 購物車模塊
    └── products.js  # 產品模塊

總結:

vuex可以用在單頁面上的組件間共享狀態。不適合用于跨頁面的通信。

另外,對于一些跨頁面的數據或者關鍵性的數據,可以通過localStorage,sessionStorage

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盐津县| 麦盖提县| 萨嘎县| 蒙自县| 黄骅市| 宾阳县| 宝清县| 重庆市| 来宾市| 弋阳县| 富川| 林芝县| 抚远县| 株洲县| 新源县| 南丰县| 渝北区| 靖远县| 许昌县| 建始县| 措勤县| 长顺县| 页游| 黔东| 特克斯县| 河北区| 新乐市| 新源县| 庆城县| 亚东县| 苍溪县| 东莞市| 沧州市| 石屏县| 鱼台县| 台安县| 刚察县| 老河口市| 梨树县| 凤庆县| 和林格尔县|