1. 程式人生 > >vue2.0中vuex到底是幹什麼的?怎麼使用?

vue2.0中vuex到底是幹什麼的?怎麼使用?

關於vuex類的新聞最近很多,看到眼熱就去查了下資料,然後扯出來一堆flux、redux、state、state之類的概念,以及大型工程必要性之類的。看官方手冊也是昏昏然。

然而,我還是弄懂了!我準備從demo出發,以同樣的一個最簡單的demo,演示兩種情況下的程式碼編寫情況:

假設一個微小的應用,有一個標籤顯示數字,兩個按鈕分別做數字的加一和減一的操作。使用者介面看起來是這樣的:看以下程式碼:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
  <p>{{count}}
    <button @click="inc">+</button>
    <button @click="dec">-</button>
  </p>
</div>
<script>
new Vue({
  el:'#app',
  data () {
    return {
      count: 0
    }
  },
  methods: {
    inc () {
      this.count++
    },
    dec () {
      this.count--
    }
  }
})
</script>

很簡單,頁面就是一個數字,倆個按鈕,一個+,一個-;整個程式碼結構非常清晰,程式碼是程式碼,資料是資料,這也是我一直以來非常喜歡vue.js的重要原因。程式碼就是放在methods陣列內的兩個函式inc、dec,被指令@click關聯到button上。而data內返回一個屬性count,此屬性通過{{count}}繫結到標籤p內。點選+按鈕顯示的數字就會加一下,點選-號,就相反。

現在來看看,同樣的demo app,使用vuex完成的程式碼的樣子,再一次,如下程式碼不是程式碼片段,是可以貼入到你的html檔案內,並且直接使用瀏覽器開啟執行的。

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/
[email protected]
"></script> <div id="app"> <p>{{count}} <button @click="inc">+</button> <button @click="dec">-</button> </p> </div> <script> const store = new Vuex.Store({ state: { count: 0 }, mutations: { inc: state => state.count++, dec: state => state.count-- } }) const app = new Vue({ el: '#app', computed: { count () { return store.state.count } }, methods: { inc () { store.commit('inc') }, dec () { store.commit('dec') } } }) </script>

我們先看到有哪些重要的變化:

  1. 新的程式碼添加了對[email protected]指令碼的依賴。這是當然的,因為你需要使用vuex的技術,當然需要引用它

  2. methods陣列還是這兩個方法,這和demo1是一樣的;但是方法內的計算邏輯,不再是在函式內進行,而是提交給store物件!這是一個新的物件!

  3. count資料也不再是一個data函式返回的物件的屬性;而是通過計算欄位來返回,並且在計算欄位內的程式碼也不是自己算的,而是轉發給store物件。再一次store物件!

就是說,之前在vue例項內做的操作和資料的計算現在都不再自己做了,而是交由物件store來做了。這突然讓我想到就先餐廳現在都不在洗碗了,都交給政府認證的機構來洗了。

說回正題。store物件是Vuex.Store的例項。在store內有分為state物件和mutations物件,其中的state放置狀態,mutations則是一個會引發狀態改變的所有方法。正如我們看到的,目前的state物件,其中的狀態就只有一個count。而mutations有兩個成員,它們引數為state,在函式體內對state內的count成員做加1和減1的操作。

活還是那些活,現在引入了一個store物件,把資料更新的活給攬過去,不再需要vue例項自己計算了,代價是引入了新的概念和層次。那麼好處是什麼(一個土耳其古老的發問)?

vuex解決了元件之間共享同一狀態的麻煩問題。當我們的應用遇到多個元件共享狀態時,會需要:

  1. 多個元件依賴於同一狀態。傳參的方法對於多層巢狀的元件將會非常繁瑣,並且對於兄弟元件間的狀態傳遞無能為力。這需要你去學習下,vue編碼中多個元件之間的通訊的做法。

  2. 來自不同元件的行為需要變更同一狀態。我們經常會採用父子元件直接引用或者通過事件來變更和同步狀態的多份拷貝。

以上的這些模式非常脆弱,通常會導致無法維護的程式碼。來自官網的一句話:Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態。這裡的關鍵在於集中式儲存管理。這意味著本來需要共享狀態的更新是需要元件之間通訊的,而現在有了vuex,就元件就都和store通訊了。問題就自然解決了。

這就是為什麼官網再次會提到Vuex構建大型應用的價值。如果您不打算開發大型單頁應用,使用 Vuex 可能是繁瑣冗餘的。確實是如此——如果您的應用夠簡單,您最好不要使用 Vuex


相關推薦

vue2.0vuex到底是幹什麼的?怎麼使用?

關於vuex類的新聞最近很多,看到眼熱就去查了下資料,然後扯出來一堆flux、redux、state、state之類的概念,以及大型工程必要性之類的。看官方手冊也是昏昏然。 然而,我還是弄懂了!我準備從demo出發,以同樣的一個最簡單的demo,演示兩種情況下的程式碼編寫情

Vue2.0,“漸進式框架”和“自向上增量開發的設計”是什麼

在我看來,漸進式代表的含義是:主張最少。每個框架都不可避免會有自己的一些特點,從而會對使用者有一定的要求,這些要求就是主張,主張有強有弱,它的強勢程度會影響在業務開發中的使用方式。比如說,Angular,它兩個版本都是強主張的,如果你用它,必須接受以下東西:- 必須使用它的模組機制- 必須使用它的依賴注入-

Vue2.0,“漸進式框架”和“自向上增量開發的設計”是什麼知乎回答

在我看來,漸進式代表的含義是:主張最少。 每個框架都不可避免會有自己的一些特點,從而會對使用者有一定的要求,這些要求就是主張,主張有強有弱,它的強勢程度會影響在業務開發中的使用方式。 比如說,Angular,它兩個版本都是強主張的,如果你用它,必須接受以下東西: - 必須使用它的模組機制 - 必須使用它的依賴

Vue2.0v-for叠代語法變化(key、index)

分鐘 eth data href head htm ref fields type 語法發生了變化:http://blog.csdn.net/sinat_35512245/article/details/53966788 新數組語法 value in arr (value,

vue2.0 #$emit,$on的使用詳解

額外 return turn isp div 傳遞 call sele 發的 vue1.0中 vm.$dispatch 和 vm.$broadcast 被棄用,改用$emit,$on 1. vm.$on( event, callback ) 監聽當前實例上的自定義事件。

vue2.0的watch和計算屬性computed

str rect register rst 定向 one 特點 created doc watch和computed均可以監控程序員想要監控的對象,當這些對象發生改變之後,可以觸發回調函數做一些邏輯處理 watch監控自身屬性變化 <!DOCTYPE html&

vue2.0使用sass

oba html 例子 round ron src 括號 logs 大型 第一部分:Sass語言 Sass是一種強大的css擴展語言(css本身並不是一門語言),它允許你使用變量、嵌套規則、mixins、導入等css沒有但開發語言(如Java、C#、Ruby等)

Vue2.0集成UEditor 富文本編輯器

main button all 分享 init htm temp con AD 在vue的’項目中遇到了需要使用富文本編輯器的需求,在github上看了很多vue封裝的editor插件,很多對圖片上傳和視頻上傳的支持並不是很好,最終還是決定使用UEditor。 這類的文章網

vue2.0實現首字母大寫的過濾器

過濾器1:實現一個首字母大寫的過濾器(vue2.0中已經去除了內置的過濾器)過濾器本身就是一個函數vue2.0中實現首字母大寫的過濾器

vue2.0v-on綁定自定義事件的理解

按鈕 自定義事件 監聽器 code 自定義 pre strong 數據 解耦 vue中父組件通過prop傳遞數據給子組件,而想要將子組件的數據傳遞給父組件,則可以通過自定義事件的綁定。 每個Vue實例都實現了【事件接口】,即: 1、使用 $on(eventName) 監聽事

vue2.0的:is和is的區別

此文首發於 lijing0906.github.io/ 最近,工作之餘在翻閱vue.js的官方文件,在檢視到動態元件和解析 DOM 模板時的注意事項的時候,講到一個特殊的is特性,覺得很有意思,就來寫一篇自己理解的總結。 現場 寫栗子實踐 其實看過之後,其實是有點懵的,

Vue2.0獲取dom元素

Vue.js雖然說是資料驅動頁面的,但是有時候我們也要獲取dom物件進行一些操作。 vue的不同版本獲取dom物件的方法不一樣   Vue.js  1.0版本中,通過v-el繫結,然後通過this.els.XXX來獲取 Vue.js  2.0版本中。我們通過給元素繫結re

vue2.0v-on繫結自定義事件

vue中父元件通過prop傳遞資料給子元件,而想要將子元件的資料傳遞給父元件,則可以通過自定義事件的繫結。 每個 Vue 例項都實現了事件介面,即: 使用 $on(eventName) 監聽事件 使用 $emit(eventName) 觸發事

安裝vue2.0vue-easy-slider的滑塊元件外掛

安裝 npm i -S vue-easy-slider demo1: <template> <slider animation="fade"> <slider-item v-for="(i, index) in list" :key="index"&g

Vue2.0使用v-el,v-rel出現問題

問題描述 在高仿餓了麼實戰專案中使用v-el指令獲取DOM,但出現下圖的錯誤:   v-el指令   程式碼 template   template script   script  

實現VUE2.0props資料雙向繫結的一種方案

問題描述 在vue2.0中,我們通過props方法來接受父元件所傳過來的值,但是這個過程是單項的,父元件可以改變傳給子元件的值,但是如果子元件想改變所接受的值並傳給父元件是不可以的,會報以下的錯誤。 該錯誤的意思的是:避免直接更改一個PROP,因為每當父元件重新呈現時

vue2.0 引入和使用 axios

vue2.0 中引入和使用 axios Axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。 Features 從瀏覽器中建立 XMLHttpRequests 從 node.js 建立 http 請求 支援 Prom

Vue2.0使用less給元素新增背景圖片出現的問題

在使用less在Vue.js中給元素新增背景圖片時 或者你會出現這樣的寫法 background-image: url('../img/' + @{bg_url} + '2x.png'); 或者

Vue2.0v-for迭代語法變化(key、index)

今天,在寫關於Vue2.0的程式碼中發現 $key這個值並不能渲染成功,問題如下: 結果這個物件的key值並不能夠顯示: 後來查閱了文件才知道,這是因為在Vue2.0中,v-for迭代語法已

vue2.0的元件通訊

vue中元件是模組化開發的基礎,在元件A中使用了元件B,那他們必然需要資料通訊,父元件要將資料傳遞給自組建,子元件要通知父元件自己內部發生的事情。 在vue.js中父子元件的關係可以總結為props down, events up,父元件通過props向下傳遞