寫給新手同學(xué)的vuex快速上手指北小結(jié)
本文介紹了寫給新手同學(xué)的vuex快速上手指北小結(jié),分享給大家,具體如下
引入
//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 使用時(shí): import {mapState,mapMutations} from 'vuex'
State篇
state更新實(shí)時(shí)渲染是基于==computed==這個(gè)計(jì)算屬性的,直接賦給data只能賦值初始值,不會(huì)隨著state改變實(shí)時(shí)渲染
<!--state改變不會(huì)實(shí)時(shí)渲染--> 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)先,注意命名
獲取多個(gè)state值,寫多個(gè)函數(shù)return,很繁瑣,所以有==mapState==輔助函數(shù)
<!--取多個(gè)很冗余,繁瑣--> 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' ]) }
我們有局部計(jì)算,怎么和mapState一起用?
import { mapState } from 'vuex' export default { computed:{ getTime(){ return 123; }, ...mapState([ 'token', 'name' ]) } }
我們?yōu)樗饌€(gè)別名
<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ā)生點(diǎn)什么
<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),使用一個(gè)自定義名字的函數(shù) balabala(state){ return state.token + this.pikaqiu; } }) } } </script>
取個(gè)對(duì)象值怎么破?
<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>
這種方式取對(duì)象寫到業(yè)務(wù)里不直觀,也不共用,下節(jié)==Getter==有更優(yōu)的方案
Getter篇
Getter是針對(duì)state的【對(duì)象】值提前做一些處理,以便用的時(shí)候直接提取
可以 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 <!--用的時(shí)候,和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)試的時(shí)候,一些瀏覽器調(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按功能拆分成多個(gè)文件,利于維護(hù)管理,module 分為2種情況,1.是有命名空間, 2.是沒有命名空間
沒有命名空間: action、mutation 和 getter 是注冊(cè)在全局的,所以要注意,方法函數(shù)不要設(shè)置同名了,如果同名了會(huì)都執(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" ]),
無命名空間 改變值
和原來一樣,因?yàn)榉椒ㄊ亲?cè)在全局的 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注冊(cè)時(shí)候呢個(gè)key值--> <!--也可以別名,方法和之前一樣,就是第一個(gè)參數(shù)是空間名--> ...mapState("moduleA",[ "cat" ])
有命名空間 改變值
<!--只是第一個(gè)參數(shù)是空間名,其他操作一樣--> ...mapMutations("moduleA",[ "setCat" ]) this.setCat(888); 或者: this.$store.commit("moduleA/setCat",666);
最后 plugins
vuex頁(yè)面刷新會(huì)丟失數(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)于寫給新手同學(xué)的vuex快速上手指北小結(jié)的文章就介紹到這了,更多相關(guān)vuex快速上手內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue全局注冊(cè)中的kebab-case和PascalCase用法
這篇文章主要介紹了Vue全局注冊(cè)中的kebab-case和PascalCase用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Ant Design Vue Pro靜態(tài)路由如何改為動(dòng)態(tài)路由
這篇文章主要介紹了Ant Design Vue Pro靜態(tài)路由如何改為動(dòng)態(tài)路由問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue基礎(chǔ)之data存儲(chǔ)數(shù)據(jù)及v-for循環(huán)用法示例
這篇文章主要介紹了vue基礎(chǔ)之data存儲(chǔ)數(shù)據(jù)及v-for循環(huán)用法,結(jié)合實(shí)例形式分析了vue.js使用data存儲(chǔ)數(shù)據(jù)、讀取數(shù)據(jù)及v-for遍歷數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Ant?Design-vue?解決input前后空格問題(推薦)
最近做項(xiàng)目遇到這樣一個(gè)問題輸入框不允許有前后空格但字符中間可以有空格,怎么解決這個(gè)問題呢,接下來小編把a(bǔ)nt?Design-vue?解決input前后空格問題的實(shí)現(xiàn)代碼分享給大家,感興趣的朋友一起看看吧2022-10-10