摘要:說實在話,我在閱讀文檔的時候,也很難以去理解,甚至覺得沒有使用它我也可以。介紹那么到底是什么引用官網(wǎng)的說法就是是一個專為應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。
前言
先說句前話,如果不是接觸大型項目,不需要有多個子頁面,不使用vuex也是完全可以的。
說實在話,我在閱讀vuex文檔的時候,也很難以去理解vuex,甚至覺得沒有使用它我也可以。但是直到我在項目碰到下面這些問題:
當路由切換的時候,原本路由的數(shù)據(jù)太多,傳遞過去太麻煩。
有些數(shù)據(jù)是多個路由需要用到的,那我就需要從后臺獲取多次數(shù)據(jù)
當然,這些問題都可以解決,就是在實例化vue對象的時候,就將這些數(shù)據(jù)綁定在window對象上面。但是我們也不得不設想:
萬一數(shù)據(jù)太多了,那么可閱讀性是不是會下降
如果只是修改多帶帶的數(shù)據(jù),是不是所有的頁面都可以更新
對于第一個問題,答案是肯定的,雖然說,我們現(xiàn)在也可以用模塊化的思想去使可閱讀性更加好,但是沒有一個規(guī)范,對于剛?cè)胧猪椖康目偸请y以理解。
對于第二個問題,當你頁面少的時候,是不會出現(xiàn)這樣的問題的,但是如果頁面多了,你就會發(fā)現(xiàn),當你把window.$data里面的數(shù)據(jù)更新的時候,所有頁面的計算屬性都會失效,就是你無論怎么修改數(shù)據(jù),頁面都不會更新數(shù)據(jù)。
這時候,就需要用到我們的vuex了。
vuex介紹那么vuex 到底是什么?
引用官網(wǎng)的說法就是Vuex是一個專為Vue.js應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。
是不是還是有點難以理解,其實簡單的說vuex就是把這個項目的所有數(shù)據(jù)都存儲在一個地方,方便修改和獲取數(shù)據(jù)。
例如,我們從下面這張圖給大家先簡單的分析一下
在這張圖片里面我們很明顯可以看到三個部分
Vue Components 表示vue里面的組件
Backend API 后臺API
vuex 組件里面的數(shù)據(jù)管理
我們可以生動形象的理解,如果說Vuex是一個倉庫,那么么Vue Components就就是售貨者,負責把倉庫里面的東西展現(xiàn)出來,Backend API就相當于入貨的人,負責將貨物買進來(也就是后臺返回數(shù)據(jù)給前端,保存在vuex里面)。而vuex就是倉庫,這個倉庫里面有貨物state,有管理貨物進出的Muations
引用vuex在說state之前,我們可以先在我們vue項目引用vuex
npm install vuex
然后在我們的src目錄下新建一個store的文件夾,在store文件夾里面新建一個index.js的文件
// ~/src/store/index.js import Vue from "Vue" import Vuex from "Vuex" // 在這里聲明實例一個Vue 去引用Vuex狀態(tài)管理插件 // 這樣就可以減少在main.js里面的代碼量了 Vue.use(Vuex) // 返回store實例對象 export default new Vuex.Store({ })
這里說一下吧,這里Store其實就是相當vuex實例化的一個倉庫。
data替代者state為什么說state是data的替代者呢?
很容易理解,就是講組件里面的局部參數(shù),改成了一個可以全局使用的參數(shù)state,例如,我們在me.vue組件引用的數(shù)據(jù)todo。
那么我們可以在store里面這樣實例化它出來
// ~/src/store/index.js // ... export default new Vuex.Store({ state: { todo: [] } })
那么,我們在組件里面怎么使用這個數(shù)據(jù)呢?
// me.vue組件文件 // ... // ...
是不是很簡單,但是我們不可能每次使用這個值都要獲取一次吧,這些vue團隊也都想好了,我們可以通過計算屬性來獲取state里面的數(shù)據(jù)。
// ... // ...
相當于
// ... // ...計算屬性Getter
有時候我們會需要對state的數(shù)據(jù)進行一些過濾操作,例如我們只要在todo里面大于10的數(shù)字,如果是用computed的話,我們就需要使用filter函數(shù),為了更加簡便,vuex也給我們提供了計算屬性getter。
我們可以修改我們的~/src/store/index文件
// ... export default new Vuex.Store({ state: { todo: [] }, getters: { todo: state => state.todo.filter(number => number > 10) } })
然后在me.vue里面引用
// ... // ...
這樣就可以簡單拿到大于10的todo數(shù)據(jù)了
修改state的Mutation我們說了怎么獲取數(shù)據(jù),但是我們應該怎么修改數(shù)據(jù)呢,是不是直接賦值給數(shù)據(jù)就可以了呢?
答案當然不是,vuex規(guī)定了,我們只能用Mutation來進行修改數(shù)據(jù),那么,我們怎么進行修改數(shù)據(jù)呢?
修改我們的~/src/store/index.js
// ... export default new Vuex.Store({ state: { todo: [] }, getters: { todo: state => state.todo.filter(number => number > 10) }, mutations: { revsiseTode: (state, oneTodo) => (state.todo = oneTodo) // 修改state的值 } })
然后在我們的me.vue組件里面修改
// ... // 在多帶帶構(gòu)建的版本中輔助函數(shù)為 Vuex.mapGetters import { mapGetters } from "vuex" // 在多帶帶構(gòu)建的版本中輔助函數(shù)為 Vuex.mapMutations import { mapMutations } from "vuex" export default { computed: { ...mapGetters([ // 映射 this.todo 為 store.state.todo "todo" ]) }, method: { ...mapMutations( [ // 將 `this.revsiseTode()` 映射為 `this.$store.commit("revsiseTode")` // 如果想傳遞參數(shù)可以使用this.$store.commit("revsiseTode", oneTode) // 或者Action "revsiseTode" ] ) } }Action的使用
寫了這么久,終于到了Action的出場了,其實不管怎么說,Action主要是為了與后臺交互而使用的屬性,這里,我就假設todo的數(shù)據(jù)在路由/me/gettodo里面能夠獲取,因此,修改~/store/index.js
// ... export default new Vuex.Store({ state: { todo: [] }, getters: { todo: state => state.todo.filter(number => number > 10) }, mutations: { revsiseTode: (state, oneTodo) => (state.todo = oneTodo) // 修改state的值 }, actions: { getTodo: context => Vue.http.get("/me/gettodo", (res) => { context.commit("revsiseTode", res.body.todo) }) } })
然后就可以通過觸發(fā)我們的actions來提交mutations去修改state的數(shù)據(jù)了,在me.vue修改
// ... // 在多帶帶構(gòu)建的版本中輔助函數(shù)為 Vuex.mapGetters import { mapGetters } from "vuex" // 在多帶帶構(gòu)建的版本中輔助函數(shù)為 Vuex.mapMutations import { mapActions } from "vuex" export default { computed: { ...mapGetters([ // 映射 this.todo 為 store.state.todo "todo" ]) }, method: { ...mapActions( [ "reviseTodo", // 將 `this.reviseTodo()` 映射為 `this.$store.dispatch("reviseTodo") ] ) } } // ...vuex目錄結(jié)構(gòu)
上面主要只是簡單的講了一下vuex的使用,也只是講了一部分,不過相信看了這里之后再去官網(wǎng)就會有更深的理解。當然這些都是簡單的使用,如果想把vuex運用到項目,必須把他們模塊化更加好看,vuex官網(wǎng)也為我們提供了規(guī)范的項目目錄結(jié)構(gòu),我這里就不多啰嗦幾句了。
總結(jié)vuex其實不難,我一開始也以為很難一直學不會,只要多使用就會覺得,其實也就只是別人都封裝好了的方法,我們?nèi)ナ褂眠@個簡便的倉庫就行了。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/115608.html
摘要:說實在話,我在閱讀文檔的時候,也很難以去理解,甚至覺得沒有使用它我也可以。介紹那么到底是什么引用官網(wǎng)的說法就是是一個專為應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。 前言 先說句前話,如果不是接觸大型項目,不需要有多個子頁面,不使用vuex也是完全可以的。 說實在話,我在閱讀vuex文檔的時候,也很難以去理解v...
摘要:說實在話,我在閱讀文檔的時候,也很難以去理解,甚至覺得沒有使用它我也可以。介紹那么到底是什么引用官網(wǎng)的說法就是是一個專為應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。 前言 先說句前話,如果不是接觸大型項目,不需要有多個子頁面,不使用vuex也是完全可以的。 說實在話,我在閱讀vuex文檔的時候,也很難以去理解v...
摘要:的核心庫只關注視圖層,并且非常容易學習,非常容易與其它庫或已有項目整合。的目標是通過盡可能簡單的實現(xiàn)響應的數(shù)據(jù)綁定和組合的視圖組件。并不是框架,只是和他旁邊的生態(tài)環(huán)境組成了一個框架,下面,貼一個官方的漸進式框架介紹圖吧,方便理解。 前言 本人學習了一段時間的vue,并嘗試寫了一些小Demo之后,將vue投入了幾個項目之后,一直在邊學習邊使用,經(jīng)過看了vue,vuex,vue-route...
摘要:的核心庫只關注視圖層,并且非常容易學習,非常容易與其它庫或已有項目整合。的目標是通過盡可能簡單的實現(xiàn)響應的數(shù)據(jù)綁定和組合的視圖組件。并不是框架,只是和他旁邊的生態(tài)環(huán)境組成了一個框架,下面,貼一個官方的漸進式框架介紹圖吧,方便理解。 前言 本人學習了一段時間的vue,并嘗試寫了一些小Demo之后,將vue投入了幾個項目之后,一直在邊學習邊使用,經(jīng)過看了vue,vuex,vue-route...
摘要:重定向可以實現(xiàn)某些需要根據(jù)特定邏輯改變頁面原本路由的需求,例如簡單的未登錄狀態(tài)下的頁面訪問個人信息路由時應該重定向到登錄路由頁面。 前言 為了給讀者更好的體驗,去理解vue-router和下一篇介紹vuex,決定還是來一個實戰(zhàn)教程來帶大家更加的去深入理解vue-router,在這之前,讀者先自行了解和去官網(wǎng)下載npm和node,附:npm官網(wǎng) 項目構(gòu)建 這里我采用vue-cli+web...
閱讀 3027·2021-11-02 14:40
閱讀 843·2019-08-30 15:53
閱讀 1264·2019-08-30 15:53
閱讀 3259·2019-08-30 13:53
閱讀 3304·2019-08-29 12:50
閱讀 1131·2019-08-26 13:49
閱讀 1862·2019-08-26 12:20
閱讀 3660·2019-08-26 11:33