Vuex入門到上手教程

這篇文章主要介紹了Vuex入門到上手教程流济,小編覺得挺不錯的奔则,現(xiàn)在分享給大家,也給大家做個參考未蝌。一起跟隨小編過來看看吧

一驮吱、前言

當我們的應(yīng)用遇到多個組件共享狀態(tài)時,會需要多個組件依賴于同一狀態(tài)萧吠。傳參的方法對于多層嵌套的組件將會非常繁瑣糠馆,并且對于兄弟組件間的狀態(tài)傳遞無能為力。在搭建下面頁面時怎憋,你可能會對 vue 組件之間的通信感到崩潰 又碌,特別是非父子組件之間通信。此時就應(yīng)該使用vuex绊袋,輕松可以搞定組件間通信問題毕匀。

image

二、什么是Vuex

Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式癌别。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)皂岔,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。這里的關(guān)鍵在于集中式存儲管理展姐。 這意味著本來需要共享狀態(tài)的更新是需要組件之間通訊的躁垛,而現(xiàn)在有了vuex,就組件就都和store通訊了 圾笨。

三教馆、什么時候使用Vuex

雖然 Vuex 可以幫助我們管理共享狀態(tài),但也附帶了更多的概念和框架擂达。這需要對短期和長期效益進行權(quán)衡土铺。 如果您的應(yīng)用夠簡單,您最好不要使用 Vuex,因為使用 Vuex 可能是繁瑣冗余的板鬓。一個簡單的global event bus就足夠您所需了悲敷。但是, 如果您需要構(gòu)建一個中大型單頁應(yīng)用俭令,您很可能會考慮如何更好地在組件外部管理狀態(tài)后德,Vuex 將會成為自然而然的選擇。

四抄腔、Vuex安裝(限定開發(fā)環(huán)境為 vue-cli)

首先要安裝vue-cli腳手架瓢湃,對于大陸用戶窟赏,建議將npm的注冊表源設(shè)置為國內(nèi)的鏡像(淘寶鏡像),可以大幅提升安裝速度箱季。

`npm config` `set` `registry https:``//``[registry.npm.taobao.org](http:``//registry``.npm.taobao.org/)`
`npm config get registry``//``配置后可通過下面方式來驗證是否成功`
`npm` `install` `-g cnpm --registry=[https:``//registry``](https:``//registry/``).npm.taobao.org`
`//cnpm``安裝腳手架`
`cnpm` `install` `-g vue-cli`
`vue init webpack my-vue`
`cd` `my-vue`
`cnpm` `install`
`cnpm run dev`

腳手架安裝好后,再安裝vuex

cnpm install vuex --save

五棍掐、如何使用Vuex

1.如何通過Vuex來實現(xiàn)如下效果藏雏?

image

①創(chuàng)建一個store.js文件

`import Vue from` `"vue"`
`import Vuex from` `"vuex"`
`Vue.use(Vuex)`
`const store =` `new` `Vuex.Store({`
`state: {` `//這里的state必須是JSON,是一個對象`
`count: 1` `//這是初始值`
`},`
`mutations: {``//突變作煌,羅列所有可能改變state的方法`
`ad(state) {`
`state.count++;` `//直接改變了state中的值掘殴,而并不是返回了一個新的state`
`},`
`reduce(state){`
`state.count--;`
`}`
`}`
`});`
`export` `default` `store;``//用export default 封裝代碼,讓外部可以引用`

②在main.js文件中引入store.js文件

`import store from` `"./vuex/store"`
`new` `Vue({`
`router,`
`store,`
`el:` `'#app'``,`
`render: h => h(App)`
`})`

③新建一個模板count.vue

`<``template``>`
`<``div``>`
`<``h2``>{{msg}}</``h2``><``hr``/>`
`<``h2``>{{$store.state.count}}-{{count}}</``h2``>//這兩種寫法都可以`
`<``button` `@``click``=``"addNumber"``>+</``button``>`
`<``button` `@``click``=``"reduceNumber"``>-</``button``>`
`</``div``>`
`</``template``>`
`<``script``>`
`import {mapState} from 'vuex'`
`export default {`
`data() {`
`return {`
`msg: "Hello Vuex"`
`};`
`},`
`methods: {`
`addNumber() {`
`return this.$store.commit("add");`
`},`
`reduceNumber() {`
`return this.$store.commit("reduce");`
`}`
`},`
`computed: mapState(['count'])// 映射 this.count 到 this.$store.state.count`
`mapState 函數(shù)可以接受一個對象粟誓,也可以接收一個數(shù)組`
`};`
`</``script``>`

由于 store 中的狀態(tài)是響應(yīng)式的奏寨,當 Vue 組件從 store 中讀取狀態(tài)的時候,若 store 中的狀態(tài)發(fā)生變化鹰服,那么相應(yīng)的組件也會相應(yīng)地得到高效更新病瞳。 在組件中調(diào)用 store 中的狀態(tài)簡單到僅需要在計算屬性中返回即可。改變store 中的狀態(tài)的唯一途徑就是顯式地提交 (commit) mutations悲酷。

這樣套菜,我們就可以實現(xiàn)自增1或是自減1,那假如我們想要點擊一次實現(xiàn)自增2设易,這該如何實現(xiàn)逗柴,也就是如何向Mutations傳值?

2.如何在Mutations里傳遞參數(shù)

先store.js文件里給add方法加上一個參數(shù)n

`mutations: {`
`add(state,n) {`
`state.count+=n;`
`},`
`reduce(state){`
`state.count--;`
`}`
`}`

然后在Count.vue里修改按鈕的commit( )方法傳遞的參數(shù)

`addNumber() {`
`return` `this``.$store.commit(``"add"``,2);`
`},`
`reduceNumber() {`
`return` `this``.$store.commit(``"reduce"``);`
`}`
  • 3.getters如何實現(xiàn)計算過濾操作**

getters從表面是獲得的意思顿肺,可以把他看作在獲取數(shù)據(jù)之前進行的一種再編輯,相當于對數(shù)據(jù)的一個過濾和加工戏溺。你可以把它看作store.js的計算屬性。

例如:要對store.js文件中的count進行操作屠尊,在它輸出前旷祸,給它加上100。

首先要在store.js里Vuex.Store()里引入getters

`getters:{`
`count:state=>state.count+=100`
`}`

然后在Count.vue中對computed進行配置讼昆,在vue 的構(gòu)造器里邊只能有一個computed屬性肋僧,如果你寫多個,只有最后一個computed屬性可用控淡,所以要用展開運算符”…”對上節(jié)寫的computed屬性進行一個改造嫌吠。

`computed: {`
`...mapState([``"count"``]),`
`count() {`
`return` `this``.$store.getters.count;`
`}`
`}`

需要注意的是,此時如果點擊'+'掺炭,就會增加102辫诅,如果點擊'-',就會增加99,最后的結(jié)果是mutations和getters共同作用的涧狮。

4.actions如何實現(xiàn)異步修改狀態(tài)

actions和上面的Mutations功能基本一樣炕矮,不同點是么夫, actions是異步的改變state狀態(tài),而Mutations是同步改變狀態(tài) 肤视。

①在store.js中聲明actions

`actions: {`
`addAction(context) {`
`context.commit(``'add'``, 2);``//一開始執(zhí)行add,并傳遞參數(shù)2`
`setTimeout(() => {`
`context.commit(``'reduce'``)`
`}, 2000);``//兩秒后會執(zhí)行reduce`
`console.log(``'我比reduce提前執(zhí)行'``);`
`},`
`reduceAction({`
`commit`
`}) {`
`commit(``'reduce'``)`
`}`
`}`

actions是可以調(diào)用Mutations里的方法的,調(diào)用add和reduce兩個方法档痪。在addAction里使用setTimeOut進行延遲執(zhí)行。在actions里寫了兩個方法addAction和reduceAction邢滑,兩個方法傳遞的參數(shù)也不一樣腐螟。

context:上下文對象,這里你可以理解稱store本身困后。 {commit}:直接把commit對象傳遞過來乐纸,可以讓方法體邏輯和代碼更清晰明了

②模板中的使用

`<``p``>`
`<``button` `@``click``=``"addNumber"``>+</``button``>`
`<``button` `@``click``=``"reduceNumber"``>-</``button``>`
`</``p``>`
`<``p``> `
`<``button` `@``click``=``"addAction"``>+</``button``>//新增`
`<``button` `@``click``=``"reduceAction"``>-</``button``>//新增`
`</``p``>`
 
`import { mapState, mapGetters, mapActions } from` `"vuex"``;`
`methods:{`
`...mapMutations([`

`'add'``,``'reduce'`
`]),`
`...mapActions([``'addAction'``,``'reduceAction'``])`
`}`

最后得到如下效果:點擊addAction按鈕事件時,先累加2摇予,兩秒后再減去1汽绢,而addNumber事件則不能實現(xiàn)異步效果。

以上就是本文的全部內(nèi)容侧戴,希望對大家的學(xué)習(xí)有所幫助宁昭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酗宋,隨后出現(xiàn)的幾起案子久窟,更是在濱河造成了極大的恐慌,老刑警劉巖本缠,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥扛,死亡現(xiàn)場離奇詭異,居然都是意外死亡丹锹,警方通過查閱死者的電腦和手機稀颁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楣黍,“玉大人匾灶,你說我怎么就攤上這事∽馄” “怎么了阶女?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哩治。 經(jīng)常有香客問我秃踩,道長,這世上最難降的妖魔是什么业筏? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任憔杨,我火速辦了婚禮,結(jié)果婚禮上蒜胖,老公的妹妹穿的比我還像新娘消别。我一直安慰自己抛蚤,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布寻狂。 她就那樣靜靜地躺著岁经,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛇券。 梳的紋絲不亂的頭發(fā)上缀壤,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音怀读,去河邊找鬼。 笑死骑脱,一個胖子當著我的面吹牛菜枷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叁丧,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼啤誊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拥娄?” 一聲冷哼從身側(cè)響起蚊锹,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稚瘾,沒想到半個月后牡昆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡摊欠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年丢烘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片些椒。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡播瞳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出免糕,到底是詐尸還是另有隱情赢乓,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布石窑,位于F島的核電站牌芋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏松逊。R本人自食惡果不足惜姜贡,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棺棵。 院中可真熱鬧楼咳,春花似錦熄捍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苹熏,卻和暖如春碟贾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轨域。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工袱耽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人干发。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓朱巨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枉长。 傳聞我的和親對象是個殘疾皇子冀续,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 姓名:岳沁 學(xué)號:17101223458 轉(zhuǎn)載自:http://blog.csdn.net/h5_queensty...
    丘之心閱讀 2,148評論 0 1
  • 安裝 npm npm install vuex --save 在一個模塊化的打包系統(tǒng)中,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,945評論 0 7
  • vuex 場景重現(xiàn):一個用戶在注冊頁面注冊了手機號碼必峰,跳轉(zhuǎn)到登錄頁面也想拿到這個手機號碼洪唐,你可以通過vue的組件化...
    sunny519111閱讀 8,022評論 4 111
  • Vuex是什么? Vuex 是一個專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式吼蚁。它采用集中式存儲管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,122評論 0 6
  • 最詳細的Vuex教程 什么是Vuex凭需? vuex是一個專門為vue.js設(shè)計的集中式狀態(tài)管理架構(gòu)。狀態(tài)肝匆?我把它理解...
    北京大數(shù)據(jù)蘇煥之閱讀 6,156評論 0 6