±à¼ÍƼö: |
±¾ÎÄÀ´×Ô¸öÈ˲©¿Í£¬±¾ÎÄͨ¹ýËü²ÉÓü¯ÖÐʽ´æ´¢¹ÜÀíÓ¦ÓõÄËùÓÐ×é¼þµÄ״̬£¬²¢ÒÔÏàÓ¦µÄ¹æÔò±£Ö¤ÒÔÒ»ÖÖ¿ÉÔ¤²âµÄ·½Ê½·¢Éú±ä»¯¡£ |
|
Ò»£º ʲôÊÇvuex£¿
¹Ù·½½âÊÍÈçÏ£º
vuexÊÇÒ»¸öרΪvue.jsÓ¦ÓóÌÐò¿ª·¢µÄ״̬¹ÜÀíģʽ¡£Ëü²ÉÓü¯ÖÐʽ´æ´¢¹ÜÀíÓ¦ÓõÄËùÓÐ×é¼þµÄ״̬£¬²¢ÒÔÏàÓ¦µÄ¹æÔò±£Ö¤ÒÔÒ»ÖÖ¿ÉÔ¤²âµÄ·½Ê½·¢Éú±ä»¯¡£
ʹÓ÷½Ê½ÓÐÈçÏÂ2ÖÖ£º
1. Èç¹ûÖ±½ÓÔÚä¯ÀÀÆ÷ÏÂÒýÓðüµÄ»°£»ÈçÏ£º
<script
src="https://unpkg.com/vue@2.5.13/dist/vue.js"></script>
<script src="https://unpkg.com/vuex@3.0.1/dist/vuex.js"></script> |
½ÓÏÂÀ´¾Í¿ÉÒÔʹÓÃÁË¡£
2. ʹÓÃnpm°²×°
npm install vuex --save
È»ºóÔÚÈë¿ÚÎļþÒýÈ뷽ʽÈçÏ£º
import
Vue from 'vue';
import Vuex from 'vuex';
// vuex
Vue.use(Vuex); |
Ê×ÏÈÎÒÃÇÏÈÀ´¿´¿´Ò»¸ö¼òµ¥µÄdemo£¬ÔÙÀ´¶Ô±ÈÏÂvuexµ½µ××öÁËʲôÊÂÇé¡£¾ßÌåΪÎÒÃǽâ¾öÁËʲôÊÂÇ飿
ÎÒÃÇÏÈÀ´ÊµÏÖÒ»¸ö¼òµ¥µÄdemo£¬ÓÐÒ»¸ö±êÇ©ÏÔʾÊý×Ö£¬Á½¸ö°´Å¥·Ö±ð×öÊý×ֵļÓÒ»ºÍ¼õÒ»µÄ²Ù×÷£»ÈçÏÂʹÓô¿vueµÄdemoÈçÏ£º
<!DOCTYPE
html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>vue-demo</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{count}}
<button @click="inc">+</button>
<button @click="dec">-</button>
</p>
</div>
<script>
new Vue({
el:'#app',
data () {
return {
count: 0
}
},
methods: {
inc () {
this.count++
},
dec () {
this.count--
}
}
})
</script>
</body>
</html> |
ÈçÉϵĴúÂëµÄº¬ÒåÊÇ£ºbuttonµÄ±êÇ©ÄÚ°ó¶¨Á½¸öº¯Êý£¬µ±µã»÷µÄʱºò ·Ö±ðµ÷Óà inc ºÍ decµÄ¶ÔÓ¦µÄº¯Êý£¬½Ó×Å»áµ÷ÓÃ
vueÖеÄmethodsµÄ¶ÔÓ¦µÄ·½·¨
¡£È»ºó»á¶ÔdataÖеÄcountÊôÐÔÖµ·¢Éú¸Ä±ä£¬¸Ä±äºó»á°Ñ×îÐÂÖµäÖȾµ½ÊÓͼÖС£
×¢Ò⣺ÉÏÃæµÄ´úÂëÖ±½Ó¸´ÖÆÔËÐÐϾͿÉÒÔ¿´µ½Ð§¹ûÁË¡£
ÏÖÔÚÎÒÃÇÀ´¿´¿´Ê¹ÓÃvuexµÄ·½Ê½À´ÊµÏÖÈçÉÏdemo¡£
<!DOCTYPE
html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>vue-demo</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuex@3.0.1/dist/vuex.js"></script>
</head>
<body>
<div id="app">
<p>{{count}}
<button @click="inc">+</button>
<button @click="dec">-</button>
</p>
</div>
<script>
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
inc: state => state.count++,
dec: state => state.count--
}
});
const app = new Vue({
el: '#app',
computed: {
count() {
return store.state.count;
}
},
methods: {
inc() {
store.commit('inc');
},
dec() {
store.commit('dec');
}
}
});
</script>
</body>
</html> |
×¢Ò⣺ÉÏÃæµÄ´úÂëÖ±½Ó¸´ÖÆÔËÐÐϾͿÉÒÔ¿´µ½Ð§¹ûÁË¡£
¶Ô±ÈÏÂÉÏÃæµÄ´úÂ룺
1. ÒýÓÃvuexÔ´Â룻
2. methodsµÄ·½·¨²»±ä£¬µ«ÊÇ·½·¨ÄÚµÄÂß¼²»ÔÚº¯ÊýÄÚ½øÐУ¬¶øÊÇÈÃstore¶ÔÏóÈ¥´¦Àí¡£
3. countÊý¾Ý²»ÔÙÊÇÒ»¸ödataº¯Êý·µ»ØµÄ¶ÔÏóµÄÊôÐÔÁË¡£¶øÊÇͨ¹ýstore·½·¨ÄڵļÆËã×ֶηµ»ØµÄ¡£
¾ßÌåµÄµ÷ÓÃÈçÏ£º
ÏÈviewÉϵÄÔªËØ²Ù×÷µã»÷ʼþ -> µ÷ÓÃmethodsÖеĶÔÓ¦·½·¨ -> ͨ¹ýstore.commit(type)
´¥·¢storeÖеÄmutations¶ÔÓ¦µÄ·½·¨À´¸Ä±ästateµÄÊôÐÔ£¬Öµ·¢Éú¸Ä±äºó£¬ÊÓͼ¾ÍµÃµ½¸üС£
»Øµ½store¶ÔÏóÉÏÀ´£¬store¶ÔÏóÊÇ Vuex.StoreµÄʵÁС£ÔÚstoreÄÚ·ÖΪstate¶ÔÏóºÍmutations¶ÔÏ󣬯äÖÐstate´æ·ÅµÄÊÇ״̬£¬
±ÈÈçcountÊôÐÔ¾ÍÊÇËüµÄ״ֵ̬£¬¶ømutationsÔòÊÇÒ»¸ö»áÒý·¢×´Ì¬¸Ä±äµÄËùÓз½·¨¡£
Àí½âʲôÊÇ״̬¹ÜÀíģʽ£¿
״̬¹ÜÀí£º¼òµ¥µÄÀí½â¾ÍÊÇͳһ¹ÜÀíºÍά»¤¸÷¸övue×é¼þµÄ¿É±ä»¯×´Ì¬¡£
ÎÒÃÇÃ÷°×vueÊǵ¥ÏòÊý¾ÝÁ÷µÄ£¬ÄÇôËüµÄ״̬¹ÜÀíÒ»°ã°üº¬Èçϼ¸²¿·Ö£º
1. state; Çý¶¯Ó¦ÓõÄÊý¾Ý(Ò»°ãÖ¸dataÖзµ»ØµÄÊý¾Ý)¡£
2. view£» Ò»°ãָģ°å£¬ÒÔÉùÃ÷µÄ·½Ê½½«stateµÄÊý¾ÝÓ³Éäµ½ÊÓͼ¡£
3. actions: ÏìÓ¦ÔÚviewÉϵÄÓû§ÊäÈëµ¼ÖµÄ״̬±ä»¯¡£
µ«Êǵ±ÎÒÃǵÄÓ¦ÓÃÓöµ½¶à¸ö×é¼þ¹²Ïí״̬ʱºò£¬ÄÇôµ¥ÏòÊý¾ÝÁ÷¿ÉÄܲ»Ì«Âú×ãÎÒÃǵÄÐèÇó£º
±ÈÈçÈçϼ¸¸ö·½Ã棺
1. ¶à¸öÊÓͼÒÀÀµÓÚͬһ״̬¡£
´«²ÎµÄ·½·¨¶ÔÓÚ¶à²ãǶÌ×µÄ×é¼þ½«»á·Ç³£·±Ëö£¬²¢ÇÒ¶ÔÓÚÐÖµÜ×é¼þ¼äµÄ״̬´«µÝÎÞÄÜΪÁ¦¡£
2. ÎÒÃǾ³£»á²ÉÓø¸×Ó×é¼þÖ±½ÓÒýÓûòÕßͨ¹ýʼþÀ´±ä¸üºÍͬ²½×´Ì¬µÄ¶à·Ý¿½±´¡£ÒÔÉϵÄÕâЩģʽ·Ç³£´àÈõ£¬Í¨³£»áµ¼ÖÂÎÞ·¨Î¬»¤µÄ´úÂë¡£
Òò´ËÎÒÃÇ¿ÉÒÔ°Ñ×é¼þµÄ¹²Ïí״̬ÌáÈ¡³öÀ´£¬×÷Ϊȫ¾ÖÀ´¹ÜÀí£¬Òò´Ëvuex²úÉúÁË¡£
vuexµÄÓŵ㣺
×îÖ÷Òª½â¾öÁË×é¼þÖ®¼ä¹²Ïíͬһ״̬µÄÎÊÌâ¡£¿ÉÒÔ°Ñ×é¼þµÄ¹²Ïí״̬ÌáÈ¡³öÀ´£¬×÷Ϊȫ¾ÖÀ´¹ÜÀí¡£
ʲôÇé¿öÏÂÎÒÓ¦¸ÃʹÓà Vuex£¿
Èç¹û²»´òË㿪·¢´óÐ͵¥Ò³Ó¦Óã¬Ê¹Óà Vuex ¿ÉÄÜÊÇ·±ËöÈßÓàµÄ¡£È·ÊµÊÇÈç´Ë¡ª¡ªÈç¹ûÄúµÄÓ¦Óù»¼òµ¥£¬×îºÃ²»ÒªÊ¹ÓÃ
Vuex¡£Ò»¸ö¼òµ¥µÄ global event bus ¾Í×ã¹»ÄúËùÐèÁË¡£µ«ÊÇ£¬Èç¹ûÄúÐèÒª¹¹½¨ÊÇÒ»¸öÖдóÐ͵¥Ò³Ó¦Ó㬺ܿÉÄܻῼÂÇÈçºÎ¸üºÃµØÔÚ×é¼þÍⲿ¹ÜÀí״̬£¬Vuex
½«»á³ÉΪ×ÔÈ»¶øÈ»µÄÑ¡Ôñ¡£
¶þ£º Vuex״̬¹ÜÀíµÄdemoѧϰ
ÿһ¸öVuexÓ¦ÓõĺËÐľÍÊÇstore(²Ö¿â), storeÊDZ£´æÓ¦ÓÃÖд󲿷ֵÄ״̬¡£
Vuex ºÍÒ»°ãµÄÈ«¾Ö¶ÔÏóÓÐÒÔϼ¸µã²»Í¬£º
1. VuexµÄ״̬´æ´¢ÊÇÏìÓ¦ÐԵġ£
µ±vue×é¼þ´ÓstoreÖжÁȡ״̬µÄʱºò£¬ÈôstoreÖеÄ״̬·¢Éú±ä»¯£¬ÄÇôÏà¶ÔÓ¦µÄ×é¼þÒ²¾Í»áµÃµ½ÏàÓ¦µÄ¸üС£
2. ÎÒÃDz»ÄÜÖ±½ÓÐÞ¸ÄstoreÖеÄ״̬¡£
¸Ä±ästoreÖеÄ״̬µÄΨһ;¾¶ÊÇÏÔʾµØÌá½»(commit)mutations.
2-1 µ¥Ò»×´Ì¬Ê÷
VuexʹÓõÄÊǵ¥Ò»×´Ì¬Ê÷£¬ÓÃÒ»¸ö¶ÔÏó¾Í°üº¬ÁËÈ«²¿µÄÓ¦Óò㼶״̬¡£ÕâÒ²Òâζ×Åÿ¸öÓ¦Óý«½ö½ö°üº¬Ò»¸östoreµÄʵÁС£
VuexµÄ״̬´æ´¢ÊÇÏìÓ¦ÐԵģ¬Òò´Ë´ÓstoreʵÁÐÖжÁȡһ¸ö״̬µÄ×î¼òµ¥µÄ·½·¨ÊÇÔÚ¼ÆËãÊôÐÔ·µ»ØÄ³¸ö״̬¡£
±ÈÈçdemo2µÄ´úÂ룺
<div
id="app">
<p>{{count}}
<button @click="inc">+</button>
<button @click="dec">-</button>
</p>
</div>
<script>
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
inc: state => state.count++,
dec: state => state.count--
}
});
const app = new Vue({
el: '#app',
computed: {
count() {
return store.state.count;
}
},
methods: {
inc() {
store.commit('inc');
},
dec() {
store.commit('dec');
}
}
});
</script> |
ÈçÉÏ´úÂ룬´ÓstoreÖжÁȡһ¸ö״̬¿ÉÒÔ´Ó computedÖеÄcount·½·¨ÄھͿÉÒÔ¶ÁÈ¡µ½ÁË¡£µ±
store.state.count±ä»¯µÄʱºò£¬¶¼»áÖØÐÂÇóÈ¡¼ÆËãÊôÐÔ£¬²¢ÇÒ´¥·¢Ïà¹ØÁªµÄDOM¸üС£
µ«ÊÇÕâÖÖģʽµ¼ÖÂ×é¼þÒÀÀµµÄÈ«¾Ö״̬µ¥ÁУ¬ÔÚÄ£¿é¹¹½¨ÏµÍ³ÖУ¬ÔÚÿ¸öÐèҪʹÓÃstateµÄ×é¼þÖÐÐèҪƵ·±µÄµ¼Èë(ÒòΪÿ¸öÒ³Ãæ¶¼ÐèÒª
µ¼Èë new Vuex.StoreÕâÑùµÄ£¬µ«ÊÇÒ»¸öÓ¦ÓÃϵͳ½ö½ö°üº¬Ò»¸östoreʵÁÐ)£¬²¢ÇÒÔÚ²âÊÔ×é¼þµÄʱºòÐèҪģÄâ״̬¡£
Òò´Ëvuexͨ¹ýstoreÑ¡ÏÌṩÁËÒ»ÖÖ»úÖÆ½«×´Ì¬´Ó¸ù×é¼þ×¢È뵽ÿһ¸ö×Ó×é¼þÖС£
ʹÓÃvuexµÄʾÁУº
new
Vuex.Store({
state: {
// code
},
mutations: {
// code ....
}
}); |
stateÊÇÓÃÀ´´æ´¢³õʼ»¯µÄÊý¾ÝµÄ¡£Èç¹ûÒª¶ÁÈ¡Êý¾ÝʹÓà store.state.Êý¾Ý±äÁ¿¡£ÐÞ¸ÄÊý¾ÝʹÓÃmutations,Ëü±£´æµÄÐèÒª¸Ä±äÊý¾ÝµÄËùÓз½·¨£¬¸Ä±ämutationsÀïµÄÊý¾ÝÐèҪʹÓÃstore.state.Êý¾Ý±äÁ¿¡£ÐÞ¸ÄÊý¾ÝʹÓÃmutations,Ëü±£´æµÄÐèÒª¸Ä±äÊý¾ÝµÄËùÓз½·¨£¬¸Ä±ämutationsÀïµÄÊý¾ÝÐèҪʹÓÃstore.commit();
»¹ÊÇÐèÒª vue-cli ÖеÄÏîÄ¿À´ËµÃ÷Ï£º
1. ÔÚscrĿ¼ÏÂн¨Ò»¸övuexÎļþ¼Ð£¬ÔÚ¸ÃÎļþ¼ÐϠн¨ mystore.jsÎļþ£¬´úÂëÈçÏ£º
import
Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 1
},
// ÐèÒªÐÞ¸ÄstatsµÄÊý¾ÝµÄ»°£¬ÐèҪʹÓÃ$store.commit()·½·¨
mutations: {
add(state) {
return state.count++;
},
reduce(state) {
return state.count--;
}
}
}); |
2. ÔÚsrc/viewsÎļþ¼ÐϠн¨Ò»¸ö count.vue£¬´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>
<button @click="$store.commit('add')">
+ </button>
<button @click="$store.commit('reduce')">
- </button>
</p>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
export default {
data () {
return {
msg: 'Hello world'
}
},
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
3¡¢ÔÚ src/router/index.js ·ÓÉÅäÖÃÎļþÖÐÅäÖà count.vue µÄ·ÓÉ, ´úÂëÈçÏ£º
import
Vue from 'vue';
import Router from 'vue-router';
// import HelloWorld from '@/views/HelloWorld';
Vue.use(Router);
const router = new Router({
mode: 'history', // ·ÃÎÊ·¾¶²»´ø¾®ºÅ ÐèҪʹÓà historyģʽ£¬²ÅÄÜʹÓÃ
scrollBehavior
routes: [
{
path: '/count',
name: 'count',
component: resolve => require(['@/views/count'],
resolve) // ʹÓÃÀÁ¼ÓÔØ
}
]
});
export default router; |
Ö±½ÓÔÚä¯ÀÀÆ÷·ÃÎÊ http://localhost:8080/count ¼´¿ÉÁË¡£
Èý£ºÑ§Ï°Vuex state·ÃÎÊ״̬¶ÔÏó
ÉÏÃæÎÒÃǵĴúÂëÊÇ·ÃÎÊ״̬¶ÔÏóµÄ£¬Êǵ¥Ò³Ó¦ÓóÌÐòÖеĹ²ÏíÖµ£¬ÏÖÔÚÎÒÃÇÔÙÀ´¿´¿´×´Ì¬¶ÔÏóÈçºÎ¸³Öµ¸øÄÚ²¿¶ÔÏó£¬Ò²¾ÍÊÇ
°Ñmystore.jsÖеÄÖµ£¬¸³Öµ¸øÄ£°åÀïdataµÄÖµ£¬Ò²¾ÍÊÇÏëÖ±½ÓÔÚtemplateÖÐÓà {{xxx}}Ö±½Óµ÷ÓÃÊý¾Ý¡£
ÎÒÃÇÖªµÀvuexµÄ״̬´æ´¢ÊÇÏìÓ¦ÐԵ쬴ÓstoreʵÁÐÖжÁȡ״̬×î¼òµ¥µÄ·½Ê½ÊÇÔÚ¼ÆËãÊôÐÔÖзµ»ØÄ³¸ö״̬¡£
3-1 ͨ¹ýcomputedµÄ¼ÆËãÊôÐÔÖ±½Ó¸³Öµ
ÔÚsrc/viewsÎļþ¼ÐÏÂн¨ count2.vue, ´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>computed¼ÆË㸳ֵ½á¹ûÊÇ£º{{ count }}</p>
<p>
<button @click="$store.commit('add')">
+ </button>
<button @click="$store.commit('reduce')">
- </button>
</p>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
export default {
data () {
return {
msg: 'Hello world'
}
},
computed: {
count () {
return this.$store.state.count
}
},
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
ÔÚä¯ÀÀÖзÃÎÊ http://localhost:8080/count2 ¿ÉÒÔ¿´µ½¡£
3-2 ͨ¹ýmapStateµÄ¶ÔÏóÀ´¸³Öµ
µ±Ò»¸ö×é¼þÐèÒª»ñÈ¡¶à¸ö״̬µÄʱºò£¬½«ÕâЩ״̬¶¼ÉùÃ÷Ϊ¼ÆËãÊôÐÔ»áÓÐÐ©ÖØ¸´ºÍÈßÓ࣬ΪÁ˽â¾öÕâ¸öÎÊÌ⣬¿ÉÒÔʹÓÃ
mapState¸¨Öúº¯ÊýÀ´°ïÖúÎÒÃÇÉú³É¼ÆËãÊôÐÔ¡£
ÔÚsrc/viewsÎļþ¼ÐÏÂн¨ count3.vue, ´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>computed¼ÆË㸳ֵ½á¹ûÊÇ£º{{ count }}</p>
<p>
<button @click="$store.commit('add')">
+ </button>
<button @click="$store.commit('reduce')">
- </button>
</p>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
// ÒýÈëmapState
import { mapState } from 'vuex';
export default {
data () {
return {
msg: 'Hello world'
}
},
computed: mapState({
count: function(state) {
return state.count;
}
}),
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
ÔÚä¯ÀÀÖзÃÎÊ http://localhost:8080/count3 ¿ÉÒÔ¿´µ½¡£
3-3 ͨ¹ýmapStateµÄÊý×éÀ´¸³Öµ£¬
ÔÚsrc/views Ϡн¨ count4.vue, ´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>computed¼ÆË㸳ֵ½á¹ûÊÇ£º{{ count }}</p>
<p>
<button @click="$store.commit('add')">
+ </button>
<button @click="$store.commit('reduce')">
- </button>
</p>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
// ÒýÈëmapState
import { mapState } from 'vuex';
export default {
data () {
return {
msg: 'Hello world'
}
},
/*
* Êý×éÖеÄcount ±ØÐëºÍ mystore.js¶¨ÒåµÄ³£Á¿ mystate ÖÐµÄ countͬÃû£¬
ÒòΪÕâÊÇÖ±½Ó·ÃÎÊmystateµÄcount
*/
computed: mapState(['count']),
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
ÔÚä¯ÀÀÖзÃÎÊ http://localhost:8080/count4 ¿ÉÒÔ¿´µ½¡£
ËÄ£º getters¼ÆËã¹ýÂ˲Ù×÷
ÓÐʱºòÎÒÃÇÐèÒª´ÓstoreÖеÄstateÖÐÅÉÉú³öһЩ״̬£¬±ÈÈçÔÚʹÓÃstoreÖеÄstate֮ǰ£¬ÎÒÃÇ»á¶ÔstateÖеÄijЩ×ֶνøÐйýÂËһϣ¬±ÈÈç¶ÔstateÖеÄcount×ֶζ¼½øÐмÓ10ÕâÑùµÄÊý¾Ý£»µ«ÊÇÈç¹ûÓжà¸ö×é¼þÐèÒªÓõ½Õâ¸ö²Ù×÷µÄ»°£¬ÄÇôÎÒÃǾÍÐèÒª¸´ÖÆÕâ¸öº¯Êý£¬»òÕß³éÈ¡µ½Ò»¸ö¹²Ïíº¯ÊýÄÚ£¬
È»ºó¶à´¦µ¼ÈëÕâ¸öº¯Êý£¬µ«ÊÇÕâÉÏÃæÁ½ÖÖ·½Ê½¶¼²»ÊÇÌ«ºÃ£¬ÒòΪÎÒÃÇÏÖÔÚÓиüºÃµÄ·½Ê½À´½â¾öËü¡£
VuexÖÐÔÊÐíÎÒÃÇÔÚstoreÖж¨Òå getters£¬gettersµÄ·µ»ØÖµ»á¸ù¾ÝËüµÄÒÀÀµ±»»º´æÆðÀ´£¬ÇÒÖ»Óе±ËûµÄÒÀÀµÖµ·¢Éú¸Ä±äÁË
²Å»áÖØÐ¼ÆËã¡£
ÏÖÔÚÎÒÃÇÐèÒª¶Ômystore.jsÎļþÖеÄcount½øÐÐÒ»¸ö¼ÆËãÊôÐԵIJÙ×÷£¬ÔÚËüÊä³ö֮ǰ£¬¼ÓÉÏ10µÄ²Ù×÷¡£
ÈçÏ´úÂëÓÐÁ½¸ö°´Å¥£¬Ò»¸ö¼Ó5£¬Ò»¸ö¼õ5£¬ÄÇôÔÚ¼Ó5»òÕß¼õ5֮ǰ£¬ÏȼÓ20£¬È»ºóÔÙ½øÐмÓ5»òÕß5²Ù×÷¡£´úÂëÈçÏ£º
ÔÚÎļþ¼Ð src/vuex/mystore.js´úÂëÈçÏ£º
import
Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
// Ôö¼ÓÒ»¸ö³£Á¿¶ÔÏó state
const mystate = {
count: 0
};
// mutations ±£´æËùÓеķ½·¨£¬¸Ã·½·¨¿ÉÒԸıästateÊý¾Ý
const mymutations = {
// Ôö¼Ó
add(state, num) {
const count = state.count += num;
return count;
},
// ¼õÉÙ
reduce(state, num) {
const count = state.count -= num;
return count;
}
};
// Ôö¼ÓÒ»¸ögetters¶ÔÏó
const mygetters = {
mycount: function(state) {
const count = state.count += 20;
return count;
}
};
// ·â×°´úÂ룬ÈÃÍⲿ¿É¼û
export default new Vuex.Store({
state: mystate, // stateµÄ¹Ì¶¨Ð´·¨ ±£´æÊý¾ÝµÄ״ֵ̬
mutations: mymutations, // mutationsµÄ¹Ì¶¨Ð´·¨ ¸Ä±äÊý¾ÝµÄËùÓз½·¨
getters: mygetters
}); |
ÔÚsrc/views/ÏÂн¨ count5.vue ´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>computed¼ÆË㸳ֵ½á¹ûÊÇ£º{{ mycount }}</p>
<p>
<!--
$store.commit('add', 5) µÚÒ»¸ö²ÎÊýÊÇ·½·¨Ãû£¬µÚ¶þ¸öÊDzÎÊý
-->
<button @click="$store.commit('add',
5)"> + </button>
<button @click="$store.commit('reduce',
5)"> - </button>
</p>
<div>
<p>ʹÓÃmapMutationsÐÞ¸Ä״̬£º</p>
<p>
<button @click="add(10)">+</button>
<button @click="reduce(10)">-</button>
</p>
</div>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
// ÒýÈëmapState
import { mapState, mapMutations, mapGetters
} from 'vuex';
export default {
data () {
return {
msg: 'Hello world'
}
},
computed: {
// mapState(['count']) ´Ë´¦µÄcount±ØÐëºÍstore.js¶¨ÒåµÄ³£Á¿
mystateÖеÄcountͬÃû£¬ÒòΪÕâÊÇÖ±½Ó·ÃÎÊ mystateµÄcount
...mapState(['count']),
// mapGetters ¸¨Öúº¯Êý£¬¿ÉÒÔ½«storeÖеÄgetterÓ³Éäµ½¾Ö²¿¼ÆËãÊôÐÔmycount
...mapGetters(['mycount'])
},
methods: mapMutations(['add', 'reduce']),
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
ÔÚä¯ÀÀÆ÷Ï ·ÃÎÊ http://localhost:8080/count5 ¼´¿É¡£
Î壺MutationsÐÞ¸Ä״̬
MutationsÊÇÐÞ¸ÄvuexÖеÄstoreµÄΨһ·½·¨¡£Ã¿¸ömutations¶¼ÓÐÒ»¸ö×Ö·û´®µÄʼþÀàÐÍ(type)ºÍÒ»¸ö»Øµ÷º¯Êý(handler)¡£Õâ¸ö»Øµ÷º¯Êý¾ÍÊÇ
ÎÒÃǽøÐиü¸ÄµÄµØ·½¡£ËüÒ²»á½ÓÊÜstate×÷ΪµÚÒ»¸ö²ÎÊý¡£
´ò¿ªÉÏÃæsrc/vuex/mystore.js ´úÂëÖÐµÄ mutations ¿ÉÒÔ¿´µ½ÈçÏ£º
//
mutations ±£´æËùÓеķ½·¨£¬¸Ã·½·¨¿ÉÒԸıästateÊý¾Ý
const mymutations = {
// Ôö¼Ó
add(state, num) {
const count = state.count += num;
return count;
},
// ¼õÉÙ
reduce(state, num) {
const count = state.count -= num;
return count;
}
}; |
ÎÒÃÇ֮ǰµ÷Óà mutationsµÄ·½·¨ÊÇÕâÑùµÄ $store.commit()¼´¿Éµ÷Ó÷½·¨À´¸Ä±ästateÊý¾Ý£¬ÏÖÔÚÎÒÃÇÏëʹÓÃ
@click="add()"À´µ÷Óá£
1. ÎÒÃÇÔÚsrc/views/ ÏÂн¨Ò»¸öcount6.vue, Ïȵ¼ÈëÎÒÃÇµÄ mapMutations·½·¨
import
{ mapState, mapMutations } from 'vuex'; |
2. ʹÓÃmethodsÊôÐÔ£¬²¢¼ÓÈë mapMutations
methods:
mapMutations(['add', 'reduce']); |
3. ÔÚtemplateÖÐʹÓà @click="", ÈçÏ´úÂ룺
<button
@click="add(5)">+</button>
<button @click="reduce(5)">-</button> |
count6.vue ´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>computed¼ÆË㸳ֵ½á¹ûÊÇ£º{{ count }}</p>
<p>
<!--
$store.commit('add', 5) µÚÒ»¸ö²ÎÊýÊÇ·½·¨Ãû£¬µÚ¶þ¸öÊDzÎÊý
-->
<button @click="$store.commit('add',
5)"> + </button>
<button @click="$store.commit('reduce',
5)"> - </button>
</p>
<div>
<p>ʹÓÃmapMutationsÐÞ¸Ä״̬£º</p>
<p>
<button @click="add(10)">+</button>
<button @click="reduce(10)">-</button>
</p>
</div>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
// ÒýÈëmapState
import { mapState, mapMutations } from 'vuex';
export default {
data () {
return {
msg: 'Hello world'
}
},
computed: {
// mapState(['count']) ´Ë´¦µÄcount±ØÐëºÍstore.js¶¨ÒåµÄ³£Á¿
mystateÖеÄcountͬÃû£¬ÒòΪÕâÊÇÖ±½Ó·ÃÎÊ mystateµÄcount
...mapState(['count'])
},
methods: mapMutations(['add', 'reduce']),
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
src/vuex/mystore.js´úÂëÐÞ¸ÄÈçÏ£º
import
Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
// Ôö¼ÓÒ»¸ö³£Á¿¶ÔÏó state
const mystate = {
count: 0
};
// mutations ±£´æËùÓеķ½·¨£¬¸Ã·½·¨¿ÉÒԸıästateÊý¾Ý
const mymutations = {
// Ôö¼Ó
add(state, num) {
const count = state.count += num;
return count;
},
// ¼õÉÙ
reduce(state, num) {
const count = state.count -= num;
return count;
}
};
// ·â×°´úÂ룬ÈÃÍⲿ¿É¼û
export default new Vuex.Store({
state: mystate, // stateµÄ¹Ì¶¨Ð´·¨ ±£´æÊý¾ÝµÄ״ֵ̬
mutations: mymutations // mutationsµÄ¹Ì¶¨Ð´·¨ ¸Ä±äÊý¾ÝµÄËùÓз½·¨
}); |
Áù£º actionsÒì²½ÐÞ¸Ä״̬
actionsÊÇÒì²½ÐÞ¸ÄstateµÄ״̬µÄ¡£µ«ÊÇMutationsÊÇͬ²½¸Ä±ä״̬µÄ¡£
6-1 ÔÚmystore.jsÖÐÉùÃ÷actions
actionsÊÇ¿ÉÒÔµ÷ÓÃMutationsµÄ·½·¨µÄ¡£ÈçÏ´úÂ룺
//
Ôö¼ÓÒ»¸ö actions
const myactions = {
addAction(context) {
console.log(context);
context.commit('add', 5); // µ÷ÓÃmymutations ÖеÄ
add·½·¨£¬²¢´«²ÎÊý5
},
reduceAction(context) {
context.commit('reduce', 5); // µ÷ÓÃmymutationsÖеÄreduce·½·¨£¬²¢´«²ÎÊý5
}
}; |
myactions ÀïÓÐÁ½¸ö·½·¨ addAction ºÍ reduceAction , ÔÚ·½·¨ÌåÄÚ£¬ÎÒÃǶ¼ÓÃ
commit µ÷ÓÃÁË Mutations
ÀïÃæµÄ·½·¨¡£
ÆäÖÐcontext£¬ÊÇÉÏÏÂÎĶÔÏó£¬ÔÚÕâ±ß¿ÉÒÔÀí½âΪstore±¾Éí¡£
ÔÚVuex.store()Öзâ×°
//
·â×°´úÂ룬ÈÃÍⲿ¿É¼û
export default new Vuex.Store({
state: mystate, // stateµÄ¹Ì¶¨Ð´·¨ ±£´æÊý¾ÝµÄ״ֵ̬
mutations: mymutations, // mutationsµÄ¹Ì¶¨Ð´·¨ ¸Ä±äÊý¾ÝµÄËùÓз½·¨
getters: mygetters,
actions: myactions
}); |
ÔÚconut7.vueÖе÷Ó㬴úÂëÈçÏ£º
<p>
actionsµÄÒì²½²Ù×÷<br/>
<button @click="addAction">
+ </button>
<button @click="reduceAction">
- </button>
</p> |
importÒýÓÃÈçÏ£º
import
{ mapState, mapMutations, mapGetters, mapActions
} from 'vuex'; |
Ìí¼Ómethods·½·¨£¬´úÂëÈçÏ£º
methods:
{
...mapMutations(['add', 'reduce']),
...mapActions(['addAction', 'reduceAction'])
} |
ÏÂÃæÊÇÈ«²¿´úÂ룺
mystore.js´úÂëÈçÏ£º
import
Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
// Ôö¼ÓÒ»¸ö³£Á¿¶ÔÏó state
const mystate = {
count: 0
};
// mutations ±£´æËùÓеķ½·¨£¬¸Ã·½·¨¿ÉÒԸıästateÊý¾Ý
const mymutations = {
// Ôö¼Ó
add(state, num) {
const count = state.count += num;
return count;
},
// ¼õÉÙ
reduce(state, num) {
const count = state.count -= num;
return count;
}
};
// Ôö¼ÓÒ»¸ögetters¶ÔÏó
const mygetters = {
mycount: function(state) {
const count = state.count += 20;
return count;
}
};
// Ôö¼ÓÒ»¸ö actions
const myactions = {
addAction(context) {
console.log(context);
context.commit('add', 5); // µ÷ÓÃmymutations ÖеÄ
add·½·¨£¬²¢´«²ÎÊý5
},
reduceAction(context) {
context.commit('reduce', 5); // µ÷ÓÃmymutationsÖеÄreduce·½·¨£¬²¢´«²ÎÊý5
}
};
// ·â×°´úÂ룬ÈÃÍⲿ¿É¼û
export default new Vuex.Store({
state: mystate, // stateµÄ¹Ì¶¨Ð´·¨ ±£´æÊý¾ÝµÄ״ֵ̬
mutations: mymutations, // mutationsµÄ¹Ì¶¨Ð´·¨ ¸Ä±äÊý¾ÝµÄËùÓз½·¨
getters: mygetters,
actions: myactions
}); |
count7.vue´úÂëÈçÏ£º
<template>
<div>
<p>{{ msg }}
<!-- »ñÈ¡vuexÎļþµÄmystore.jsÖÐµÄ stateÖеÄcountµÄÖµ
-->
{{ $store.state.count }}
</p>
<p>computed¼ÆË㸳ֵ½á¹ûÊÇ£º{{ mycount }}</p>
<p>
<!--
$store.commit('add', 5) µÚÒ»¸ö²ÎÊýÊÇ·½·¨Ãû£¬µÚ¶þ¸öÊDzÎÊý
-->
<button @click="$store.commit('add',
5)"> + </button>
<button @click="$store.commit('reduce',
5)"> - </button>
</p>
<div>
<p>ʹÓÃmapMutationsÐÞ¸Ä״̬£º</p>
<p>
<button @click="add(10)">+</button>
<button @click="reduce(10)">-</button>
</p>
<p>
actionsµÄÒì²½²Ù×÷<br/>
<button @click="addAction">
+ </button>
<button @click="reduceAction">
- </button>
</p>
</div>
</div>
</template>
<script>
import mystore from '@/vuex/mystore';
// ÒýÈëmapState
import { mapState, mapMutations, mapGetters,
mapActions } from 'vuex';
export default {
data () {
return {
msg: 'Hello world'
}
},
computed: {
// mapState(['count']) ´Ë´¦µÄcount±ØÐëºÍstore.js¶¨ÒåµÄ³£Á¿
mystateÖеÄcountͬÃû£¬ÒòΪÕâÊÇÖ±½Ó·ÃÎÊ mystateµÄcount
...mapState(['count']),
...mapGetters(['mycount'])
},
methods: {
...mapMutations(['add', 'reduce']),
...mapActions(['addAction', 'reduceAction'])
},
/*
ÒýÓÃmystore.js£¬storeΪÊý¾Ý²Ö¿â
*/
store: mystore
}
</script> |
|