vue之使用vuex進(jìn)行狀態(tài)管理詳解
vuex進(jìn)行狀態(tài)管理
首先學(xué)習(xí)vuex必須先知道vue原理
Vue是一個(gè)典型的MVVM框架,模型(Model)只是普通的JavaScript對(duì)象,修改它則視圖(View)會(huì)自動(dòng)更新。這種設(shè)計(jì)讓狀態(tài)管理變得非常簡(jiǎn)單而直觀
Vue實(shí)現(xiàn)這種數(shù)據(jù)雙向綁定的效果,需要三大模塊:
Observer:能夠?qū)?shù)據(jù)對(duì)象的所有屬性進(jìn)行監(jiān)聽,如有變動(dòng)可拿到最新值并通知訂閱者Compile:對(duì)每個(gè)元素節(jié)點(diǎn)的指令進(jìn)行掃描和解析,根據(jù)指令模板替換數(shù)據(jù),以及綁定相應(yīng)的更新函數(shù)Watcher:作為連接Observer和Compile的橋梁,能夠訂閱并收到每個(gè)屬性變動(dòng)的通知,執(zhí)行指令綁定的相應(yīng)回調(diào)函數(shù),從而更新視圖
大概分為這么幾類
vuex是什么呢
vuex是實(shí)現(xiàn)狀態(tài)管理的工具 可以用來管理大型項(xiàng)目的工具
下面是一個(gè)簡(jiǎn)單的vuex的結(jié)構(gòu)
index是主文件

//index//
import Vue from 'vue'
import Vuex from 'vuex'
import * as getters from './getters'
import * as actions from './actions'
import * as mutations from './mutations'
Vue.use(Vuex)
const state = {
username: '123'
}
const store = new Vuex.Store({
state,
getters,
actions,
mutations
})
export default store
進(jìn)行一個(gè)簡(jiǎn)單地賬戶管理
//actions文件
// 給action注冊(cè)事件處理函數(shù)。當(dāng)這個(gè)函數(shù)被觸發(fā)時(shí)候,將狀態(tài)提交到mutations中處理
export function modifyAName({commit}, name) { // commit 提交;name即為點(diǎn)擊后傳遞過來的參
return commit ('modifyAName', name)
}
// ES6精簡(jiǎn)寫法
//export const modifyAName = ({commit},name) => commit('modifyAName', name)
//motations文件
// 提交 mutations是更改Vuex狀態(tài)的唯一合法方法
export const modifyAName = (state, name) => { // A組件點(diǎn)擊更改餐館名稱為 A餐館
state.resturantName = name // 把方法傳遞過來的參數(shù),賦值給state中的resturantName
}
//getters文件
// 獲取最終的狀態(tài)信息
export const resturantName = state => state.resturantName
//組件A/methods函數(shù)
sub(){
let log = document.querySelector("#log").value;
let reg = document.querySelector("#reg").value;
userapi("/users/userpsw",{name:log,psw:reg}, (mes) => {
if(mes === 1){
console.log(log)
this.$store.commit("modifyAName",log)
// 賬戶名稱
console.log(this.$store.getters.resturantName)
document.querySelector(".text").innerHTML = "登錄成功"
this.$router.push({ path: '/my' })
}else{
document.querySelector(".text").innerHTML = "登錄失敗"
}
})
},
組件B/computed
computed:{
username(){//調(diào)用username即可 {{username}}
return this.$store.getters.resturantName
}
},



vuex狀態(tài)管理基本使用
通過npm安裝vuex
npm install vuex --save
使用vuex
import Vuex from 'vuex'
Vue.use(Vuex)
//賦值給一個(gè)變量,然后引入
let store = new Vuex.Store({
...
})
//為了更好的維護(hù),且體現(xiàn)模塊化,可以寫在別的js文件中,然后導(dǎo)入
import store from './store' //創(chuàng)建一個(gè)store文件夾,默認(rèn)為文件夾下的index.js文件
new Vue({
...
store,
...
})使用vuex基本結(jié)構(gòu)
new Vuex.Store({
//狀態(tài)
state: {
count: 100
},
//將狀態(tài)裝飾,或刷選,以想要的結(jié)果輸出
getters: {
hasUnit () {
return this.state.count.filter(count => count + 1)
}
},
//可以理解為變更狀態(tài)的方法,第一個(gè)參數(shù)為state,可以再添加自定義參數(shù),注意:只能進(jìn)行同步
mutations: {
increment (state) {
state.count++
}
},
//可控制的提交mutation事件,彌補(bǔ)mutation無法異步
actions: {
increment (state) {
setTimeout(() =>
state.commit('increment'), 30)
}
}
})為了更好的維護(hù),往往將store文件寫成以下結(jié)構(gòu) ,名字自定義,但是需要知道每個(gè)文件的作用

index.js:主要作為導(dǎo)出store,作為匯總的文件state.js:作為定義的變量集合,作為一個(gè)對(duì)象導(dǎo)出getters.js:作為主要是獲取state中變量值的方法,return出state相應(yīng)的值,或者length等等的一些state變量的信息mutations-type.js: 作為一些方法等命名的變量,防止書寫錯(cuò)誤
![]()
mutaintions.js:存放修改state變量的同步方法,這里可以的方法名就是用了mutations-type.js中的變量命名,[object.value]這種方式是ES6中的語法

action.js:存放修改state變量的異步方法
在組件中引用,不使用mapXXXXX輔助函數(shù)情況下
state和getter:直接在computed計(jì)算屬性中使用
computed: {
count () {
return this.$store.state.count
},
hasUnit () {
return this.$store.getters.hasUnit
}
}mutations和actions則被作為事件調(diào)用,可以放在methods,watch等等,有事件調(diào)用的時(shí)候都可以
methods: {
add () {
this.$store.commit('increment') // mutations使用commit調(diào)用
},
asyncAdd () {
this.$store.dispatch('increment') // actions使用dispatch調(diào)用
}
}通過mapXXXX輔助函數(shù)來引用
先確保組件中已導(dǎo)入vuex的相應(yīng)輔助函數(shù):用到哪個(gè)導(dǎo)入哪個(gè)
import { mapState } from 'vuex'
import { mapGetters } from 'vuex'
import { mapMutations } from 'vuex'
import { mapActions } from 'vuex'
//導(dǎo)入多個(gè):ES6模塊
import { mapState, mapGetters } from 'vuex'然后根據(jù)你的需求使用對(duì)應(yīng)的輔助函數(shù),前提是已經(jīng)導(dǎo)入
computed: {
...mapState([
'count'
]),
...mapGetters([
'addUnit'
])
}
//使用this.count, this.addUnitmethods: {
...mapMutations([
'increment'
]),
...mapActions({
addNum: 'increment'
})
add () {
this.increment()
}
}
//可以被當(dāng)做事件調(diào)用,為了避免命名沖突,可以使用重命名,需要使用{}而不是[]模塊:Module
當(dāng)項(xiàng)目很大的時(shí)候,很多版塊在一起容易混淆,希望每個(gè)版塊的信息歸每個(gè)版塊下面,易于維護(hù)
//局部模塊引用的第一個(gè)參數(shù)state都是自己模塊里的
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})以moduleA為例 ,可以新建一個(gè)JS文件,然后通過import導(dǎo)入到總的vuex管理中
const state = {
count: 1
};
const getters = {
get(state) {
return state.count;
}
};
const mutations = {
add(state) {
state.count++;
},
reduce(state) {
state.count--;
}
};
const actions = {
add: ({ commit }) => {
commit("add");
},
reduce: ({ commit }) => {
commit("reduce");
}
};
export default {
namespaced: true, // 使該模塊帶有命名空間,使它在命名上會(huì)按路徑進(jìn)行命名 如moduleA/state
state,
getters,
mutations,
actions
};在使用了模塊后,我們可以通過以下方式獲取,這里只用了輔助函數(shù)展示
computed: {
...mapState({
count: state => state.moduleA.count
}),
...mapGetters({
get: "moduleB/get"
})
}methods: {
...mapMutations(
'moduleA', {addA:'add', reduceB:'reduce'} // 重命名就用對(duì)象包裹
),
...mapActions(
'moduleA', ['add', 'reduce']
)
}如果想引用根目錄下的狀態(tài),需要傳入第三個(gè)參數(shù)
const moduleA = {
// ...
getters: {
addUnit (state, getters, rootState) { //rootState為根下的狀態(tài)
return state.count + rootState.count
}
}
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vite+vue3+ts項(xiàng)目新建以及解決遇到的問題
vite是一個(gè)基于Vue3單文件組件的非打包開發(fā)服務(wù)器,它具有快速的冷啟動(dòng),不需要等待打包操作,下面這篇文章主要給大家介紹了關(guān)于vite+vue3+ts項(xiàng)目新建以及解決遇到的問題的相關(guān)資料,需要的朋友可以參考下2023-06-06
Vue3中使用ref標(biāo)簽對(duì)組件進(jìn)行操作方法
這篇文章主要介紹了Vue3中使用ref標(biāo)簽對(duì)組件進(jìn)行操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Vue中router.beforeEach與beforeRouteEnter的區(qū)別及說明
這篇文章主要介紹了Vue中router.beforeEach與beforeRouteEnter的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue3?TypeScript?實(shí)現(xiàn)useRequest詳情
本文介紹了Vue3?TypeScript實(shí)現(xiàn)useRequest詳情,useRequest可能是目前社區(qū)中最強(qiáng)大,最接地氣的請(qǐng)求類?Hooks了??梢愿采w99%的網(wǎng)絡(luò)請(qǐng)求場(chǎng)景,無論是讀還是寫,無論是普通請(qǐng)求還是分頁請(qǐng)求,無論是緩存還是防抖節(jié)流,通通都能支持,關(guān)于其介紹需要的小伙伴可以參考一下2022-05-05
前端Vue項(xiàng)目部署到服務(wù)器的全過程以及踩坑記錄
使用Vue做前后端分離項(xiàng)目時(shí),通常前端是單獨(dú)部署,用戶訪問的也是前端項(xiàng)目地址,因此前端開發(fā)人員很有必要熟悉一下項(xiàng)目部署的流程,下面這篇文章主要給大家介紹了關(guān)于前端Vue項(xiàng)目部署到服務(wù)器的全過程以及踩坑記錄的相關(guān)資料,需要的朋友可以參考下2023-05-05
Vue-cli中為單獨(dú)頁面設(shè)置背景色的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Vue-cli中為單獨(dú)頁面設(shè)置背景色的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
關(guān)于el-form表單驗(yàn)證中的validator與validate使用時(shí)的問題
這篇文章主要介紹了關(guān)于el-form表單驗(yàn)證中的validator與validate使用時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Vue?3?中動(dòng)態(tài)賦值?ref?的應(yīng)用示例解析
Vue3引入了Composition?API,其中ref是核心概念,允許開發(fā)者聲明響應(yīng)式狀態(tài),本文通過一個(gè)具體示例,探討了在Vue3中如何使用ref進(jìn)行動(dòng)態(tài)賦值,尤其是在處理DOM相關(guān)操作時(shí)的應(yīng)用,通過ref動(dòng)態(tài)賦值,可以有效管理組件內(nèi)的狀態(tài),提高代碼的可維護(hù)性和清晰度2024-09-09

