您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何快速入門Vuex,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
一、前言
當我們的應用遇到多個組件共享狀態時,會需要多個組件依賴于同一狀態。傳參的方法對于多層嵌套的組件將會非常繁瑣,并且對于兄弟組件間的狀態傳遞無能為力。在搭建下面頁面時,你可能會對 vue 組件之間的通信感到崩潰 ,特別是非父子組件之間通信。此時就應該使用vuex,輕松可以搞定組件間通信問題。
二、什么是Vuex
Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。這里的關鍵在于集中式存儲管理。 這意味著本來需要共享狀態的更新是需要組件之間通訊的,而現在有了vuex,就組件就都和store通訊了 。
三、什么時候使用Vuex
雖然 Vuex 可以幫助我們管理共享狀態,但也附帶了更多的概念和框架。這需要對短期和長期效益進行權衡。 如果您的應用夠簡單,您最好不要使用 Vuex,因為使用 Vuex 可能是繁瑣冗余的。一個簡單的global event bus就足夠您所需了。但是, 如果您需要構建一個中大型單頁應用,您很可能會考慮如何更好地在組件外部管理狀態,Vuex 將會成為自然而然的選擇。
四、Vuex安裝(限定開發環境為 vue-cli)
首先要安裝vue-cli腳手架,對于大陸用戶,建議將npm的注冊表源設置為國內的鏡像(淘寶鏡像),可以大幅提升安裝速度。
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來實現如下效果?
①創建一個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的方法 add(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> <h3>{{msg}}</h3><hr/> <h3>{{$store.state.count}}-{{count}}</h3>//這兩種寫法都可以 <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 函數可以接受一個對象,也可以接收一個數組 }; </script>
由于 store 中的狀態是響應式的,當 Vue 組件從 store 中讀取狀態的時候,若 store 中的狀態發生變化,那么相應的組件也會相應地得到高效更新。 在組件中調用 store 中的狀態簡單到僅需要在計算屬性中返回即可。改變store 中的狀態的唯一途徑就是顯式地提交 (commit) mutations。
這樣,我們就可以實現自增1或是自減1,那假如我們想要點擊一次實現自增2,這該如何實現,也就是如何向Mutations傳值?
2.如何在Mutations里傳遞參數
先store.js文件里給add方法加上一個參數n
mutations: { add(state,n) { state.count+=n; }, reduce(state){ state.count--; } }
然后在Count.vue里修改按鈕的commit( )方法傳遞的參數
addNumber() { return this.$store.commit("add",2); }, reduceNumber() { return this.$store.commit("reduce"); }
3.getters如何實現計算過濾操作
getters從表面是獲得的意思,可以把他看作在獲取數據之前進行的一種再編輯,相當于對數據的一個過濾和加工。你可以把它看作store.js的計算屬性。
例如:要對store.js文件中的count進行操作,在它輸出前,給它加上100。
首先要在store.js里Vuex.Store()里引入getters
getters:{ count:state=>state.count+=100 }
然后在Count.vue中對computed進行配置,在vue 的構造器里邊只能有一個computed屬性,如果你寫多個,只有最后一個computed屬性可用,所以要用展開運算符”…”對上節寫的computed屬性進行一個改造。
computed: { ...mapState(["count"]), count() { return this.$store.getters.count; } }
需要注意的是,此時如果點擊'+',就會增加102,如果點擊'-',就會增加99,最后的結果是mutations和getters共同作用的。
4.actions如何實現異步修改狀態
actions和上面的Mutations功能基本一樣,不同點是, actions是異步的改變state狀態,而Mutations是同步改變狀態 。
①在store.js中聲明actions
actions: { addAction(context) { context.commit('add', 2);//一開始執行add,并傳遞參數2 setTimeout(() => { context.commit('reduce') }, 2000);//兩秒后會執行reduce console.log('我比reduce提前執行'); }, reduceAction({ commit }) { commit('reduce') } }
actions是可以調用Mutations里的方法的,調用add和reduce兩個方法。在addAction里使用setTimeOut進行延遲執行。在actions里寫了兩個方法addAction和reduceAction,兩個方法傳遞的參數也不一樣。
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事件則不能實現異步效果。
上述內容就是如何快速入門Vuex,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。