Vue 同步異步存值取值實(shí)現(xiàn)案例
1.vue中各個(gè)組件之間傳值
1.父子組件
父組件–>子組件,通過子組件的自定義屬性:props
子組件–>父組件,通過自定義事件:this.emit(′事件名′,參數(shù)1,參數(shù)2,...);
2.非父子組件或父子組件通過數(shù)據(jù)總數(shù)Bus,this.root.$emit(‘事件名',參數(shù)1,參數(shù)2,…)
3.非父子組件或父子組件
更好的方式是在vue中使用vuex
方法1: 用組件之間通訊。這樣寫很麻煩,并且寫著寫著,估計(jì)自己都不知道這是啥了,很容易寫暈。
方法2: 我們定義全局變量。模塊a的數(shù)據(jù)賦值給全局變量x。然后模塊b獲取x。這樣我們就很容易獲取到數(shù)據(jù)
2. Vuex
Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式??梢韵胂鬄橐粋€(gè)“前端數(shù)據(jù)庫”(數(shù)據(jù)倉庫),
讓其在各個(gè)頁面上實(shí)現(xiàn)數(shù)據(jù)的共享包括狀態(tài),并且可操作
Vuex分成五個(gè)部分:
1.State:?jiǎn)我粻顟B(tài)樹
2.Getters:狀態(tài)獲取
3.Mutations:觸發(fā)同步事件
4.Actions:提交mutation,可以包含異步操作
5.Module:將vuex進(jìn)行分模塊
3. vuex使用步驟
3.1 安裝
打開項(xiàng)目根目錄,shift+鼠標(biāo)右鍵進(jìn)入窗口,輸入以下命令
npm install vuex -S
3.2 在src目錄下面創(chuàng)建store模塊,分別維護(hù)state/actions/mutations/getters

1.State:?jiǎn)我粻顟B(tài)樹
2.Getters:狀態(tài)獲取
3.Mutations:觸發(fā)同步事件
4.Actions:提交mutation,可以包含異步操作
5.Module:將vuex進(jìn)行分模塊
5、在store里面的index.js文件,并在文件中導(dǎo)入各大模塊
index.js
import Vue from 'vue' import Vuex from 'vuex' import state from './state' import getters from './getters' import actions from './actions' import mutations from './mutations'
Vue.use(Vuex)
const store = new Vuex.Store({
state, // 共同維護(hù)的一個(gè)狀態(tài),state里面可以是很多個(gè)全局狀態(tài)
getters, // 獲取數(shù)據(jù)并渲染
actions, // 數(shù)據(jù)的異步操作
mutations // 處理數(shù)據(jù)的唯一途徑,state的改變或賦值只能在這里
})
export default store ///導(dǎo)出
6. Vuex的核心概念
store:每一個(gè)Vuex應(yīng)用的核心就是store(倉庫),store基本上就是一個(gè)容器,它包含著你的應(yīng)用中大部分的狀態(tài) (state)。
state:我們用來存放我們需要用到的變量
gettters:用來獲取我們定義的變量
mutations:操作我們定義的變量,同步操作
actions:操作我們定義的變量,異步操作
state.js
export default {
// 凡是工程里的變量都定義到這里來,同時(shí)可以分類管理
resturantName: '飛鴿傳書'
}
gettters.js
export default{
getResturantName: (state) => {
return state.resturantName;
}
}
mutations.js
export default {
setResturantName: (state, payload) => {
state.resturantName = payload.resturantName;
return this.$store.state.resturantName;
}
}
actions.js
export default{
setResturantNameAsyc: (context, payload) => {
console.log('xxx')
setTimeout(()=>{
console.log('yyy')
context.commit('setResturantName', payload); //Action提交的是mutation
},3000);
console.log('zzz')
},
doAjax:(context, payload) => {
// 在vuex里面不能使用vue實(shí)例
let _this = payload._this;
let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
// let url = 'http://localhost:8080/T216_SSH/vue/userAction_login.action';
console.log(url);
_this.axios.get(url, {}).then((response) => {
console.log('doAjax.........')
console.log(response);
}).catch(respone)=>{
console.log(response);
}
}
}
將store在main.js中導(dǎo)入并掛載Vue 中實(shí)例
vuex綜合案例
需求:兩個(gè)組件A和B,vuex維護(hù)的公共數(shù)據(jù)是餐館名:resturantName,默認(rèn)值:飛歌餐館,
那么現(xiàn)在A和B頁面顯示的就是飛歌餐館。如果A修改餐館名稱為A餐館,則B頁面顯示的將會(huì)是A餐館,反之B修改同理。
這就是vuex維護(hù)公共狀態(tài)或數(shù)據(jù)的魅力,在一個(gè)地方修改了數(shù)據(jù),在這個(gè)項(xiàng)目的其他頁面都會(huì)變成這個(gè)數(shù)據(jù)。
VuePage1.vue
<template>
<div>
<h3 style="margin: 60px;">第一個(gè)Vuex頁面{{title}}</h3>
<button @click="changTitle">餐館易主</button>
<button @click="changTitleAsync">兩個(gè)月后餐館易主</button>
<button @click="changTitleAsync">測(cè)試Vuex中使用ajax</button>
</div>
</template>
<script>
export default {
data() {
return {
};
},
methods: {
changTitle() {
this.$store.commit('setResturantName', {
});
},
changTitleAsync() {
this.$store.dispatch('setResturantNameAsync', {
resturantName: '小李飛刀羊肉館'
});
},
doAjax(){
this.$store.dispatch('doAjax',{
_this:this
})
}
},
computed: {
title() {
return this.$store.getters.getResturantName;
}
},
created(){
this.title=this.$store.state.resturantName;
}
}
</script>
<style>
</style>
VuePage2.vue
<template>
<div>
<h3 style="margin: 60px;">第二個(gè)Vuex頁面{{title}}</h3>
this.$store.commit(type,payload);
</div>
</template>
<script>
export default{
data(){
return{
};
},
created(){
this.title=this.$store.state.resturantName;
}
}
</script>
<style>
</style>

Action類似于 mutation,不同在于:
1.Action提交的是mutation,而不是直接變更狀態(tài)
2.Action可以包含任意異步操作
3.Action的回調(diào)函數(shù)接收一個(gè) context 上下文參數(shù),注意,這個(gè)參數(shù)可不一般,它與 store 實(shí)例有著相同的方法和屬性
但是他們并不是同一個(gè)實(shí)例,context 包含:
1. state、2. rootState、3. getters、4. mutations、5. actions 五個(gè)屬性
所以在這里可以使用 context.commit 來提交一個(gè) mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters。
注1:actions中方法的調(diào)用方式語法如下:
this.store.dispatch(type,payload);例如:this.store.dispatch(type,payload);例如:this.store.dispatch(‘setResturantNameByAsync',{resturantName: ‘啃德雞2'});
注2:action中提交mutation
context.commit(‘setResturantName',{resturantName: ‘啃德雞2'});
注3:VUEX 的 actions 中無法獲取到 this 對(duì)象
如果要在actions 或者 mutations 中使用this對(duì)象??梢栽谡{(diào)用的時(shí)候把this對(duì)象傳過去
{resturantName: ‘啃德雞2',_this:this}//this就是在調(diào)用時(shí)的vue實(shí)例
Vuex中actions的使用場(chǎng)景
場(chǎng)景1:部門管理中添加或刪除了新的部門,員工新增/編輯頁面的部門列表需要進(jìn)行變化
場(chǎng)景2:vuex之使用actions和axios異步初始購物車數(shù)據(jù)
以上這篇Vue 同步異步存值取值實(shí)現(xiàn)案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決新建一個(gè)vue項(xiàng)目過程中遇到的問題
這篇文章主要介紹了解決新建一個(gè)vue項(xiàng)目過程中遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Vue利用mockjs編寫假數(shù)據(jù)并應(yīng)用的問題記錄
這篇文章主要介紹了Vue利用mockjs編寫假數(shù)據(jù)并應(yīng)用,本文通過實(shí)例代碼給大家詳細(xì)講解,對(duì)Vue?mockjs數(shù)據(jù)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2022-12-12
vue 監(jiān)聽窗口變化對(duì)頁面部分元素重新渲染操作
這篇文章主要介紹了vue 監(jiān)聽窗口變化對(duì)頁面部分元素重新渲染操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
基于vue實(shí)現(xiàn)頁面滾動(dòng)加載的示例詳解
頁面內(nèi)容太多會(huì)導(dǎo)致加載速度過慢,這時(shí)可考慮使用滾動(dòng)加載即還沒有出現(xiàn)在可視范圍內(nèi)的內(nèi)容塊先不加載,出現(xiàn)后再加載,所以本文給大家介紹了基于vue實(shí)現(xiàn)頁面滾動(dòng)加載的示例,需要的朋友可以參考下2024-01-01
Vue項(xiàng)目本地沒有問題但部署到服務(wù)器上提示錯(cuò)誤(問題解決方案)
一個(gè) VUE 的項(xiàng)目在本地部署沒有問題,但是部署到服務(wù)器上的時(shí)候提示訪問資源的錯(cuò)誤,遇到這樣的問題如何解決呢?下面小編給大家?guī)砹薞ue項(xiàng)目本地沒有問題但部署到服務(wù)器上提示錯(cuò)誤的解決方法,感興趣的朋友一起看看吧2023-05-05
Vue CLI3移動(dòng)端適配(px2rem或postcss-plugin-px2rem)
這篇文章主要介紹了Vue CLI3移動(dòng)端適配(px2rem或postcss-plugin-px2rem),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Vue.js組件tree實(shí)現(xiàn)無限級(jí)樹形菜單
這篇文章主要為大家詳細(xì)介紹了Vue.js組件tree實(shí)現(xiàn)無限級(jí)樹形菜單代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
淺談validator自定義驗(yàn)證及易錯(cuò)點(diǎn)
這篇文章主要介紹了validator自定義驗(yàn)證及易錯(cuò)點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

