您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了vuex怎么快速上手,內(nèi)容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
引入
//store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ state: {...}, mutations: {...}, actions: {...} }) export default store //main.js ... import store from './store' Vue.prototype.$store = store const app = new Vue({ store,... }) ... //test.vue 使用時: import {mapState,mapMutations} from 'vuex'
State篇
state更新實時渲染是基于==computed==這個計算屬性的,直接賦給data只能賦值初始值,不會隨著state改變實時渲染
<!--state改變不會實時渲染--> export default { data() { return { name:this.$store.state.name, }; }, }
<!--監(jiān)聽state改變重新渲染視圖--> <template> <div> {{name}} </div> <template> export default { computed: { name() { return this.$store.state.name; } }, }
注意: data中的變量如果和computed中的變量重名,data優(yōu)先,注意命名
獲取多個state值,寫多個函數(shù)return,很繁瑣,所以有==mapState==輔助函數(shù)
<!--取多個很冗余,繁瑣--> export default { computed: { token(){ return this.$store.state.token; }, name(){ return this.$store.state.name; } }, }
<!--mapState 直接取出--> import { mapState } from 'vuex' export default { computed: mapState([ 'token', 'name' ]) }
我們有局部計算,怎么和mapState一起用?
import { mapState } from 'vuex' export default { computed:{ getTime(){ return 123; }, ...mapState([ 'token', 'name' ]) } }
我們?yōu)樗饌€別名
<template> <div> xiaokeai,dahuilang是我們?nèi)〉膭e名 token,name是state的值 {{xiaokeai}} </div> <template> <script> import { mapState } from 'vuex' export default { computed:{ ...mapState({ xiaokeai:"token", dahuilang:"name", }) } } </script>
我們要state和data發(fā)生點什么
<template> <div> 假如token的值123; balabala的值就是 123皮卡皮 {{balabala}} </div> <template> <script> import { mapState } from 'vuex' export default { data(){ return { pikaqiu:"皮卡皮卡" } } computed:{ ...mapState({ xiaokeai:"token", dahuilang:"name", // 為了能夠使用 `this` 獲取局部狀態(tài),使用一個自定義名字的函數(shù) balabala(state){ return state.token + this.pikaqiu; } }) } } </script>
取個對象值怎么破?
<template> <div> {{daSon}} {{xiaoSon}} </div> </template> <script> import { mapState } from 'vuex' export default { data(){ return { pikaqiu:"皮卡皮卡" } } computed:{ ...mapState({ daSon: state=>state.obj.yeye.baba.daSon, xiaoSon:state=>state.obj.yeye.baba.xiaoSon, }) } } </script>
這種方式取對象寫到業(yè)務(wù)里不直觀,也不共用,下節(jié)==Getter==有更優(yōu)的方案
Getter篇
Getter是針對state的【對象】值提前做一些處理,以便用的時候直接提取
可以 this.$store.getters.xxx 使用,也可以使用mapGetters輔助函數(shù),==輔助函數(shù)注意:== 和state一樣,注入在computed中
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { obj: { yeye: { baba: { daSon: "老大", xiaoSon: "老二" } } } }, getters: { <!--將想要提取或者處理的值這里處理好--> getson: state => { return state.obj.yeye.baba; } } }) export default store <!--用的時候,和state一樣,也可以別名等等操作--> <template> <div> {{getson}} </div> </template> <script> import { mapGetters } from 'vuex' export default { computed: { ...mapGetters([ getson ]) } } </script>
Mutation篇
操作: this.$store.commit("名字","值");
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store({ state: { token: "vuex的token", }, mutations: { setToken(state, val) { state.token = val; } } }) export default store
mapMutations 輔助函數(shù),和state一樣,可以別名, ==注意:== 輔助函數(shù)注入在methods中
methods: { ...mapMutations([ 'setToken' ]) } <!--使用--> this.setToken(100); //token修改為100
Mutation 必須是同步函數(shù),不要誤解這句話,以為異步不能用,異步可以用在里面,視圖的渲染,取值都沒有問題,問題在于:調(diào)試的時候,一些瀏覽器調(diào)試插件不能正確監(jiān)聽state。所以方便調(diào)試,盡量將異步寫入action中
Action篇
注意action的 參數(shù)不是 state ,而是context,context里面包含commit,state?;静僮鳎簍his.$store.dispatch("函數(shù)名","值")
const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { increment (context) { context.commit('increment') } } }) <!--輔助函數(shù)操作 注入在methods中--> import { mapActions } from 'vuex' export default { methods: { ...mapActions([ "increment" ]) } } <!--使用--> this.increment(123);
module篇
module 目的將store按功能拆分成多個文件,利于維護管理,module 分為2種情況,1.是有命名空間, 2.是沒有命名空間
沒有命名空間: action、mutation 和 getter 是注冊在全局的,所以要注意,方法函數(shù)不要設(shè)置同名了,如果同名了會都執(zhí)行。
stete例外是局部。
import Vue from 'vue'; import Vuex from 'vuex'; import moduleA from "./modules/cat.js"; Vue.use(Vuex); const store = new Vuex.Store({ state: { token: "vuex的token", }, modules:{ moduleA } }) export default store; <!--moduleA.js--> export default { // namespaced: true, state: { cat:"我是cat", }, mutations: { setCat(state, val) { state.cat = val; } }, actions: { }, getters: { } };
無命名空間 取值
this.$store.state.moduleA.cat 或者 ...mapState({ cat:state=>state.moduleA.cat, }), 不可以(state是局部,不可以這么取): ...mapState([ "cat" ]),
無命名空間 改變值
和原來一樣,因為方法是注冊在全局的 this.$store.commit("setCat",666); 或者 ...mapMutations([ "setCat" ])
有命名空間: state, action、mutation 和 getter 是局部的,模塊間命名互相不沖突,可以重名。
namespaced 設(shè)置為true,即可開啟
<!--moduleA.js 文件--> export default { namespaced: true, state: { cat:"我是cat", } }
有命名空間取值
this.$store.state.moduleA.cat 或者 <!--注意這里:命名空間的名字帶上,在modules注冊時候呢個key值--> <!--也可以別名,方法和之前一樣,就是第一個參數(shù)是空間名--> ...mapState("moduleA",[ "cat" ])
有命名空間 改變值
<!--只是第一個參數(shù)是空間名,其他操作一樣--> ...mapMutations("moduleA",[ "setCat" ]) this.setCat(888); 或者: this.$store.commit("moduleA/setCat",666);
最后 plugins
vuex頁面刷新會丟失數(shù)據(jù),用vuex-persistedstate插件可解決
import createPersistedState from "vuex-persistedstate"; const store = new Vuex.Store({ state: {}, mutations: {}, actions: {}, getters: {}, modules:{}, plugins: [ createPersistedState({ storage: window.sessionStorage }) ] }) export default store
以上就是關(guān)于vuex怎么快速上手的內(nèi)容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。