±à¼ÍƼö: |
±¾ÎÄÀ´×Ô¸öÈ˲©¿Í£¬±¾ÎÄͨ¹ýʹÓÃvueÖܱߵÄһЩ¿â½øÐа²×°£¬³õʼ»¯£¬´´½¨×é¼þ¹¹½¨ÁËÒ»¸öСdemo£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£ |
|
ǰÑÔ
ÎÒÃǽ«»áÑ¡ÔñʹÓÃһЩ vue ÖܱߵĿâvue-cli, vue-router,vue-resource,vuex
1.ʹÓà vue-cli ´´½¨ÏîÄ¿
2.ʹÓà vue-router ʵÏÖµ¥Ò³Â·ÓÉ
3.Óà vuex ¹ÜÀíÎÒÃǵÄÊý¾ÝÁ÷
4.ʹÓà vue-resource ÇëÇóÎÒÃÇµÄ node ·þÎñ¶Ë
5.ʹÓÃ.vue Îļþ½øÐÐ×é¼þ»¯µÄ¿ª·¢
PS £º±¾ÎÄ node v6.2.2 npm v3.9.5 vue v2.1.0 vue-router
v2.0.3 vuex v2.0.0
×îÖÕÎÒÃǽ«»á¹¹½¨³öÒ»¸öС demo £¬²»·Ï»°£¬Ö±½ÓÉÏͼ¡£
°²×°
1.ÎÒÃǽ«»áʹÓà webpack ȥΪÎÒÃǵÄÄ£¿é´ò°ü£¬Ô¤´¦Àí£¬ÈȼÓÔØ¡£Èç¹ûÄã¶Ô webpack ²»ÊìϤ£¬Ëü¾ÍÊÇ¿ÉÒÔ°ïÖúÎÒÃǰѶà¸ö
js Îļþ´ò°üΪ 1 ¸öÈë¿ÚÎļþ£¬²¢ÇÒ¿ÉÒÔ´ïµ½°´Ðè¼ÓÔØ¡£Õâ¾ÍÒâζ×Å£¬ÎÒÃDz»Óõ£ÐÄÓÉÓÚʹÓÃÌ«¶àµÄ×é¼þ£¬µ¼ÖÂÁ˹ý¶àµÄ
HTTP ÇëÇó£¬ÕâÊǷdz£ÓÐÒæÓÚ²úÆ·ÌåÑéµÄ¡£µ«ÎÒÃDz¢²»Ö»ÊÇΪÁËÕâ¸ö¶øÊ¹Óà webpack £¬ÎÒÃÇÐèÒªÓÃ
webpack È¥±àÒë.vue Îļþ£¬Èç¹ûûÓÐʹÓÃÒ»¸ö loader ȥת»»ÎÒÃÇ.vue ÎļþÀïµÄ
style ¡¢ js ºÍ html £¬ÄÇôä¯ÀÀÆ÷¾ÍÎÞ·¨Ê¶±ð¡£
2.Ä£¿éÈȼÓÔØÊÇ webpack µÄÒ»¸ö·Ç³£µï±¤µÄÌØÐÔ£¬½«»áΪÎÒÃǵĵ¥Ò³Ó¦ÓôøÀ´¼«´óµÄ±ãÀû¡£ ͨ³£À´Ëµ£¬µ±ÎÒÃÇÐÞ¸ÄÁË´úÂëË¢ÐÂÒ³Ãæ£¬ÄÇÓ¦ÓÃÀïµÄËùÓÐ״̬¾Í¶¼Ã»ÓÐÁË¡£Õâ¶ÔÓÚ¿ª·¢Ò»¸öµ¥Ò³Ó¦ÓÃÀ´ËµÊǷdz£Í´¿àµÄ£¬ÒòΪÐèÒªÖØÐÂÔÚÅÜÒ»±éÁ÷³Ì¡£Èç¹ûÓÐÄ£¿éÈȼÓÔØ£¬µ±ÄãÐÞ¸ÄÁË´úÂ룬ÄãµÄ´úÂë»áÖ±½ÓÐ޸ģ¬Ò³Ãæ²¢²»»áˢУ¬ËùÒÔ״̬Ҳ»á±»±£Áô¡£
3.Vue ҲΪÎÒÃÇÌṩÁË CSS Ô¤´¦Àí£¬ËùÒÔÎÒÃÇ¿ÉÒÔÑ¡ÔñÔÚ.vue ÎļþÀïд LESS »òÕß
SASS È¥´úÌæÔÉú CSS ¡£
4.ÎÒÃǹýȥͨ³£ÐèҪʹÓà npm ÏÂÔØÒ»¶ÑµÄÒÀÀµ£¬µ«ÊÇÏÖÔÚÎÒÃÇ¿ÉÒÔÑ¡Ôñ Vue-cli ¡£ÕâÊÇÒ»¸ö
vue Éú̬ϵͳÖÐÒ»¸öΰ´ó´´¾Ù¡£ÕâÒâζ×ÅÎÒÃDz»ÐèÒªÊÖ¶¯¹¹½¨ÎÒÃǵÄÏîÄ¿£¬¶øËü¾Í¿ÉÒÔºÜ¿ìµØÎªÎÒÃÇÉú³É¡£
Ê×ÏÈ£¬°²×° vue-cli ¡£(È·±£ÄãÓÐ node ºÍ npm)
npm i -g vue-cli
È»ºó´´½¨Ò»¸ö webpack ÏîÄ¿²¢ÇÒÏÂÔØÒÀÀµ
vue init webpack vue-tutorial
cd vue-tutorial
npm i
½Ó×ÅʹÓà npm run dev ÔÚÈȼÓÔØÖÐÔËÐÐÎÒÃǵÄÓ¦ÓÃ
ÕâÒ»ÐÐÃüÁî´ú±í×ÅËü»áÈ¥ÕÒµ½package.jsonµÄscripts¶ÔÏó£¬Ö´ÐÐnode
bulid/dev-server.js¡£ÔÚÕâÎļþÀÅäÖÃÁË Webpack £¬»áÈÃËüÈ¥±àÒëÏîÄ¿Îļþ£¬²¢ÇÒÔËÐзþÎñÆ÷£¬ÎÒÃÇÔÚlocalhost:8080¼´¿É²é¿´ÎÒÃǵÄÓ¦Óá£
ÕâЩ¶¼×¼±¸ºÃºó£¬ÎÒÃÇÐèҪΪÎÒÃǵÄ·ÓÉ¡¢ XHR ÇëÇó¡¢Êý¾Ý¹ÜÀíÏÂÔØÈý¸ö¿â£¬ÎÒÃÇ¿ÉÒÔ´Ó vue µÄ¹ÙÍøÖÐÕÒµ½ËûÃÇ¡£ÁíÍâÎÒÃÇʹÓÃbootstrap×÷ΪÎÒµÄ
UI ¿â
npm i vue-resource vue-router vuex bootstrap --save
³õʼ»¯£¨ main.js £©
²é¿´ÎÒÃǵÄÓ¦ÓÃÎļþ£¬ÎÒÃÇ¿ÉÒÔÔÚ src Ŀ¼ÏÂÕÒµ½App.vueºÍmain.js¡£main.js½«»á×÷ΪÎÒÃÇÓ¦ÓõÄÈë¿ÚÎļþ¶øApp.vue»á×÷ΪÎÒÃÇÓ¦Óõijõʼ»¯×é¼þ¡£ÏÈÈÃÎÒÃÇÀ´ÍêÉÆÏÂmain.js
//
src/main.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import VueResource from 'vue-resource'
import App from './App'
import Home from './components/Home'
import 'bootstrap/dist/css/bootstrap.css'
Vue.use(VueRouter)
Vue.use(VueResource)
const routes = [{
path : '/',
component : Home
},{
path : '/home',
component : Home
}];
const router = new VueRouter({
routes
});
/* eslint-disable no-new */
// ʵÀý»¯ÎÒÃÇµÄ Vue
var app = new Vue({
el: '#app',
router,
...App,
}); |
ÕâÓÐÁ½¸öÓë 1.0 ²»Í¬µÄµØ·½
Ò»¡¢vue-router·ÓɵIJÎÊýÓɶÔÏóͳһ±äΪÁËÊý×éҪעÒâ¡£»¹ÓÐÔòÊÇʵÀý»¯ vue µÄel²ÎÊýÒѾ²»ÄÜÉèÖÃhtmlºÍbodyÁË£¬ÒòΪÔÚvue2ÖÐÊÇ»áÌæ»»ÎÒÃÇÖ¸¶¨µÄ±êÇ©
¶þ¡¢ÎÒÃDZØÐëÔÚʵÀý»¯ vue µÄʱºòÖ¸¶¨äÖȾʲô×é¼þ£¬ÒÔǰÎÒÃÇÊÇͨ¹ý·ÓÉÀ´Ö¸¶¨Èçrouter.start(App,
'#app')£¬¶øÔÚ vue2 ÖÐÔò²»ÐèÒªÁË
¿ÉÒÔ·¢ÏÖÎÒÃÇÔÚmain.jsÀïʹÓÃÁËÁ½¸ö×é¼þApp.vueºÍHome.vue£¬ÉÔºóÈÃÎÒÃǾßÌåʵÏÖËüÃǵÄÄÚÈÝ¡£
¶øÎÒÃǵÄindex.htmlÖ»ÐèÒª±£Áô<div id="app"></div>¼´¿É£¬ÎÒÃǵÄ
Vue ÔÚʵÀý»¯Ê±ÉèÖÃÁËel : '#app' ËùÒÔ»áÌæ»»Õâ±êÇ©£¬ÎªÎÒÃÇApp×é¼þµÄÄÚÈÝ
//index.html
<div id="app"></div> |
ÎÒÃǵijõʼ»¯¾Íµ½Õâ½áÊøÁË£¬½ÓÏÂÀ´ÈÃÎÒÃÇ¿ªÊ¼´´½¨×é¼þ¡£
´´½¨Ê×Ò³×é¼þ
Ê×ÏÈÎÒÃÇÔÚ App.vue ÀïΪÎÒÃǵÄÓ¦ÓÃд¸ö¶¥²¿µ¼º½¡£
//
src/App.vue
<template>
<div id="wrapper">
<nav class="navbar navbar-default">
<div class="container">
<a class="navbar-brand" href="#">
<i class="glyphicon glyphicon-time"></i>
¼Æ»®°å
</a>
<ul class="nav navbar-nav">
<li><router-link to="/home">Ê×Ò³</router-link></li>
<li><router-link to="/time-entries">¼Æ»®Áбí</router-link></li>
</ul>
</div>
</nav>
<div class="container">
<div class="col-sm-3">
</div>
<div class="col-sm-9">
<router-view></router-view>
</div>
</div>
</div>
</template>
|
³ýÁËÎÒÃǵÄnavbarÒÔÍ⣬ÎÒÃÇ»¹ÐèÒªÒ»¸ö.containerÈ¥·ÅÎÒÃÇÆäÓàÐèҪչʾµÄÐÅÏ¢¡£ ²¢ÇÒÔÚÕâÀïÎÒÃÇÒª·ÅÒ»¸örouter-view±êÇ©£¬vue-routerµÄÇл»¾ÍÊÇͨ¹ýÕâ¸ö±êÇ©¿ªÊ¼ÏÔÏֵġ£
ÔÚÕâÓиöÓë 1.0 ²»Í¬µÄµØ·½
ÒÔǰÎÒÃÇ¿ÉÒÔÖ±½Óͨ¹ýд a ±êÇ© È»ºóд v-link ÊôÐÔ½øÐзÓÉÌø×ª£¬ÔÚ vue2 ÖиÄΪÁËд<router-link>±êÇ©ÔÙд¶ÔÓ¦ÊôÐÔ£¨
to £©½øÐÐÌø×ª
½Ó×Å£¬ÎÒÃÇÐèÒª´´½¨Ò»¸öHome.vue×÷ΪÎÒÃǵÄÊ×Ò³
//
src/components/Home.vue
<template>
<div class="jumbotron">
<h1>ÈÎÎñ×·×Ù</h1>
<p>
<strong>
<router-link to="/time-entries">´´½¨Ò»¸öÈÎÎñ</router-link>
</strong>
</p>
</div>
</template>
|
²»³öÒâÍâµÄ»°£¬Äã¿ÉÒÔ¿´¼ûÈçÏÂЧ¹û
´´½¨²à±ßÀ¸×é¼þ
ĿǰÎÒÃÇÊ×Ò³×ó²à»¹ÓÐÒ»¿é¿Õ°×£¬ÎÒÃÇÐèÒªËü·ÅÏÂÒ»¸ö²à±ßÀ¸È¥Í³¼ÆËùÓмƻ®µÄ×Üʱ¼ä¡£
//
src/App.vue
//...
<div class="container">
<div class="col-sm-3">
<sidebar></sidebar>
</div>
<div class="col-sm-9">
<router-view></router-view>
</div>
</div>
//... |
<script>
import Sidebar from './components/Sidebar.vue'
export default {
components: { 'sidebar': Sidebar },
}
</script> |
ÔÚSidebar.vueÎÒÃÇÐèҪͨ¹ý store È¥»ñÈ¡×Üʱ¼ä£¬ÎÒÃǵÄ×Üʱ¼äÊǹ²ÏíµÄÊý¾Ý
//
src/components/Sidebar.vue
<template>
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="text-center">ÒÑÓÐʱ³¤</h1>
</div>
<div class="panel-body">
<h1 class="text-center">{{ time
}} Сʱ</h1>
</div>
</div>
</template>
<script>
export default {
computed: {
time() {
return this.$store.state.totalTime
}
}
}
</script> |
´´½¨¼Æ»®Áбí×é¼þ
È»ºóÎÒÃÇÐèҪȥ´´½¨ÎÒÃǵÄʱ¼ä¸ú×ÙÁÐ±í¡£
//
src/components/TimeEntries.vue
<template>
<div>
//`v-if`ÊÇ vue µÄÒ»¸öÖ¸Áî
//`$route.path`Êǵ±Ç°Â·ÓɶÔÏóµÄ·¾¶£¬»á±»½âÎöΪ¾ø¶Ô·¾¶µ±
//`$route.path !== '/time-entries/log-time'`Ϊ`true`ÊÇÏÔʾ£¬`false`£¬Îª²»ÏÔʾ¡£
//to ·ÓÉÌø×ªµØÖ·
<router-link
v-if="$route.path !== '/time-entries/log-time'"
to="/time-entries/log-time"
class="btn btn-primary">
´´½¨
</router-link>
<div v-if="$route.path === '/time-entries/log-time'">
<h3>´´½¨</h3>
</div>
<hr>
<router-view></router-view>
<div class="time-entries">
<p v-if="!plans.length"><strong>»¹Ã»ÓÐÈκμƻ®</strong></p>
<div class="list-group">
<--
v-for Ñ»·£¬×¢Òâ²ÎÊý˳ÐòΪ(item,index) in items
-->
<a class="list-group-item" v-for="(plan,index)
in plans">
<div class="row">
<div class="col-sm-2 user-details">
<--
`:src`ÊôÐÔ£¬Õâ¸öÊÇ vue µÄÊôÐ԰󶨼òд`v-bind`¿ÉÒÔËõдΪ`:`
±ÈÈç a ±êÇ©µÄ`href`¿ÉÒÔдΪ`:href`
²¢ÇÒÔÚ vue µÄÖ¸ÁîÀï¾ÍÒ»¶¨²»ÒªÐ´²åÖµ±í´ïʽÁË(`:src={{xx}}`)£¬ vue
×Ô¼º»áÈ¥½âÎö
-->
<img :src="plan.avatar" class="avatar
img-circle img-responsive" />
<p class="text-center">
<strong>
{{ plan.name }}
</strong>
</p>
</div>
<div class="col-sm-2 text-center time-block">
<h3 class="list-group-item-text total-time">
<i class="glyphicon glyphicon-time"></i>
{{ plan.totalTime }}
</h3>
<p class="label label-primary text-center">
<i class="glyphicon glyphicon-calendar"></i>
{{ plan.date }}
</p>
</div>
<div class="col-sm-7 comment-section">
<p>{{ plan.comment }}</p>
</div>
<div class="col-sm-1">
<button
class="btn btn-xs btn-danger delete-button"
@click="deletePlan(index)">
X
</button>
</div>
</div>
</a>
</div>
</div>
</div>
</template> |
¹ØÓÚ template µÄ½âÊÍ£¬¶¼Ð´ÔÚÒ»ÆðÁË£¬ÔÙ¿´¿´ÎÒÃǵÄscript
//
src/components/TimeEntries.vue
<script>
export default {
name : 'TimeEntries',
computed : {
plans () {
// ´Ó store ÖÐÈ¡³öÊý¾Ý
return this.$store.state.list
}
},
methods : {
deletePlan(idx) {
// ÉÔºóÔÙÀ´ËµÕâÀïµÄ·½·¨
// ¼õÈ¥×Üʱ¼ä
this.$store.dispatch('decTotalTime',
this.plans[idx].totalTime)
// ɾ³ý¸Ã¼Æ»®
this.$store.dispatch('deletePlan',idx)
}
}
}
</script> |
±ðÍüÁËΪÎÒÃǵÄ×é¼þдÉÏһЩÐèÒªµÄÑùʽ
//
src/components/TimeEntries.vue
<style>
.avatar {
height: 75px;
margin: 0 auto;
margin-top: 10px;
margin-bottom: 10px;
}
.user-details {
background-color: #f5f5f5;
border-right: 1px solid #ddd;
margin: -10px 0;
}
.time-block {
padding: 10px;
}
.comment-section {
padding: 20px;
}
</style> |
¼ÈÈ»ÎÒÃǵÄÊý¾ÝÊǹ²ÏíµÄ£¬ËùÒÔÎÒÃÇÐèÒª°ÑÊý¾Ý´æÔÚstoreÀï
ÎÒÃÇÔÚ src Ï´´½¨¸öĿ¼Ϊstore
ÔÚstoreÏ·ֱ𴴽¨ 4 ¸ö js Îļþactions.js,index.js,mutation-types.js,mutations.js
¿´Ãû×ÖÒ²¾ÍÖªµÀÕâ 4 ¸ö·Ö±ðÊÇ×öɶÓõÄÁË£¬½¨Òé´ó¼Ò¶àÔĶÁÔĶÁvuexµÄÎĵµ£¬¶à×ËÊÆ¶à¶¯ÊÖʵ¼ù£¬ÂýÂýµÄÒ²¾ÍÄÜÀí½âÁË¡£
//
src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
// ÏÈд¸ö¼ÙÊý¾Ý
const state = {
totalTime: 0,
list: [{
name : '¶þÕÜ',
avatar : 'https://sfault-avatar.b0.upaiyun.com/147/223/147223148-573297d0913c5_huge256',
date : '2016-12-25',
totalTime : '6',
comment : '12 Ô 25 ÈÕÍêÉÆ£¬ÅãÅ®ÅóÓÑÒ»Æð¹ýÊ¥µ®½ÚÐèÒª 6 ¸öСʱ'
}]
};
export default new Vuex.Store({
state,
}) |
ÓÉÓÚÐÂÔöÁËÒ³ÃæºÍ store ÔÚÎÒÃǵÄÈë¿Ú js ÎļþÀïÅäÖÃÏÂ
//
src/main.js
import store from './store'
import TimeEntries from './components/TimeEntries.vue'
//...
const routes = [{
path : '/',
component : Home
},{
path : '/home',
component : Home
},{
path : '/time-entries',
component : TimeEntries,
}];
var app = new Vue({
el: '#app',
router,
store,
...App,
});
|
²»³öÒâÍâµÄ»°£¬Äã¿ÉÒÔÔÚ/time-entries ·ÓÉÏ¿´¼ûÕâÑùµÄÒ³Ãæ
ͨ¹ývue-DevtoolsÎÒÃÇ¿ÉÒÔ·¢ÏÖÎÒÃÇµÄ store ÒѾ¹¹ÔìºÃÁ˲¢Çҳɹ¦´Ó store »ñÈ¡ÁËÊý¾Ý
´´½¨ÈÎÎñ×é¼þ
Õâ¸ö±È½Ï¼òµ¥ÎÒÃÇÖ±½Ó¸ø³ö´úÂë
//
src/components/LogTime.vue
<template>
<div class="form-horizontal">
<div class="form-group">
<div class="col-sm-6">
<label>ÈÕÆÚ</label>
<input
type="date"
class="form-control"
v-model="date"
placeholder="Date"
/>
</div>
<div class="col-sm-6">
<label>ʱ¼ä</label>
<input
type="number"
class="form-control"
v-model="totalTime"
placeholder="Hours"
/>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label>±¸×¢</label>
<input
type="text"
class="form-control"
v-model="comment"
placeholder="Comment"
/>
</div>
</div>
<button class="btn btn-primary"
@click="save()">±£´æ</button>
<router-link to="/time-entries"
class="btn btn-danger">È¡Ïû</router-link>
<hr>
</div>
</template>
<script>
export default {
name : 'LogTime',
data() {
return {
date : '',
totalTime : '',
comment : ''
}
},
methods:{
save() {
const plan = {
name : '¶þÕÜ',
image : 'https://sfault-avatar.b0.upaiyun.com/888/223/888223038-5646dbc28d530_huge256',
date : this.date,
totalTime : this.totalTime,
comment : this.comment
};
this.$store.dispatch('savePlan', plan)
this.$store.dispatch('addTotalTime', this.totalTime)
this.$router.go(-1)
}
}
}
</script> |
Õâ¸ö×é¼þºÜ¼òµ¥¾Í 3 ¸ö input ÊäÈë¶øÒÑ£¬È»ºó¾ÍÁ½¸ö°´Å¥£¬±£´æÎÒÃǾͰÑÊý¾Ý push ½øÎÒÃÇ
store µÄÁбíÀï
LogTimeÊôÓÚÎÒÃÇTimeEntries×é¼þµÄÒ»¸ö×Ó·ÓÉ£¬ËùÒÔÎÒÃÇÒÀ¾ÉÐèÒªÅäÖÃÏÂÎÒÃǵÄ·ÓÉ£¬²¢ÇÒÀûÓÃ
webpack ÈÃËüÀÁ¼ÓÔØ£¬¼õÉÙÎÒÃÇÊׯÁ¼ÓÔØµÄÁ÷Á¿
//
src/main.js
//...
const routes = [{
path : '/',
component : Home
},{
path : '/home',
component : Home
},{
path : '/time-entries',
component : TimeEntries,
children : [{
path : 'log-time',
// ÀÁ¼ÓÔØ
component : resolve => require(['./components/LogTime.vue'],resolve),
}]
}];
//... |
vuex ²¿·Ö
ÔÚ vue2.0 ÖзϳýÁËʹÓÃʼþµÄ·½Ê½½øÐÐͨÐÅ£¬ËùÒÔÔÚСÏîÄ¿ÖÐÎÒÃÇ¿ÉÒÔʹÓà Event Bus £¬ÆäÓà×îºÃ¶¼Ê¹ÓÃ
vuex £¬±¾ÎÄÎÒÃÇʹÓà Vuex À´ÊµÏÖÊý¾ÝͨÐÅ
ÏàÐÅÄã¸Õ¸ÕÒѾ¿´¼ûÁËÎÒдÁ˺ܶàthis.$store.dispatch('savePlan', plan)
ÀàËÆÕâÑùµÄ´úÂ룬ÎÒÃÇÔÙ´Îͳһ˵Ã÷¡£
×Ðϸ˼¿¼Ò»Ï£¬ÎÒÃÇÐèÒªÁ½¸öÈ«¾ÖÊý¾Ý£¬Ò»¸öΪËùÓмƻ®µÄ×Üʱ¼ä£¬Ò»¸öÊǼƻ®ÁбíµÄÊý×é¡£
src/store/index.js ûɶ̫¶à¿É½éÉܵ쬯äʵ¾ÍÊÇ´«ÈëÎÒÃǵÄstate,mutations,actionsÀ´³õʼ»¯ÎÒÃǵÄ
Store ¡£Èç¹ûÓÐÐèÒªµÄ»°ÎÒÃÇ»¹¿ÉÄÜÐèÒª´´½¨ÎÒÃǵÄgetterÔÚ±¾ÀýÖоͲ»ÓÃÁË¡£
½Ó×ÅÎÒÃÇ¿´mutation-types.js£¬¼ÈÈ»ÏëºÜÃ÷È·ÁË
//
src/store/mutation-types.js
// Ôö¼Ó×Üʱ¼ä»òÕß¼õÉÙ×Üʱ¼ä
export const ADD_TOTAL_TIME = 'ADD_TOTAL_TIME';
export const DEC_TOTAL_TIME = 'DEC_TOTAL_TIME';
// ÐÂÔöºÍɾ³ýÒ»Ìõ¼Æ»®
export const SAVE_PLAN = 'SAVE_PLAN';
export const DELETE_PLAN = 'DELETE_PLAN';
|
//
src/store/mutations.js
import * as types from './mutation-types'
export default {
// Ôö¼Ó×Üʱ¼ä
[types.ADD_TOTAL_TIME] (state, time) {
state.totalTime = state.totalTime + time
},
// ¼õÉÙ×Üʱ¼ä
[types.DEC_TOTAL_TIME] (state, time) {
state.totalTime = state.totalTime - time
},
// ÐÂÔö¼Æ»®
[types.SAVE_PLAN] (state, plan) {
// ÉèÖÃĬÈÏÖµ£¬Î´À´ÎÒÃÇ¿ÉÒÔ×öµÇÈëÖ±½Ó¶ÁÈ¡êdzƺÍÍ·Ïñ
const avatar = 'https://sfault-avatar.b0.upaiyun.com/147/223/147223148-573297d0913c5_huge256';
state.list.push(
Object.assign({ name: '¶þÕÜ', avatar: avatar },
plan)
)
},
// ɾ³ýij¼Æ»®
[types.DELETE_PLAN] (state, idx) {
state.list.splice(idx, 1);
}
}; |
½âÊý¾Ý£¬ÄǾÍÓ¦¸ÃÓÐʲôÑùµÄ²Ù×÷¿´Æð£¬µ±È»ÕâÒ²¿´¸öÈË¿Úζ¹þ
×îºó¶ÔÓ¦¿´ÎÒÃǵÄactions¾ÍºÜÃ÷°×ÁË
//
src/store/actions.js
import * as types from './mutation-types'
export default {
addTotalTime({ commit }, time) {
commit(types.ADD_TOTAL_TIME, time)
},
decTotalTime({ commit }, time) {
commit(types.DEC_TOTAL_TIME, time)
},
savePlan({ commit }, plan) {
commit(types.SAVE_PLAN, plan);
},
deletePlan({ commit }, plan) {
commit(types.DELETE_PLAN, plan)
}
};
|
ÎÒÃǵÄactionsÆäʵ¾ÍÊÇÈ¥´¥·¢Ê¼þºÍ´«Èë²ÎÊýÀ²
¼ÓÁËÕâÈý¸öÎļþºóÎÒÃÇµÄ store ÖÕÓÚÍêÕûÁË£¬¸üÐÂÏÂÎÒÃǵĴúÂë
//
src/store/index.js ÍêÕû´úÂë
import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'
Vue.use(Vuex);
const state = {
totalTime: 0,
list: []
};
export default new Vuex.Store({
state,
mutations,
actions
})
|
this.$store.dispatch('savePlan', plan)µ±Ö´ÐÐÁËÕâÑùµÄ·½·¨¾Í»áµ÷ÓÃactions.jsÀïµÄsavePlan·½·¨£¬¶øsavePlanÓֻᴥ·¢
mutationsÀïµÄ types.SAVE_PLAN ×îºóÐÞ¸ÄÊý¾ÝÊÓͼ¸üÐÂ
PS £ºÔÚÕâÓиö¼¼ÇɾÍÊÇ£¬ÔÚmutationsÀï¶¼ÊÇÓôóдÏ»®ÏßÁ¬½Ó£¬¶øÎÒÃǵÄactionsÀï¶¼ÓÃСдÍÕ·å¶ÔÓ¦¡£
¸öÈËÀí½âÕâÆäʵ¾ÍÊÇÒ»¸ö·¢²¼¶©ÔĵÄģʽ
mutation-types ¼Ç¼ÎÒÃÇËùÓеÄʼþÃû
mutations ×¢²áÎÒÃǸ÷ÖÖÊý¾Ý±ä»¯µÄ·½·¨
actions Ôò¿ÉÒÔ±àдÒì²½µÄÂß¼»òÕßÊÇһЩÂß¼£¬ÔÙÈ¥commit ÎÒÃǵÄʼþ
Èç¹ûÓÐgetter ÎÒÃÇ¿ÉÒÔ°ÑһЩÐèÒª´¦Àí·µ»ØµÄÊý¾Ý·ÅÔÚÕâ¼´¿É£¬²»½øÐÐÒµÎñ²Ù×÷
×îºó±ðÍüÁËÔÚÎÒÃǵÄmain.jsÀïʹÓÃÎÒÃǵÄstore
//
src/store/main.js
import store from './store'
// ...
var app = new Vue({
el: '#app',
router,
store,
...App,
}); |
¿ªÊ¼ÌåÑéÏÂÄã×Ô¼ºµÄÈÎÎñ¼Æ»®°å°É£¡
×îºó
ͨ¹ý±¾ÎÄ£¬ÎÒÃÇ¿ÉÒÔѧϰµ½Ðí¶à¹ØÓÚ vue µÄÌØÐÔ¡£
1.Á˽âÁË vue-cli ½ÅÊÖ¼Ü
2.³õ²½¶Ô webpack ÓÐÁËһЩÁ˽âºÍÈÏʶ
3.ÈçºÎÓÃ.vue Óä¿ìµÄ¿ª·¢
4.ʹÓà vuex ½øÐÐ×é¼þͨÐÅ
5.·ÓÉ£¨×Ó·ÓÉ£©µÄÓ¦ÓÃ
6.ʹÓà vue-devtools ¹Û²ìÎÒÃǵÄÊý¾Ý |