Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Àí½âvuexµÄ״̬¹ÜÀíģʽ¼Ü¹¹
 
  1845  次浏览      27
  2018-11-30
 
±à¼­ÍƼö:
±¾ÎÄÀ´×Ô¸öÈ˲©¿Í£¬±¾ÎÄͨ¹ýËü²ÉÓü¯ÖÐʽ´æ´¢¹ÜÀíÓ¦ÓõÄËùÓÐ×é¼þµÄ״̬£¬²¢ÒÔÏàÓ¦µÄ¹æÔò±£Ö¤ÒÔÒ»ÖÖ¿ÉÔ¤²âµÄ·½Ê½·¢Éú±ä»¯¡£

Ò»£º ʲôÊÇ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>

   
1845 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì