Vuex的理解與運用
初步認識Vuex
Vuex是什麼?
- 官方解釋
Vuex是一個專為Vue開發的應用程式的狀態管理模式,它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 - 我的理解
Vuex採用類似全域性物件的形式來管理所有元件的公用資料,如果你想想修改這個全域性物件的資料,是可以的,但沒那麼簡單,你得按照Vuex提供的方式來修改,不能自己隨意用自己的方式來修改。
Vuex的好處
- 狀態儲存是響應式:當 Vue 元件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那麼相應的元件也會相應地得到高效更新。
- 不能隨意修改Vuex的狀態
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可以是頁面的結構標簽更具美感。行為