vue中使用vuex的超詳細(xì)教程
vuex是使用vue中必不可少的一部分,基于父子、兄弟組件,我們傳值可能會(huì)很方便,但是如果是沒有關(guān)聯(lián)的組件之間要使用同一組數(shù)據(jù),就顯得很無能為力,那么vuex就很好的解決了我們這種問題,它相當(dāng)于一個(gè)公共倉(cāng)庫(kù),保存著所有組件都能共用的數(shù)據(jù)。
那么,我們一起來看看vue項(xiàng)目怎么使用它吧。(如果你對(duì)vuex有一定了解,不是剛接觸的小白,請(qǐng)忽略第一步,直接查看第二步)
一、適合初學(xué)者使用,保存數(shù)據(jù)以及獲取數(shù)據(jù)
1、在store文件夾,新建個(gè)index.js文件(命名看個(gè)人習(xí)慣,如果沒有該文件夾,可以新建一個(gè),當(dāng)然也可以不建文件夾,直接新建個(gè)js文件也是可以的)
在新建的js文件中寫入如下代碼:
import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex); export default new Vuex.Store({ state:{ pathName: "", currDbSource: {}, currJobData: {}, DbSource: [] }, mutations:{ // 保存當(dāng)前菜單欄的路徑 savePath(state,pathName){ state.pathName = pathName; }, // 保存當(dāng)前點(diǎn)擊的數(shù)據(jù)源 saveCurrDbSource(state,currDbSource){ state.currDbSource = currDbSource; }, // 保存當(dāng)前點(diǎn)擊的元數(shù)據(jù) saveCurrJobData(state,currJobData){ state.currJobData = currJobData; }, // 保存所有數(shù)據(jù)源 saveDbSource(state,DbSource){ state.DbSource = DbSource; } } })
這里解釋一下各個(gè)代碼段的作用:state是自定義的一些變量,需要用來保存數(shù)據(jù),mutations是用來觸發(fā)事件,相當(dāng)于方法,用戶需要通過觸發(fā)這個(gè)方法,借此來保存數(shù)據(jù),參數(shù)的話,第二個(gè)參數(shù)就是用戶傳入的值,然后在方法中賦值給state中的變量
2、main.js引用:(注意路徑即可)
// 引入vuex-store import store from './store/index'; new Vue({ el: '#app', router, store, render: h => h(App) });
3、保存數(shù)據(jù):(場(chǎng)景舉例:當(dāng)我點(diǎn)擊按鈕后,我需要把當(dāng)前的數(shù)據(jù)保存到vuex中,然后跳轉(zhuǎn)到別的路由,然后使用這些數(shù)據(jù))
methods:{ click(){ // 點(diǎn)擊按鈕進(jìn)行一些操作,然后保存數(shù)據(jù) this.$store.commit('saveCurrDbSource',this.db) } }
這里的第一個(gè)參數(shù)是要觸發(fā)的方法,也就是上面mutations中的方法,第二個(gè)參數(shù)是你要傳遞的數(shù)據(jù)
4、獲取變量:(當(dāng)數(shù)據(jù)初始獲取不到時(shí),可以使用計(jì)算屬性用來獲?。?/p>
this.$store.state.變量名 // 例如 this.$store.state.currDbSource
這樣其他組件就可以共用這個(gè)保存起來的數(shù)據(jù)了,也能進(jìn)行相應(yīng)的修改
二、模塊化(適合有部分基礎(chǔ)的人)
當(dāng)然,上述方法中我們把所有東西都寫在一個(gè)文件中了,這樣數(shù)據(jù)多的時(shí)候,耦合度太高,也不便于維護(hù),而且mutations也不能解決異步問題,這里就介紹另一種方式以及actions
actions:看過官網(wǎng)介紹的人都知道,這是間接觸發(fā)mutations方法的一種 " 中間商 ",而且它可以執(zhí)行異步操作,避免用戶去直接操作state
1、state.js :保存所有數(shù)據(jù),以對(duì)象的方式導(dǎo)出
export default { pathName: '', // 路由 currDbSource: {}, // 當(dāng)前數(shù)據(jù)源 currJobData: {}, // 當(dāng)前元數(shù)據(jù) DbSource: [], // 所有數(shù)據(jù)源,供元數(shù)據(jù)界面下拉列表使用 selectJobMeta: {}, // 當(dāng)前選擇的元數(shù)據(jù)(搜索后點(diǎn)擊的單條數(shù)據(jù)) specialSubject: [], // 專題數(shù)據(jù)(多條) duplicateJobMeta: {}, // 復(fù)制的數(shù)據(jù) };
2、mutations.js :保存所有方法,用來改變state的數(shù)據(jù)
// 保存當(dāng)前菜單欄的路徑 export const savePath = (state, pathName) => { state.pathName = pathName; }; // 保存當(dāng)前點(diǎn)擊的數(shù)據(jù)源 export const saveCurrDbSource = (state, currDbSource) => { state.currDbSource = currDbSource; }; // 保存當(dāng)前點(diǎn)擊的元數(shù)據(jù) export const saveCurrJobData = (state, currJobData) => { state.currJobData = null; state.currJobData = currJobData; }; // 保存所有數(shù)據(jù)源 export const saveDbSource = (state, DbSource) => { state.DbSource = DbSource; }; // 保存搜索后選擇的那一條元數(shù)據(jù) export const saveSelectJobMeta = (state, selectJobMeta) => { state.selectJobMeta = selectJobMeta; }; // 保存搜索的那一類專題 export const saveSpecialSubject = (state, specialSubject) => { state.specialSubject = specialSubject; state.selectJobMeta = {}; }; // 保存復(fù)制的元數(shù)據(jù)(名稱為空) export const saveDuplicateJobMeta = (state, duplicateJobMeta) => { state.duplicateJobMeta = duplicateJobMeta; };
3、actions.js :暴露給用戶使用,借此觸發(fā)mutations中的方法,保存數(shù)據(jù)(可執(zhí)行異步操作)
// 觸發(fā)保存菜單欄的路徑方法 export const savePath = ({ commit }, payload) => { commit('savePath', payload); }; // 觸發(fā)獲取當(dāng)前點(diǎn)擊的數(shù)據(jù)源方法 export const saveCurrDbSource = ({ commit }, payload) => { commit('saveCurrDbSource', payload); }; // 觸發(fā)獲取當(dāng)前點(diǎn)擊的元數(shù)據(jù)方法 export const saveCurrJobData = ({ commit }, payload) => { commit('saveCurrJobData', payload); }; // 觸發(fā)獲取所有數(shù)據(jù)源方法 export const saveDbSource = ({ commit }, payload) => { commit('saveDbSource', payload); }; // 觸發(fā)保存搜索后選擇單條元數(shù)據(jù)方法 export const saveSelectJobMeta = ({ commit }, payload) => { commit('saveSelectJobMeta', payload); }; // 觸發(fā)保存搜索專題數(shù)據(jù)方法 export const saveSpecialSubject = ({ commit }, payload) => { commit('saveSpecialSubject', payload); }; // 觸發(fā)保存復(fù)制元數(shù)據(jù)方法 export const saveDuplicateJobMeta = ({ commit }, payload) => { commit('saveDuplicateJobMeta', payload); };
這里有2種方式:
// 方法一: export const saveDbSource = (context, payload) => { context.commit('saveDbSource', payload); }; // 方法二: export const saveDbSource = ({ commit }, payload) => { commit('saveDbSource', payload); };
第一種是通過 context上下文用來觸發(fā)事件,一種是直接通過commit,為了保存數(shù)據(jù),都需要加第二個(gè)參數(shù)payload,不然保存到vuex的數(shù)據(jù)就是空值
4、index.js:引入相應(yīng)模塊,暴露出store,供vue注冊(cè)后全局使用
import Vue from 'vue'; import Vuex from 'vuex'; import state from './state'; import * as actions from './actions'; import * as mutations from './mutations'; Vue.use(Vuex); export default new Vuex.Store({ state, actions, mutations });
5、main.js中引入index.js
// 引入vuex-store import store from './store/index'; new Vue({ el: '#app', router, store, render: h => h(App) });
6、保存數(shù)據(jù)
import { mapActions } from 'vuex'; // 2種方式 // 方法一(dispatch) this.$store.dispatch('saveDbSource', this.DbSource); // 方法二(映射) // 1、通過methods方法添加映射關(guān)系 methods: { ...mapActions(['saveDbSource']) } // 2、使用 this.saveDbSource
這里也有2種保存數(shù)據(jù)的方法,第一種就是直接操作方法,通過disptach派發(fā)給actions,讓actions去觸發(fā)
第二種就是通過在methods中添加映射關(guān)系,數(shù)組方式,意味著我們可以在數(shù)組中寫多個(gè)方法(這里數(shù)組中的每一個(gè)方法名是actions.js文件中所定義的方法名),然后在需要使用的地方直接this.方法名即可。當(dāng)然,也可以直接綁定給html中的某個(gè)事件。
值的注意的是,避免和methods中自己定義的其他方法的名字沖突
7、獲取數(shù)據(jù)
import { mapState } from 'vuex'; computed: { ...mapState(['DbSource']), // 推薦寫法如下: //...mapState({ // DbSource: state => state.DbSource, // phoneMap: state => state.richCommunicationSuite.phoneMap, // 模塊化寫法 //}), }, watch: { DbSource(currVal) { // 監(jiān)聽mapState中的變量,當(dāng)數(shù)據(jù)變化(有值、值改變等), // 保證能拿到完整的數(shù)據(jù),不至于存在初始化沒有數(shù)據(jù)的問題,然后可以賦給本組件data中的變量 this.currVal = currVal; } }
通過計(jì)算屬性,當(dāng)數(shù)據(jù)發(fā)生改變,我們可以保證拿到的是響應(yīng)過后的數(shù)據(jù),也是數(shù)組形式,意味著我們可以拿到多組數(shù)據(jù),這里數(shù)組中的數(shù)據(jù)也是state.js中定義的變量(當(dāng)然,更推薦使用我注釋的那段代碼,那種寫法可以應(yīng)對(duì)當(dāng)state中存在多模塊的情況,比如state.a.xxx,state.b.xxx,其中a和b都是兩個(gè)模塊,各自有對(duì)應(yīng)的數(shù)據(jù)要存儲(chǔ),也可以自定義我們前面的名字來避免和data中數(shù)據(jù)重名的情況)
使用的時(shí)候,可以直接通過this.變量名拿到,例如本例中的 this.DbSource,我們可以把它賦給我們自定義的變量,也可以直接使用
值的注意的是,避免和data中自己定義的其他變量的名字沖突
至此,我們就完成了vuex的保存以及獲取數(shù)據(jù),希望對(duì)你有所幫助。
當(dāng)然,我們需要把一vuex中的一組數(shù)據(jù)過濾,其他組件都共用過濾后的數(shù)據(jù),這種情況大家可能會(huì)用到getters,這里我就不多贅述了,有興趣的小伙伴可以自己了解一下。
附上vuex的運(yùn)行過程,官網(wǎng)的圖片:組件派發(fā)任務(wù)到actions,actions觸發(fā)mutations中的方法,然后mutations來改變state中的數(shù)據(jù),數(shù)據(jù)變更后響應(yīng)推送給組件,組件重新渲染
到此這篇關(guān)于vue中使用vuex的超詳細(xì)教程的文章就介紹到這了,更多相關(guān)vue使用vuex內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue?圖片監(jiān)聽鼠標(biāo)滑輪滾動(dòng)實(shí)現(xiàn)圖片縮小放大功能(實(shí)現(xiàn)思路)
其實(shí)想要實(shí)現(xiàn)功能很簡(jiǎn)單,就是在一張圖片上監(jiān)聽鼠標(biāo)滑輪滾動(dòng)的事件,然后根據(jù)上滾還是下滾實(shí)現(xiàn)圖片的縮放,這篇文章主要介紹了Vue?實(shí)現(xiàn)圖片監(jiān)聽鼠標(biāo)滑輪滾動(dòng)實(shí)現(xiàn)圖片縮小放大功能,需要的朋友可以參考下2023-03-03深入理解Vue響應(yīng)式原理及其實(shí)現(xiàn)方式
Vue的響應(yīng)式原理是Vue最核心的特性之一,也是Vue能夠?yàn)殚_發(fā)者提供高效便捷的開發(fā)體驗(yàn)的重要原因之一,這篇文章主要介紹了響應(yīng)式的原理及其實(shí)現(xiàn)方式,需要詳細(xì)了解可以參考下文2023-05-05Vue高級(jí)組件之函數(shù)式組件的使用場(chǎng)景與源碼分析
Vue提供了一種稱為函數(shù)式組件的組件類型,用來定義那些沒有響應(yīng)數(shù)據(jù),也不需要有任何生命周期的場(chǎng)景,它只接受一些props來顯示組件,下面這篇文章主要給大家介紹了關(guān)于Vue高級(jí)組件之函數(shù)式組件的使用場(chǎng)景與源碼分析的相關(guān)資料,需要的朋友可以參考下2021-11-11vue-cli3+typescript新建一個(gè)項(xiàng)目的思路分析
這篇文章主要介紹了vue-cli3+typescript新建一個(gè)項(xiàng)目的思路,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08Vue使用高德地圖搭建實(shí)時(shí)公交應(yīng)用功能(地圖 + 附近站點(diǎn)+線路詳情 + 輸入提示+換乘詳情)
這篇文章主要介紹了vue中使用高德地圖搭建實(shí)時(shí)公交應(yīng)用(地圖 + 附近站點(diǎn)+線路詳情 + 輸入提示+換乘詳情),主要是讓大家熟悉下高德地圖在vue中的使用及vue的常用指令,需要的朋友可以參考下2018-05-05Vue3.x+Element Plus仿制Acro Design簡(jiǎn)潔模式實(shí)現(xiàn)分頁(yè)器組件
開發(fā)中難免會(huì)遇到寬度很窄的列表需要使用分頁(yè)器的情況。本文將利用Vue3.x+Element Plus仿制Acro Design簡(jiǎn)潔模式實(shí)現(xiàn)分頁(yè)器組件,感興趣的可以了解一下2023-02-02