寫給新手同學(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。基本操作:this.$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-03
Ant Design Vue Pro靜態(tài)路由如何改為動(dòng)態(tài)路由
這篇文章主要介紹了Ant Design Vue Pro靜態(tài)路由如何改為動(dòng)態(tài)路由問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue基礎(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-03
Ant?Design-vue?解決input前后空格問題(推薦)
最近做項(xiàng)目遇到這樣一個(gè)問題輸入框不允許有前后空格但字符中間可以有空格,怎么解決這個(gè)問題呢,接下來小編把a(bǔ)nt?Design-vue?解決input前后空格問題的實(shí)現(xiàn)代碼分享給大家,感興趣的朋友一起看看吧2022-10-10

