欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue使用Vuex一步步封裝并使用store全過(guò)程

 更新時(shí)間:2023年01月10日 15:51:59   作者:aら 淼  
這篇文章主要介紹了Vue使用Vuex一步步封裝并使用store全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、安裝Vuex依賴

cnpm install vuex --save

二、一步步封裝store

1. main.js中全局引入store倉(cāng)庫(kù)(下一步創(chuàng)建)

import store from './store' //引入store
 
new Vue({
  el: '#app',
  router,
  store, //掛載store,this將自動(dòng)生成$store屬性
  template: '<App/>',
  components: { App }
})

掛載store,this將自動(dòng)生成$store屬性

2. this.$store

創(chuàng)建store倉(cāng)庫(kù):習(xí)慣在src下創(chuàng)建store文件夾,再創(chuàng)建index.js,內(nèi)容:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store();
 
export default store;

此時(shí)你已經(jīng)有了一個(gè)空的store全局倉(cāng)庫(kù),沒(méi)有任何功能,但可以在任何vue實(shí)例下使用 this.$store 去訪問(wèn)它。

  • store使用范圍均是可以全局使用;
  • let a=1; {a:a}.a 的縮寫是 {a}.a,即當(dāng)字典的鍵和值命名一樣時(shí),可以省略只寫a
  • state、getters、mutations、mutations均是Vuex封裝好的特殊變量,以下聲明的功能變量均是這些名字,一個(gè)好處是store掛載該功能時(shí)可以簡(jiǎn)寫(如3-1,本例均如此)。當(dāng)然你也可直接在store中寫功能(如3-2)。

3. this.$store.state

給store倉(cāng)庫(kù)讀取數(shù)據(jù)功能:state

/*********  3-1 **********/
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要設(shè)置的全局訪問(wèn)的state對(duì)象,賦予初始屬性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   }; 
 const store = new Vuex.Store({
       state
    });
 
export default store;

此時(shí)你的store倉(cāng)庫(kù)已經(jīng)有了存取數(shù)據(jù)的功能,可以用 this.$store.state.themeColor 等數(shù)據(jù)了。

下面是第二種寫法

/*********  3-2 **********/
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

const store = new Vuex.Store({
      state:{
       	 //要設(shè)置的全局訪問(wèn)的state對(duì)象,賦予初始屬性值
	     themeColor: {val:'blue',opacity:false},
	     changeThemeCount:0,
	     cache:''
       }
    });
 
export default store;

4. this.$store.getters(this. $store.state的升級(jí))

給state功能升級(jí),讓他擁有計(jì)算能力(類似vue中的computed方法):getters:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要設(shè)置的全局訪問(wèn)的state對(duì)象,賦予初始屬性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   }; 
const getters = {   //實(shí)時(shí)監(jiān)聽(tīng)state值的變化(最新?tīng)顟B(tài))
    getThemeColor(state) {  //定義函數(shù),返回處理過(guò)的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天則主題色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const store = new Vuex.Store({
       state, // 掛載存取數(shù)據(jù)功能
       getters //掛載數(shù)據(jù)計(jì)算功能
});
export default store;

此時(shí)使用 this.$store.getters.getThemeColor 獲取顏色,將自動(dòng)根據(jù)時(shí)間的不同自動(dòng)設(shè)置主題是否有透明的效果

5. this.$store.commit(‘mutations’)

給store倉(cāng)庫(kù)使用函數(shù)功能(只為操作state數(shù)據(jù)):mutations - 同步

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要設(shè)置的全局訪問(wèn)的state對(duì)象,賦予初始屬性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   }; 
const getters = {   //實(shí)時(shí)監(jiān)聽(tīng)state值的變化(最新?tīng)顟B(tài))
    getThemeColor(state) {  //定義函數(shù),返回處理過(guò)的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天則主題色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const mutations = {
    //自定義改變state初始值的方法,這里面的參數(shù)除了state之外還可以再傳額外的參數(shù)(變量或?qū)ο?;
    clearCatch(state) { 
        state.cache = "";
        state.changeThemeCount= 0;
    },
    setThemeColor(state,color,opacity){ 
       state.themeColor.val = color;
       state.themeColor.opacity = opacity;
       state.changeThemeCount++;
    }
};
const store = new Vuex.Store({
        state, // 掛載存取數(shù)據(jù)功能
       getters, //掛載數(shù)據(jù)計(jì)算功能
       mutations // 掛載函數(shù)功能
});
export default store;

此時(shí)可以使用 this.$store.commit(‘setThemeColor’,‘grey’,‘1’) 了(注意第一個(gè)參數(shù)是函數(shù)名,不是傳參給state的,state自己會(huì)傳,后兩個(gè)才是對(duì)應(yīng)傳參)。

可以主動(dòng)設(shè)置主題色和透明度,操作是同步的,即如果你在同一個(gè)組件連續(xù)調(diào)用多次setThemeColor函數(shù),獲取倉(cāng)庫(kù)中state.changeThemeCount的值是一樣的,下面介紹異步函數(shù)。

6. this.$store.dispatch(‘actions’)(this. $store.commit(‘mutations’)的升級(jí))

給store倉(cāng)庫(kù)的函數(shù)commit功能升級(jí)(只為異步操作mutations中的函數(shù)):actions - 異步

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要設(shè)置的全局訪問(wèn)的state對(duì)象,賦予初始屬性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   }; 
const getters = {   //實(shí)時(shí)監(jiān)聽(tīng)state值的變化(最新?tīng)顟B(tài))
    getThemeColor(state) {  //定義函數(shù),返回處理過(guò)的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天則主題色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const mutations = {
    //自定義改變state初始值的方法,這里面的參數(shù)除了state之外還可以再傳額外的參數(shù)(變量或?qū)ο?;
    clearCatch(state) { 
        state.cache = "";
        state.changeThemeCount= 0;
    },
    setThemeColor(state,color,opacity){ 
       state.themeColor.val = color;
       state.themeColor.opacity = opacity;
       state.changeThemeCount++;
    }
};
const actions = {
    //自定義觸發(fā)mutations里函數(shù)的方法,context與store 實(shí)例具有相同方法和屬性
    setThemeColorAction(context,color,opacity){
     	context.commit('setThemeColor',color,opacity);
    }
};
const store = new Vuex.Store({
       state, // 掛載存取數(shù)據(jù)功能
       getters, //掛載數(shù)據(jù)計(jì)算功能
       mutations, // 掛載函數(shù)功能
       actions, // 掛載異步函數(shù)
});
export default store;

此時(shí)可以使用 this.$store.dispatch(‘setThemeColorAction’,‘grey’,‘1’) 了(注意第一個(gè)參數(shù)是函數(shù)名,不是傳參給context的,context自己會(huì)傳,后兩個(gè)才是對(duì)應(yīng)傳參)。

可以主動(dòng)設(shè)置主題色和透明度,操作是異步的,即如果你在同一個(gè)組件連續(xù)調(diào)用多次setThemeColorAction函數(shù),獲取倉(cāng)庫(kù)中state.changeThemeCount的值就不是一樣的。

7. strict嚴(yán)格模式

export default new Vuex.Store({
  strict: true,
  state: {
    ...
  },
  ...
}

此模式下所有的狀態(tài)變更(即更新state)必須使用mutation(commit),如果在組件中直接修改state則會(huì)報(bào)錯(cuò)。這樣的好處是所有的state的更新都體現(xiàn)在倉(cāng)庫(kù)中,整改方便;使用devTools調(diào)試工具時(shí)可以跟蹤到狀態(tài)的修改。

三、modules 模塊化

第二個(gè)模塊介紹了store倉(cāng)庫(kù)的四個(gè)功能:state、getters、mutations和actions,下面介紹第五個(gè)功能:modules。

  • 當(dāng)項(xiàng)目比較大時(shí),一個(gè)store中數(shù)據(jù)會(huì)非常多而復(fù)雜,不易管理。此時(shí)便可建多個(gè)“子倉(cāng)庫(kù)”,分別對(duì)應(yīng)不同模塊做數(shù)據(jù)的讀取和操作。
  • 注意主倉(cāng)庫(kù)還是那一個(gè),只要把他的“子倉(cāng)庫(kù)”放在主倉(cāng)庫(kù)的modules下即可。
  • 子倉(cāng)庫(kù)看著很像倉(cāng)庫(kù),其實(shí)它并不是store的實(shí)例,不是倉(cāng)庫(kù)(new Vuex.Store()實(shí)例化后的對(duì)象才是倉(cāng)庫(kù)),只是一個(gè)普通js對(duì)象(字典)。

1、在store下新建modules文件夾,在modules下新建home.js“子倉(cāng)庫(kù)”。

即home.js只管主頁(yè)下的數(shù)據(jù)(一般不要分的太細(xì),最多一個(gè)頁(yè)面一個(gè)倉(cāng)庫(kù)管簡(jiǎn)潔),下面是home.js代碼

//home.js

const state={
    users:[] //存訪問(wèn)該頁(yè)面的所有用戶
};
const getters={
  getUsers(state){ //獲取訪問(wèn)該頁(yè)面的所有用戶
    // 對(duì)數(shù)據(jù)清理-除去臟數(shù)據(jù)
  	if (state.users.includes('*')) delete state.users['*'] 
    	return state.users;
  }
};
const mutations={
     addUser(state,name){ //增加訪問(wèn)用戶
        state.collects.push(name)
     }
 };
const actions={
    invokeAddUser(context,name){ //觸發(fā)mutations里面的addUser,傳入數(shù)據(jù)形參name對(duì)應(yīng)到users
        context.commit('addUser',name);
    }
};
// 注意和倉(cāng)庫(kù)的區(qū)別
const store = {
     // namespaced用于在全局引用此文件里的方法時(shí)標(biāo)識(shí)這一個(gè)的文件名,使得讓人明白這些數(shù)據(jù)來(lái)自哪個(gè)倉(cāng)庫(kù)
     // 即當(dāng)你需要在別的文件里面使用子倉(cāng)庫(kù)(mapStates、mapGetters、mapActions)時(shí),里面的方法需要注明來(lái)自哪一個(gè)模塊的方法
     namespaced:true,
     state,
     getters,
     mutations,
     actions
}
export default store;

2.“子倉(cāng)庫(kù)”創(chuàng)建完成,要讓主倉(cāng)庫(kù)引用它:

import Vue from 'vue';
import Vuex from 'vuex';
import home from './modules/home.js'

Vue.use(Vuex);
 const state={ //要設(shè)置的全局訪問(wèn)的state對(duì)象,賦予初始屬性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   }; 
const getters = {   //實(shí)時(shí)監(jiān)聽(tīng)state值的變化(最新?tīng)顟B(tài))
    getThemeColor(state) {  //定義函數(shù),返回處理過(guò)的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天則主題色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const mutations = {
    //自定義改變state初始值的方法,這里面的參數(shù)除了state之外還可以再傳額外的參數(shù)(變量或?qū)ο?;
    clearCatch(state) { 
        state.cache = "";
        state.changeThemeCount= 0;
    },
    setThemeColor(state,color,opacity){ 
       state.themeColor.val = color;
       state.themeColor.opacity = opacity;
       state.changeThemeCount++;
    }
};
const actions = {
    //自定義觸發(fā)mutations里函數(shù)的方法,context與store 實(shí)例具有相同方法和屬性
    setThemeColorAction(context,color,opacity){
     	context.commit('setThemeColor',color,opacity);
    }
};
const store = new Vuex.Store({
       state, // 掛載存取數(shù)據(jù)功能
       getters, //掛載數(shù)據(jù)計(jì)算功能
       mutations, // 掛載函數(shù)功能
       actions, // 掛載異步函數(shù)
       modules:{ // 掛載子倉(cāng)庫(kù)
         home
    	}
});
export default store;

此時(shí)便有了第一個(gè)“子倉(cāng)庫(kù)”了!

四、使用倉(cāng)庫(kù)

1. 無(wú)map系列

適合使用場(chǎng)景較少:

建好倉(cāng)庫(kù),組件中直接使用state、getters、mutations、actions:

  • this.$store.state.*
  • this.$store.getters.*
  • this.$store.commit.*
  • this.$store.dispatch.*

2. map映射系列

適合使用場(chǎng)景頻繁:

使用mapGetters、mapActions 和 mapStates之前需要import導(dǎo)入:

import {mapState,mapGetters,mapActions} from 'vuex';

使用ES6新語(yǔ)法-超引用,將某個(gè)功能下的數(shù)據(jù)或方法全部映射出來(lái)以供使用,下面是mapState、mapGetters、mapActions的例子:

	//這里的...是超引用,映射內(nèi)容,可以寫在computed下、methods下等(一般放在開(kāi)頭)
	// 直接從庫(kù)中取值 - 將庫(kù)里的users值返回給字典中的users并映射給this組件
 	...mapState({  
         users:state=>state.home.users  
      }),
     // 使用計(jì)算屬性 - 將庫(kù)里的users計(jì)算后的值返回給字典中的users并映射給this組件
    ...mapGetters('home',{ 
         users:'getUsers' //獲取清理后的數(shù)據(jù)
         //由于home倉(cāng)庫(kù) namespaced:true,所以第一個(gè)參數(shù)作為標(biāo)識(shí)
         // 不使用標(biāo)識(shí)訪問(wèn)的是主倉(cāng)庫(kù)
      })
      // 使用異步函數(shù) - 以數(shù)組中的函數(shù)名,從庫(kù)中對(duì)應(yīng)的函數(shù)映射給this組件以供使用
    ...mapActions('home',['invokeAddUser'])
    // 有某個(gè)組件 <span @click='invokeAddUser(name)'></span>
    // 或者直接使用 this.invokeAddUser(name)

3. 擴(kuò)展

mapState映射的三種寫法

  computed: mapState({
   // 箭頭函數(shù)可使代碼更簡(jiǎn)練
    count: state => state.count,

    // 傳字符串參數(shù) 'count' 等同于 `state => state.count`
    countAlias: 'count',

    // 為了能夠使用 `this` 獲取局部狀態(tài),必須使用常規(guī)函數(shù)
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
  
2、當(dāng)映射的計(jì)算屬性的名稱與state的子節(jié)點(diǎn)名稱相同時(shí),
   我們也可以給 mapState傳一個(gè)字符串?dāng)?shù)組。
  computed: mapState([ // 數(shù)組
   "count"
  ])
  
3、倉(cāng)庫(kù)中action的第二種接收參數(shù)
const actions = {
    //自定義觸發(fā)mutations里函數(shù)的方法,{commit}與store 實(shí)例具有相同方法和屬性
    setThemeColorAction({commit},color,opacity){
     	commit('setThemeColor',color,opacity);
    }
};

3. 總結(jié)

1、Vuex 是一個(gè)專門為 Vue.js 應(yīng)用所設(shè)計(jì)的集中式狀態(tài)管理架構(gòu)。它借鑒了 Flux 和 Redux 的設(shè)計(jì)思想,但簡(jiǎn)化了概念,并且采用了一種為能更好發(fā)揮 Vue.js 數(shù)據(jù)響應(yīng)機(jī)制而專門設(shè)計(jì)的實(shí)現(xiàn)。

2、Vuex 的四個(gè)核心概念分別是:

  • The state tree:Vuex 使用單一狀態(tài)樹(shù),用一個(gè)對(duì)象就包含了全部的應(yīng)用層級(jí)狀態(tài)。至此它便作為一個(gè)『唯一數(shù)據(jù)源(SSOT)』而存在。這也意味著,每個(gè)應(yīng)用將僅僅包含一個(gè) store 實(shí)例。單狀態(tài)樹(shù)讓我們能夠直接地定位任一特定的狀態(tài)片段,在調(diào)試的過(guò)程中也能輕易地取得整個(gè)當(dāng)前應(yīng)用狀態(tài)的快照。
  • Getters: 用來(lái)從 store 獲取 Vue 組件數(shù)據(jù)。
  • Mutators: 事件處理器用來(lái)驅(qū)動(dòng)狀態(tài)的變化。
  • Actions: 可以給組件使用的函數(shù),以此用來(lái)驅(qū)動(dòng)事件處理器 mutations

3、Vuex 應(yīng)用中數(shù)據(jù)的流向(Vuex 官方圖)

數(shù)據(jù)流都是單向的組件能夠調(diào)用 actionaction 用來(lái)派發(fā) Mutation只有 mutation 可以改變狀態(tài)store 是響應(yīng)式的,無(wú)論 state 什么時(shí)候更新,組件都將同步更新

最后

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue如何設(shè)置定時(shí)器和清理定時(shí)器

    vue如何設(shè)置定時(shí)器和清理定時(shí)器

    這篇文章主要介紹了vue如何設(shè)置定時(shí)器和清理定時(shí)器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • axios在Vue3中的使用實(shí)例代碼

    axios在Vue3中的使用實(shí)例代碼

    Axios是一個(gè)基于Promise的HTTP客戶端,用于瀏覽器和Node.js,這篇文章主要介紹了axios在Vue3中的使用,需要的朋友可以參考下
    2023-07-07
  • vue3+vite應(yīng)用中添加sass預(yù)處理器問(wèn)題

    vue3+vite應(yīng)用中添加sass預(yù)處理器問(wèn)題

    這篇文章主要介紹了vue3+vite應(yīng)用中添加sass預(yù)處理器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Vue實(shí)現(xiàn)低版本瀏覽器升級(jí)提示的代碼示例

    Vue實(shí)現(xiàn)低版本瀏覽器升級(jí)提示的代碼示例

    在現(xiàn)代Web開(kāi)發(fā)中,瀏覽器兼容性是一個(gè)重要的問(wèn)題,盡管大多數(shù)用戶已經(jīng)轉(zhuǎn)向了現(xiàn)代瀏覽器,但仍有一部分用戶可能仍在使用老舊的瀏覽器版本,本文將詳細(xì)介紹如何在Vue項(xiàng)目中實(shí)現(xiàn)低版本瀏覽器升級(jí)提示,并通過(guò)多個(gè)代碼示例來(lái)展示不同的應(yīng)用場(chǎng)景和技術(shù)點(diǎn),需要的朋友可以參考下
    2024-10-10
  • vue?el-pagination分頁(yè)查詢封裝的示例代碼

    vue?el-pagination分頁(yè)查詢封裝的示例代碼

    本文主要介紹了vue?el-pagination分頁(yè)查詢封裝的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • vue前端開(kāi)發(fā)輔助函數(shù)狀態(tài)管理詳解示例

    vue前端開(kāi)發(fā)輔助函數(shù)狀態(tài)管理詳解示例

    vue的應(yīng)用狀態(tài)管理提供了mapState、mapGetters、mapMutations、mapActions四個(gè)輔助函數(shù),所謂的輔助函數(shù)分別對(duì)State、Getters、Mutations、Actions在完成狀態(tài)的使用進(jìn)行簡(jiǎn)化
    2021-10-10
  • vue 路由頁(yè)面之間實(shí)現(xiàn)用手指進(jìn)行滑動(dòng)的方法

    vue 路由頁(yè)面之間實(shí)現(xiàn)用手指進(jìn)行滑動(dòng)的方法

    下面小編就為大家分享一篇vue 路由頁(yè)面之間實(shí)現(xiàn)用手指進(jìn)行滑動(dòng)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Vue+mui實(shí)現(xiàn)圖片的本地緩存示例代碼

    Vue+mui實(shí)現(xiàn)圖片的本地緩存示例代碼

    這篇文章主要介紹了Vue+mui實(shí)現(xiàn)圖片的本地緩存的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • vue實(shí)現(xiàn)列表滾動(dòng)的過(guò)渡動(dòng)畫(huà)

    vue實(shí)現(xiàn)列表滾動(dòng)的過(guò)渡動(dòng)畫(huà)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)列表滾動(dòng)的過(guò)渡動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Vue3計(jì)算屬性和異步計(jì)算屬性方式

    Vue3計(jì)算屬性和異步計(jì)算屬性方式

    這篇文章主要介紹了Vue3計(jì)算屬性和異步計(jì)算屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評(píng)論