1. 程式人生 > >Vuex的理解與運用

Vuex的理解與運用

初步認識Vuex

Vuex是什麼?

  • 官方解釋
    Vuex是一個專為Vue開發的應用程式的狀態管理模式,它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • 我的理解
    Vuex採用類似全域性物件的形式來管理所有元件的公用資料,如果你想想修改這個全域性物件的資料,是可以的,但沒那麼簡單,你得按照Vuex提供的方式來修改,不能自己隨意用自己的方式來修改。

Vuex的好處

  • 狀態儲存是響應式:當 Vue 元件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那麼相應的元件也會相應地得到高效更新。
  • 不能隨意修改Vuex的狀態
    :改變 store 中的狀態的唯一途徑就是顯式地提交 (commit) mutation。

Vuex的適用場景

不是所有使用vue開發的SPA(single page application)單頁應用都適合採用Vuex。如果你的應用是個小型的應用,元件不多,元件之間的狀態依賴不多,關係清晰容易維護,也就是說不同元件之間很少有資料之間的關聯的話,那麼你大可不用Vuex來開發。反之,如果你開發的是較大型的應用,出現多個檢視元件共同依賴一個狀態,這個狀態相當於我們的全域性物件資料,其他元件的改動,會影響到它,反之,它的修改也需要更新其他關聯的元件,那麼Vuex就很適用。比如:商城系統,外賣系統等等。

理解Vuex的核心概念

Store

要使用Vuex,我們要建立一個例項 store ,我們稱之為倉庫,利用這個倉庫 store 來對我們的狀態進行管理。

//建立一個 store
 const store = new Vuex.Store({});

State

Vuex 使用單一狀態樹,用一個物件State包含了整個應用層級的所有狀態,你可以理解為這些狀態就是一堆全域性變數和資料。

//建立一個 store
 const store = new Vuex.Store({
    //state儲存應用層的狀態
    state:{
        count:5  //總數:5
    }
 });

上面的例子中,假設我們有一個全域性狀態count的值為5。那麼,我們就可以將其定義為 state 物件中的key和value,作為全域性狀態供我們使用。

Getter

還記得Vue中的計算屬性computed 嗎?當我們需要在data的基礎上再派生一些狀態的時候,就會使用computed 來實現。同樣,當我們需要從 state 中派生出一些狀態的時候,就會使用到getters,你可以將 getters 理解state的計算屬性。

getters 接受 state 作為其第一個引數:

const store = new Vuex.Store({
   //state儲存應用層的狀態
   state:{
      count:5  //總數:5
    },
    //派生出來的狀態
   getters:{
      //ES6 的箭頭函式語法
    newCount:state => state.count * 3
    }
 });

假設我們要在state.count的基礎上派生出一個新的狀態newCount出來,就適合使用我們的getters

Mutation

Vuex相比傳統的全域性變數有兩個優勢,其中一個是Vuex中的狀態不能隨意修改,要修改必要按照Vuex提供的方式才能修改。

Vuex給我們提供修改倉庫 store 中的狀態的唯一辦法就是通過提交 mutation。我們來看看如何定義一個mutation:

const store = new Vuex.Store({
    //state儲存應用層的狀態
    state:{
        count:5  //總數:5
    },
    //更改store狀態的唯一途徑
    mutations:{
        increment(state){
            state.count ++;
        }
    }
 });

我們再 mutations 中定義了一個叫increment的函式,函式體就是我們要進行更改的地方,可以看到,我們只是簡單地對 state 中的count進行了自增運算。

使用mutations:
非常簡單,Vuex要求我們要想通過 mutations 更改內容,就必須提交 mutation,語法如下

//提交一個名為increment的mutation
store.commit('increment');

我們再提交commit時候,字串引數increment,就是對應在mutations中的increment。

此外,store.commit( ) 還接受其他額外的引數,比如:

 //...
 //更改store狀態的唯一途徑
 mutations:{
    increment(state,n){
        state.count += n;
    }
 }
 //...
 store.commit('increment',10);

Action

Action 類似於 mutation,不同在於:

  • Action 提交的是 mutation,而不是直接變更狀態。
  • Action 可以包含任意非同步操作,通過 store.dispatch 方法觸發
actions: {
    increment (context) {
      context.commit('increment')
    }
  }
//...
store.dispatch('increment')

mutation都是同步事務,而非同步操作需要在action中處理,看官方文件對於action的講解非常易懂,這裡對action不做具體介紹。

使用Vuex實現一個簡單的計算器

要實現的效果如圖:
這裡寫圖片描述

  • 自定義keyboard元件
<template>
  <div class="val-cont" @click="getKeyboardValue" :data-value="val">
    {{val}}
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    props: {
      val: ''
    },
    methods: {
      getKeyboardValue (event) {
        let value = event.target.dataset.value
        this.$store.commit('calculate', value)
      }
    }
  }
</script>

<style lang="scss" scoped>
  //...
</style>
  • 建立store
 const store = new Vuex.Store({
    state:{
       result:"",//運算結果
       enter:""  //輸入的值
    }
 });
  • 定義名為calculate的mutations
const mutations = {
  calculate: (state, value) => {
    if (value === '=') {
      state.result = evil(state.enter)
      state.enter += value
    } else if (value === 'clear') {
      state.result = state.enter = ''
    } else {
      state.enter += value
    }
    // 代替eval,eslint禁用eval
    function evil (fn) {
      var Fn = Function
      return new Fn('return ' + fn)()
    }
  }
}
  • 頁面佈局以及使用修改mutations
<template>
  <div class="calu clear">
    <div class="result">
      <!--計算結果:-->
      {{result}}
    </div>
    <div class="enter">
      <!--輸入式子-->
      {{enter == "" ? 0 : enter}}
    </div>
    <div class="list">
      <keyboard v-for="item in keys" :val="item"></keyboard>
    </div>
  </div>
</template>

<script>
  import Keyboard from '../../components/keyboard.vue'
  export default{
    components: {
      Keyboard
    },
    data () {
      return {
        keys: ['clear', '+', '-', '*', '/', '0', '1', '2', '3',
          '4', '5', '6', '7', '8', '9', '='
        ]
      }
    },
    computed: {
      result () {
        //通過this.$store獲取倉庫的資料result
        return this.$store.state.result
      },
      enter () {
        //通過this.$store獲取倉庫的資料enter
        return this.$store.state.enter
      }
    }
  }
</script>

<style lang="scss" scoped>
  //...
</style>
  • 執行效果
    這裡寫圖片描述

Vue爬坑之路還很漫長

相關推薦

Vuex理解運用

初步認識Vuex Vuex是什麼? 官方解釋 Vuex是一個專為Vue開發的應用程式的狀態管理模式,它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 我的理解 Vuex採用類似全域性物件的形式來管理所有

STM32 DMA的理解運用

DMA(Direct Memory Access)直接儲存器訪問,可以講資料從一個地址空間複製到另一個地址空間。 為什麼出現了DMA? 由於進行資料傳輸過程中,會一直佔用CPU,而CPU不能執行其他的程式。所以就想找一種方式來“自動”控制資料的傳輸,此時CPU就可以幹其他事情。 STM32中,

java筆記--對訊號量Semaphore的理解運用

https://www.cnblogs.com/XHJT/p/3910406.html java Semaphore 訊號量的使用:   在java中,提供了訊號量Semaphore的支援。 Semaphore類是一個計數訊號量,必須由獲取它的執行緒釋放,  通

2017/10/28String的理解運用

  一,“==”與equals()   執行以下程式碼,如何解釋其輸出結果?   1 public class StringPool {   2   3 public static void main(String args[])   4 {   5   6 String

立即執行函式(IIFE)的理解運用

作為JavaScript的常用語法,立即執行函式IIFE(Immediately-Invoked Function Expression)是值得我們認真去學習探究的。 一、建立函式的兩種方式 我們先從基礎講起,要建立一個JS函式,有兩種方式。

ThreadLoacl的理解運用

public class Student { private int age=0; public int getAge() { return this.age; } public void setAge(int age) {

在Activity/Fragment以外使用Toast(涉及到對context上下文的理解運用

轉載 http://www.nowamagic.net/academy/detail/50110211 一      在 Activity 使用 Toast 這種是最基本的使用,Toast的第一個引數就是Context,一般在Activity中

vuex理解使用

vuex 研究了一段時間的vuex,只是簡單地會用,對於裏面的一些知識點還是不太會表達,就目前,先梳理一下自己對vuex中幾個主要概念的理解 vuex一個專為 Vue.js應用程序開發的狀態管理模式,主要是為了解決組件間的通信,方便數據的共用,如果不使用vuex,數據之間或許可以用父子組件的傳值來

設計模式之簡單理解裝飾器模式運用

1.什麼是裝飾器模式 ​ 裝飾器模式(Decorator Pattern)允許向一個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的一個包裝。 ​ 這種模式建立了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。 2、裝飾器模

A*算法的理解簡單實現

update for port 移動 ont 效率 print 估算 net 基本定義 一種尋路算法,特點是:啟發式的,效率高,基本思路比較簡單。 用途 尋路。在指定的地圖上,考慮到地圖上的移動代價,找到最優的路徑。 核心概念 開表,閉表,估值函數。 開表 開表,記錄了當前

mysql體系結構理解分析

interface storage 編程語言 數據庫 結構圖 接觸mysql有一年多了,但是始終是一個偶爾用用的狀態,對其原理性的東西研究不夠,在不少mysql相關的暑假中提到mysql體系結構,很清楚解析了mysql的各個模塊分層和主要功能特性,在理解此功能特性後,會剛好的幫助我

每天一個JS 小demo之韓雪冬輪播圖。主要知識點:html,css布局,對於數組和對象的理解運用

身高 全局 borde ava ebo 空間 use mouseout desc 1 @charset "utf-8"; 2 /* CSS Document */ 3 4 * { padding: 0; margin: 0; } 5 li { list-st

分針網——每日分享:HTTP協議理解應用總結

http 應用總結 領取免費IT資料 加群:272292492 更多文章:www.f-z.cn Request & Response Re

對WEB標準以及W3C的理解認識

ron 提高 搜索引擎 class 編程 簡單 命名 組織 事情 網頁主要由三個部分組成,表現、結構和行為。 我理解的就是: html是名詞--表現 css是形容詞--結構 javascript是動詞--行為 以上這三個東西就形成了一個完整的網頁,但是js改變時,可以會

c語言函數指針的理解使用

tdi 是不是 使用 模塊 html c語言函數 討論 編譯器 麻煩 轉載:http://www.cnblogs.com/haore147/p/3647262.html 1.函數指針的定義   顧名思義,函數指針就是函數的指針。它是一個指針,指向一個函數。看例子: A) c

accp8.0轉換教材第1章多線程理解練習

獲取 stack 創建 exc 同步方法 emp 默認 一個 ack 一.單詞部分: ①process進程 ②current當前的③thread線程④runnable可獲取的 ⑤interrupt中斷⑥join加入⑦yield產生⑧synchronize同時發生 二.預習部

accp8.0轉換教材第9章JQuery相關知識理解練習

ntb 驗證 單詞 手機號碼 sdn load .com read 要求 自定義動畫 一.單詞部分: ①animate動畫②remove移除③validity有效性 ④required匹配⑤pattern模式 二.預習部分 1.簡述JavaScript事件和jquery事件

accp8.0轉換教材第10章Ajax和jQuery理解練習

put else win send jquery實現 servlet ews window 8.0 C/S (Client/Server)結構,即大家熟知的客戶機和服務器結構。 B/S(Browser/Server)結構即瀏覽器和服務器結構。 認識ajax 、XMLHttp

accp8.0轉換教材第11章JAjax加護擴展理解練習

func 原生態 事件 提交 pic 請求 val .get table ①雜記:前面有原生態JavaScript實現ajax這裏又多了更簡單的方法實現ajax ②$.get()方法的常用參數 參數 類型 說明 url String 必選,規定發送地址 d

對WEB標準以及W3C的理解認識?

出了 htm 表現 一定的 css 編程 用戶體驗 組成 命名 web標準簡單來說可以分為結構、表現和行為。其中結構主要是有HTML標簽組成。或許通俗點說,在頁面body裏面我們寫入的標簽都是為了頁面的結構。表現即指css樣式表,通過css可以是頁面的結構標簽更具美感。行為