寫(xiě)給新手同學(xué)的vuex快速上手指北小結(jié)
本文介紹了寫(xiě)給新手同學(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)聽(tīng)state改變重新渲染視圖-->
<template>
<div>
{{name}}
</div>
<template>
export default {
computed: {
name() {
return this.$store.state.name;
}
},
}
注意: data中的變量如果和computed中的變量重名,data優(yōu)先,注意命名
獲取多個(gè)state值,寫(xiě)多個(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ì)象寫(xiě)到業(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ù),不要誤解這句話,以為異步不能用,異步可以用在里面,視圖的渲染,取值都沒(méi)有問(wèn)題,問(wèn)題在于:調(diào)試的時(shí)候,一些瀏覽器調(diào)試插件不能正確監(jiān)聽(tīng)state。所以方便調(diào)試,盡量將異步寫(xiě)入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.是沒(méi)有命名空間
沒(méi)有命名空間: 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: {
}
};
無(wú)命名空間 取值
this.$store.state.moduleA.cat
或者
...mapState({
cat:state=>state.moduleA.cat,
}),
不可以(state是局部,不可以這么取):
...mapState([
"cat"
]),
無(wú)命名空間 改變值
和原來(lái)一樣,因?yàn)榉椒ㄊ亲?cè)在全局的
this.$store.commit("setCat",666);
或者
...mapMutations([
"setCat"
])
有命名空間: state, action、mutation 和 getter 是局部的,模塊間命名互相不沖突,可以重名。
namespaced 設(shè)置為true,即可開(kāi)啟
<!--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)于寫(xiě)給新手同學(xué)的vuex快速上手指北小結(jié)的文章就介紹到這了,更多相關(guān)vuex快速上手內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue中集成省市區(qū)街四級(jí)地址組件的實(shí)現(xiàn)過(guò)程
我們?cè)陂_(kāi)發(fā)中常會(huì)遇到選擇地址的需求,有時(shí)候只需要選擇省就可以,有時(shí)候則需要選擇到市、縣,以至于鄉(xiāng)鎮(zhèn),甚至哪個(gè)村都有可能,下面這篇文章主要給大家介紹了關(guān)于vue中集成省市區(qū)街四級(jí)地址組件的相關(guān)資料,需要的朋友可以參考下2022-12-12
Vue3源碼分析組件掛載創(chuàng)建虛擬節(jié)點(diǎn)
這篇文章主要為大家介紹了Vue3源碼分析組件掛載創(chuàng)建虛擬節(jié)點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
vue.js實(shí)現(xiàn)數(shù)據(jù)庫(kù)的JSON數(shù)據(jù)輸出渲染到html頁(yè)面功能示例
這篇文章主要介紹了vue.js實(shí)現(xiàn)數(shù)據(jù)庫(kù)的JSON數(shù)據(jù)輸出渲染到html頁(yè)面功能,結(jié)合實(shí)例形式分析了vue.js針對(duì)本地json數(shù)據(jù)的讀取、遍歷輸出相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
Vue如何整合mavon-editor編輯器(markdown編輯和預(yù)覽)
這篇文章主要介紹了Vue整合mavon-editor編輯器(markdown編輯和預(yù)覽)的相關(guān)知識(shí),mavon-editor是目前比較主流的markdown編輯器,重點(diǎn)介紹它的使用方法,需要的朋友可以參考下2022-10-10
vue-router嵌套路由方式(頁(yè)面路徑跳轉(zhuǎn)但頁(yè)面顯示空白)
這篇文章主要介紹了vue-router嵌套路由方式(頁(yè)面路徑跳轉(zhuǎn)但頁(yè)面顯示空白),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
22個(gè)Vue優(yōu)化技巧(項(xiàng)目實(shí)用)
演示代碼使用 Vue3 + ts + Vite 編寫(xiě),但是也會(huì)列出適用于 Vue2 的優(yōu)化技巧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

