Vuex入門(mén)到上手教程
一、前言
當(dāng)我們的應(yīng)用遇到多個(gè)組件共享狀態(tài)時(shí),會(huì)需要多個(gè)組件依賴于同一狀態(tài)。傳參的方法對(duì)于多層嵌套的組件將會(huì)非常繁瑣,并且對(duì)于兄弟組件間的狀態(tài)傳遞無(wú)能為力。在搭建下面頁(yè)面時(shí),你可能會(huì)對(duì) vue 組件之間的通信感到崩潰 ,特別是非父子組件之間通信。此時(shí)就應(yīng)該使用vuex,輕松可以搞定組件間通信問(wèn)題。
二、什么是Vuex
Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開(kāi)發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。這里的關(guān)鍵在于集中式存儲(chǔ)管理。 這意味著本來(lái)需要共享狀態(tài)的更新是需要組件之間通訊的,而現(xiàn)在有了vuex,就組件就都和store通訊了 。
三、什么時(shí)候使用Vuex
雖然 Vuex 可以幫助我們管理共享狀態(tài),但也附帶了更多的概念和框架。這需要對(duì)短期和長(zhǎng)期效益進(jìn)行權(quán)衡。 如果您的應(yīng)用夠簡(jiǎn)單,您最好不要使用 Vuex,因?yàn)槭褂?Vuex 可能是繁瑣冗余的。一個(gè)簡(jiǎn)單的global event bus就足夠您所需了。但是, 如果您需要構(gòu)建一個(gè)中大型單頁(yè)應(yīng)用,您很可能會(huì)考慮如何更好地在組件外部管理狀態(tài),Vuex 將會(huì)成為自然而然的選擇。
四、Vuex安裝(限定開(kāi)發(fā)環(huán)境為 vue-cli)
首先要安裝vue-cli腳手架,對(duì)于大陸用戶,建議將npm的注冊(cè)表源設(shè)置為國(guó)內(nèi)的鏡像(淘寶鏡像),可以大幅提升安裝速度。
npm config set registry https://[registry.npm.taobao.org](http://registry.npm.taobao.org/) npm config get registry//配置后可通過(guò)下面方式來(lái)驗(yàn)證是否成功 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.如何通過(guò)Vuex來(lái)實(shí)現(xiàn)如下效果?
①創(chuàng)建一個(gè)store.js文件
import Vue from "vue"
import Vuex from "vuex"
Vue.use(Vuex)
const store = new Vuex.Store({
state: { //這里的state必須是JSON,是一個(gè)對(duì)象
count: 1 //這是初始值
},
mutations: {//突變,羅列所有可能改變state的方法
add(state) {
state.count++; //直接改變了state中的值,而并不是返回了一個(gè)新的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)
})
③新建一個(gè)模板count.vue
<template>
<div>
<h2>{{msg}}</h2><hr/>
<h2>{{$store.state.count}}-{{count}}</h2>//這兩種寫(xiě)法都可以
<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ù)可以接受一個(gè)對(duì)象,也可以接收一個(gè)數(shù)組
};
</script>
由于 store 中的狀態(tài)是響應(yīng)式的,當(dāng) Vue 組件從 store 中讀取狀態(tài)的時(shí)候,若 store 中的狀態(tài)發(fā)生變化,那么相應(yīng)的組件也會(huì)相應(yīng)地得到高效更新。 在組件中調(diào)用 store 中的狀態(tài)簡(jiǎn)單到僅需要在計(jì)算屬性中返回即可。改變store 中的狀態(tài)的唯一途徑就是顯式地提交 (commit) mutations。
這樣,我們就可以實(shí)現(xiàn)自增1或是自減1,那假如我們想要點(diǎn)擊一次實(shí)現(xiàn)自增2,這該如何實(shí)現(xiàn),也就是如何向Mutations傳值?
2.如何在Mutations里傳遞參數(shù)
先store.js文件里給add方法加上一個(gè)參數(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如何實(shí)現(xiàn)計(jì)算過(guò)濾操作
getters從表面是獲得的意思,可以把他看作在獲取數(shù)據(jù)之前進(jìn)行的一種再編輯,相當(dāng)于對(duì)數(shù)據(jù)的一個(gè)過(guò)濾和加工。你可以把它看作store.js的計(jì)算屬性。
例如:要對(duì)store.js文件中的count進(jìn)行操作,在它輸出前,給它加上100。
首先要在store.js里Vuex.Store()里引入getters
getters:{
count:state=>state.count+=100
}
然后在Count.vue中對(duì)computed進(jìn)行配置,在vue 的構(gòu)造器里邊只能有一個(gè)computed屬性,如果你寫(xiě)多個(gè),只有最后一個(gè)computed屬性可用,所以要用展開(kāi)運(yùn)算符”…”對(duì)上節(jié)寫(xiě)的computed屬性進(jìn)行一個(gè)改造。
computed: {
...mapState(["count"]),
count() {
return this.$store.getters.count;
}
}
需要注意的是,此時(shí)如果點(diǎn)擊'+',就會(huì)增加102,如果點(diǎn)擊'-',就會(huì)增加99,最后的結(jié)果是mutations和getters共同作用的。
4.actions如何實(shí)現(xiàn)異步修改狀態(tài)
actions和上面的Mutations功能基本一樣,不同點(diǎn)是, actions是異步的改變state狀態(tài),而Mutations是同步改變狀態(tài) 。
①在store.js中聲明actions
actions: {
addAction(context) {
context.commit('add', 2);//一開(kāi)始執(zhí)行add,并傳遞參數(shù)2
setTimeout(() => {
context.commit('reduce')
}, 2000);//兩秒后會(huì)執(zhí)行reduce
console.log('我比reduce提前執(zhí)行');
},
reduceAction({
commit
}) {
commit('reduce')
}
}
actions是可以調(diào)用Mutations里的方法的,調(diào)用add和reduce兩個(gè)方法。在addAction里使用setTimeOut進(jìn)行延遲執(zhí)行。在actions里寫(xiě)了兩個(gè)方法addAction和reduceAction,兩個(gè)方法傳遞的參數(shù)也不一樣。
context:上下文對(duì)象,這里你可以理解稱store本身。 {commit}:直接把commit對(duì)象傳遞過(guò)來(lái),可以讓方法體邏輯和代碼更清晰明了
②模板中的使用
<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'])
}
最后得到如下效果:點(diǎn)擊addAction按鈕事件時(shí),先累加2,兩秒后再減去1,而addNumber事件則不能實(shí)現(xiàn)異步效果。

ps:如果想訪問(wèn)源代碼,請(qǐng)猛戳 git地址 。如果覺(jué)得對(duì)您有用,請(qǐng)給本文的github加個(gè)star,萬(wàn)分感謝
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
flask和vue前后端分離項(xiàng)目部署的示例代碼
本文主要介紹了flask和vue前后端分離項(xiàng)目部署的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
Vue項(xiàng)目中使用WebUploader實(shí)現(xiàn)文件上傳的方法
WebUploader是由 Baidu WebFE(FEX) 團(tuán)隊(duì)開(kāi)發(fā)的一個(gè)簡(jiǎn)單的以 HTML5為主 , FLASH為輔 的現(xiàn)代 文件上傳組件 。這篇文章主要介紹了在Vue項(xiàng)目中使用WebUploader實(shí)現(xiàn)文件上傳,需要的朋友可以參考下2019-07-07
vue中頁(yè)面跳轉(zhuǎn)攔截器的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue中頁(yè)面跳轉(zhuǎn)攔截器的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
Vue3編程流暢技巧使用setup語(yǔ)法糖拒絕寫(xiě)return
這篇文章主要為大家介紹了Vue3編程流暢技巧使用setup語(yǔ)法糖拒絕寫(xiě)return的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Vue源碼之關(guān)于vm.$delete()/Vue.use()內(nèi)部原理詳解
這篇文章主要介紹了Vue源碼之關(guān)于vm.$delete()/Vue.use()內(nèi)部原理詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
vue實(shí)現(xiàn)購(gòu)物車的小練習(xí)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)購(gòu)物車的小練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
vue.js click點(diǎn)擊事件獲取當(dāng)前元素對(duì)象的操作
這篇文章主要介紹了vue.js click點(diǎn)擊事件獲取當(dāng)前元素對(duì)象的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

