±à¼ÍƼö: |
±¾ÎÄÀ´×Ô¸öÈ˲©¿Í£¬±¾ÎÄͨ¹ýVue
API¸ÅÊöµÄÄÚÈÝ£¬ÓÉdzÈëÉî²ûÊöÁËES6ºÍVueÏà¹ØµÄÄÚÈݺÍmvvmµÄ˼Ïë¡£ |
|
ǰÑÔ
¹«Ë¾Ä¿Ç°ÖÆ×÷Ò»¸öH5»î¶¯£¬ÌرðÊÇÓÐÒ»¶¨Í³Ò»½á¹¹µÄ»î¶¯£¬¶¼ÒªÂëÒ»¸öÖØ¸´µÄÂÖ×Ó¡£ºóÀ´½Óµ½Ò»¸ö»ùÓÚÄ£°åµÄ»î¶¯Éè¼ÆÏµÍ³µÄÐèÇ󣬱ãÓÐÁËһϵÄÄÚÈÝ¡£Ê×ÏÈ»á¶ÔʹÓÃVue½øÐпª·¢µÄһЩǰÆÚÐèÒªµÄ¼¼Êõ´¢±¸½øÐмòµ¥½éÉÜ¡£
×é¼þ»¯
ÐèÇóÒ»µ½£¬½Ó¾ÍÊÇÔõôʵÏÖ£¬¼¼ÊõÑ¡ÐÍ×ÔÈ»³ÉΪÁ˵ÚÒ»¸öÎÊÌâ¡£¼øÓÚĿǰwebǰ¶Ëmvvm¿ò¼ÜÒÔ¼°×é¼þ»¯¿ª·¢·½Ê½µÄÁ÷ÐУ¬¾ö¶¨¼¼ÊõÕ»²ÉÓãºvue
+ vuex + es6 + browserify¡£
ÕâÀïÊ×Ïȼòµ¥ËµÏÂwebǰ¶Ë×é¼þ»¯¿ª·¢·½Ê½µÄÀú³Ì£º
×îÔçµÄ×é¼þ»¯½á¹¹£¬´úÂë½á¹¹¿ÉÄÜÈçÏ£º
-
lib/components/calendar
|- calendar.css
|- calendar.js
|- calendar.html |
½«Í¬¹¦ÄܵÄ×é¼þÎļþ·Åµ½Í¬Ò»Ä¿Â¼Ï£¬½á¹¹ÇåÎú¡¢Ö°ÔðÃ÷È·£¬ÊÓͼ¡¢Ñùʽ¡¢½Å±¾µÄ¹ØÏµÏÔÖø£¬Ò²Ò×ÓÚµ¥Ôª²âÊÔ£¬ÊǶÀÁ¢Õ¹Ê¾ºÍ½»»¥µÄ×îСµ¥Ôª¡£
ºóÀ´£º
ÔÚ֮ǰ»ù´¡É϶Ô×é¼þ½øÐÐÁËÉúÃüÖÜÆÚµÄ¼Ó¹¤(³õʼ»¯¡¢»ñÈ¡×ÊÔ´¡¢äÖȾ¡¢¸üС¢Ïú»ÙµÈ)£¬Àí˳ÁË×é¼þµÄ¸÷¸ö½×¶Î£¬ÓÐÖúÓÚ¶Ô×é¼þʵÏÖ(´Ó³õʼ»¯µ½Ïú»Ù)µÄÀí½â¡£²¢ÇÒ½èÖúÓÚ×é¼þ¸÷¸ö½×¶ÎµÄ¹³×Ó¿ÉÒÔ¶Ô×é¼þÓиüºÃµÄÀûÓúÍÀ©Õ¹¡£¶ÔÍⱩ¶½Ó¿Ú£¬Êý¾Ý°ó¶¨»òÕß˵Êý¾Ý²Ö¿âµÄ¼ÓÈ룬¸÷ÖÖxMDÄ£¿é¼ÓÔØÆ÷µÄ³öÏÖ£¬Ò²ÈÃÕâÖÖÕâÖÖ¿ª·¢·½Ê½ÉÏÉýÁËÒ»¸ö²ã¼¶¡£ExtJs¡¢YUIµÈ¶¼ÊÇÕâ·½ÃæµÄר¼Ò¡£
ÔÙºóÀ´£º
ÓÐÁË֮ǰ·¢Õ¹£¬½ø²½ÊǺܴóµÄ£¬µ«ÒÀÈ»²»¹»¡£×é¼þµÄ¿É¸´ÓÃÐÔ(»ù´¡Ñùʽ£¬»ù´¡Âß¼£¬»ù´¡ÊôÐÔ¡¢¿É¸´ÓõÄÎȶ¨ÒµÎñÂß¼µÈ)¡¢×é¼þ¼äͨÐÅ¡¢È«¾Ö״̬¹ÜÀí¡¢ÉõÖÁÊÇÄÜ·ñÓиüºÃµÄ´úÂë×éÖ¯·½Ê½µÈÒÀÈ»ÊÇÎÊÌâ¡£Angular¡¢React¡¢Polymer¡¢VueµÈmvvm¿ò¼ÜºÍwebpack¡¢browserifyµÈ¹¹½¨¡¢Ô¤±àÒ빤¾ßµÄ³öÏÖÕýÊÔͼ½â¾öÕâЩÎÊÌâ¡£
ES6
ÔÚÕýʽ¿ªÊ¼vue֮ǰ£¬ÒòΪ±¾ÏîÄ¿Óõ½ÁËes6£¬ÄÇô¾Í̸̸´ó¼Ò¶¼¹Ø×¢µÄEcmaScript6¡£¶àÓàµÄ¾Í²»ËµÁË£¬es6¾ÀúÁ˶àÄêµÄ¿à£¬ÖÕÓÚÔÚ2015ÄêϰëÄ궨¸å£¬ÕýʽÃû³Æ£ºEcmaScript2015¡£Ã¿¸ö¸Õ¿ªÊ¼½Ó´¥es6µÄÈËÓ¦¸Ã¶¼ÓÐÕâôһ¸öÎÊÌ⣬es6µÄ³öÏÖµ½µ×ÊÇΪÁËʲô£¬»òÕß˵Ëü½â¾öÁËʲô¡£Àϰ汾es4/5ËäÈ»¿Ó¶à£¬¾ÍÏñBrendan
EichÆÀ¼ÛjsÒ»Ñù£º"ÓÅÐãÖ®´¦²¢·ÇÔ´´£¬Ô´´Ö®´¦²¢²»ÓÅÐã"¡£µ«ÎÒÃDz»Ò²ÊÇÈ¥Æä²ÛÆÉ£¬ÁôÆä¾«Ë裬һ·Ìî¿Ó×ß¹ýÁËÂð£¿
À´Ö±½ÓÒ»µã£¬es6³£ÓõÄÌØÐÔÓУºclassÀàµÄÖ§³Ö¡¢¼ýÍ·º¯Êý¡¢¶ÔÏóºÍÊý×éµÄ½â¹¹¡¢Ä¬ÈϲÎÊý¡¢²»¶¨²ÎÊý¡¢¶ÔÏóºÏ²¢¡¢letÓëconst¹Ø¼ü×Ö¡¢for
ofµü´ú¡¢×Ö·û´®Ä£°å¡¢¶ÔÏó×ÖÃæÁ¿ÔöÇ¿¡¢Í¬Ãû¶ÔÏó×ÖÃæÁ¿Ëõд¡¢Ä£¿é»¯import/export¡¢map¡¢promise¡¢*
yeildÉú³ÉÆ÷µÈ¡£
ÕâÀïÌô³ö¼¸¸ö³£Óõļòµ¥ËµÏ£º
Ê×ÏÈclass:
ÔÚûÓÐclassµÄʱºò£¬´´½¨ÀàµÄÒ»ÖֱȽϱê×¼µÄ·½Ê½Êǽ«·Çº¯ÊýµÄÊôÐԷŵ½¹¹Ô캯ÊýÀº¯ÊýÊôÐÔÔÚÔÐÍÁ´ÀïÌí¼Ó¡£ÀàµÄ¼Ì³ÐµÄʵÏ־͸üΪ¶àÑù£º¶ÔÏóð³ä¡¢call/apply·½Ê½¡¢ÔÐÍÁ´·½Ê½µÈ¡£es6µÄclassºÍextends¹Ø¼ü×ֵijöÏÖ¸ø³öÁËÒ»¸öͳһµÄ¹æ·¶
class
People {
constructor (name, age, gender){
this.name = name
}
sayName (){
return this.name
}
}
class Student extends People {
constructor (name, age, gender, skill){
super(name, age, gender)
this.skill = skill
}
saySkill (){
return this.skill
}
}
let tom = new Student('tom', 16, 'male', 'computer')
tom.sayName() // => 'tom'
tom.saySkill() // => 'computer'
tom.__proto__ == Student.prototype // =>
true
Student.__proto__ == People // => true |
¿ÉÒÔ¿´³öËäÈ»ÊÇеĹ淶£¬µ«ÊÇ»¹ÊÇ×ñÊØjsµÄÔÔò£º¶ÔÏóµÄ__proto__Ö¸ÏòËüµÄ¹¹Ô캯Êý(Àà)µÄprototype¡£es6¶ÔÏó×ÖÃæÁ¿µÄ__proto__×¢ÈëÒ²ÄÜ¿ìËÙµÄʵÏּ̳С£
ÔÚ´¿Vue×é¼þÖУ¬ÎÒÃDz»»á×Ô¼ºÐ´class£¬ÒòΪVueÊǸ߶ȷâ×°µÄ£¬ÎÒÃÇÖ»ÐèÒª¸øµ×²ãµÄclass´«ÈëÎÒÃǵÄÅäÖöÔÏó¼´¿É£¬µ«Á˽âes6µÄclassÒ²ÊÇÓбØÒªµÄ¡£VueµÄÕâµãÏà¶ÔreactÀ´Ëµ£¬ÊÇÒ»¸öÏÔÖø²»Í¬µÄµØ·½¡£
½ÓÏÂÀ´ÊÇlet£º
es6֮ǰjsÖ»Óк¯Êý×÷ÓÃÓò£¬letµÄ³öÏÖÓÐÁ˿鼶×÷ÓÃÓò£¬Ò²¾ÍËãÊÇif¡¢else¡¢forÕâÀàÒ²ÓÐÁË×÷ÓÃÓò£¬¿éÄÚÓÃletÉùÃ÷µÄ±äÁ¿ÍâÃæÊÇ·ÃÎʲ»µ½µÄ£¬ÔÚjsÔ¤½âÎöµÄʱºò£¬ÊDz»»á±»ÌáÉýµ½µ±Ç°º¯Êý×÷ÓÃÓòµÄÇ°ÃæµÄ¡£»ùÓÚ¸ÃÌØÐÔ£¬ÔÚforµü´úµÄʱºò£¬Ã¿´Îµü´ú¶¼»á²úÉúÒ»¸ö¿é¼¶×÷ÓÃÓòµÄ¶ÀÁ¢µÄµü´ú±äÁ¿£¬ÈÃ×îºóµÄ½á¹û¾ÍÊÇÎÒÃÇÆÚ´ýµÄ½á¹û¡£
var
arr = [];
for (let i = 0; i < 10; i ++){
arr[i] = function (){
return i
}
}
arr[6]() // => 6
//Èç¹ûÓÃvarÉùÃ÷i£¬ÎÞÂÛ¶àÉٴεü´ú£¬Íâ²ãµÄiʼÖÕ±»Ã¿´Îµü´úµÄº¯ÊýÄÚ²¿ÒýÓÃ×Å(±Õ°ü)£¬²»»á±»µ±×öÀ¬»ø»ØÊÕ£¬×îºóµÄ½á¹û¶¼Ö¸Ïòͬһ¸öi£¬ÖµÎª10¡£
//ÒÔÍùΪÁ˱ÜÃâÕâ¸öÎÊÌ⣬ͨ³£»áÕâô×ö£º
for (var i = 0; i < 10; i ++){
arr[i] = (function (i){
return function (){
return i
}
})(i)
} |
×îºó½²½²¼ýÍ·º¯Êý£º
es6֮ǰµÄfunctionÓÐÒ»¸öÌØµã£ºº¯ÊýÄÚ²¿µÄÉÏÏÂÎIJ¢²»ÊÇÓɸú¯ÊýдÔÚÄÇÀï¾ö¶¨µÄ£¬¶øÊÇÓÉ˵÷Óþö¶¨µÄ£¬Ëµ÷Óú¯ÊýÄÚ²¿µÄthis¾ÍÖ¸ÏòË¡£È»ºóÎÒÃÇÓÐЩʱºò²¢²»ÏëÈÃËûÕâÑù£¬µ«ÓÖû°ì·¨£¬Ö»ÄÜͨ¹ýÏȱ£´æthis£¬»òÕßcall/apply£¬»òÕßbindÀ´µ÷ÕûÉÏÏÂÎÄ¡£¼ýÍ·º¯ÊýµÄ³öÏÖ½â¾öÁËÕâ¸öÄþÈË¿àÄÕµÄÎÊÌ⣬ÒòΪ¼ýÍ·º¯ÊýÄÚµÄÉÏÏÂÎÄ(this)ÊÇÓɺ¯ÊýдÔÚÄľö¶¨µÄ£¬ÎÞÂÛ±»Äĸö¶ÔÏóµ÷Óã¬ÉÏÏÂÎͼ²»»á¸Ä±ä¡£
// ÔÚwindowÉÏÏÂÎÄÖÐ
var obj = {
test1 : function (){
window.setTimeout(function (){
console.info(this)
}, 100)
},
test2 : function (){
window.setTimeout(() => {
console.info(this)
}, 100)
},
test3: () => console.info(this),
test4: function (){
console.info(this)
},
test5 (){ // ¶ÔÏóÔöǿд·¨
¡¡¡¡console.info(this);
}
}
obj.test1() // => Window {}
obj.test2() // => obj {}
obj.test3() // => Window {}
obj.test4() // => obj {}
obj.test5() // => obj {} |
¼ýÍ·º¯ÊýthisËø¶¨ÌØÐÔÖµµÃϸϸƷ棬ÔÚĿǰµÄVue»òÕßReactÓ¦ÓÃÖÐÓÐÃîÓá£
ÓÃÆÕͨº¯Êý»¹ÊǼýÍ·º¯Êý²¢·Ç¾ø¶Ô£¬¼ýÍ·º¯ÊýÒ²²»ÄÜÍêÈ«Ìæ´úÆÕͨº¯Êý£¬ÒªÓÃÄĸöÓɾßÌåÂß¼¾ö¶¨£¬Ç°ÌáÊÇÒªÏÈÁ˽âËûÃǵÄÇø±ð¡£
¼ýÍ·º¯Êý»¹ÓÐÒ»¸öÌØµã¾ÍÊÇÄܹ»¼ò»¯returnµÄÊéд¡£
var
a = function (n){
return n
}
var b = (n) => n //¿ÉÒÔÊ¡ÂÔreturnºÍ»¨À¨ºÅ
var c = n => n //Èç¹ûÖ»ÓÐÒ»¸ö²ÎÊý£¬ÖÐÀ¨ºÅÒ²¿ÉÒÔÊ¡ÂÔ
a(1) // => 1
b(1) // => 1
c(1) // => 1 |
´ÓÕ⼸¸ö¼òµ¥µÄÀý×Ó¿ÉÒÔ¿´³ö£¬es6²»½ö½öÊÇÐÂÔöÁ˼¸¿ÅÌÇ£¬¶Ô֮ǰjsµÄһЩ²»ÓѺõĵط½µÄ¸ÄÉÆ²ÅÊÇÖØµã¡£
Vue
½øÈëÕýÌ⣬
Vue.js£¨¶ÁÒô /vju?/, ÀàËÆÓÚ view£©ÊÇÒ»¸ö¹¹½¨Êý¾ÝÇý¶¯µÄ
web ½çÃæµÄ¿â¡£Vue.js µÄÄ¿±êÊÇͨ¹ý¾¡¿ÉÄܼòµ¥µÄ API ʵÏÖÏìÓ¦µÄÊý¾Ý°ó¶¨ºÍ×éºÏµÄÊÓͼ×é¼þ¡£
Vue.js ×ÔÉí²»ÊÇÒ»¸öÈ«ÄÜ¿ò¼Ü¡ª¡ªËüÖ»¾Û½¹ÓÚÊÓͼ²ã¡£Òò´ËËü·Ç³£ÈÝÒ×ѧϰ£¬·Ç³£ÈÝÒ×ÓëÆäËü¿â»òÒÑÓÐÏîÄ¿ÕûºÏ¡£ÁíÒ»·½Ã棬ÔÚÓëÏà¹Ø¹¤¾ßºÍÖ§³Ö¿âÒ»ÆðʹÓÃʱ£¬Vue.js
Ò²ÄÜÍêÃÀµØÇý¶¯¸´Ôӵĵ¥Ò³Ó¦Óá£
¡ª ÎÄÖйØÓÚvueµÄ´ó²¿·ÖÄÚÈÝÒýÓÃ×ÔvueµÄ¹Ù·½Îĵµ£¬¸Ðл×÷ÕߵŤ×÷£¡
ÏìÓ¦µÄÊý¾Ý°ó¶¨£º
<div
id="app">
<p>{{ message }}</p>
<input v-model="message">
</div> |
new
Vue({
el : '#app',
data : {
message : 'Hello Vue.js!'
}
}) |
½á¹û£º¸Ä±äÊäÈë¿òµÄÖµ£¬<p>±êÇ©µÄÎı¾Ò²»á¶ÔÓ¦¸Ä±ä¡£
»ù±¾¹¤×÷ÔÀí£º<input>ÊäÈë¿òµÄÖµÓëvueʵÀýµÄmessageÊôÐÔ½øÐÐÁ˰󶨣¬<p>±êÇ©µÄÎı¾Ò²ÓëmessageÊôÐÔ½øÐÐÁ˰󶨡£ÊäÈë¿òÖµµÄ±ä»¯»á¸Ä±ämessageµÄÖµ£¬messageÖµµÄ±ä»¯»á·´Ó¦µ½<p>±êÇ©µÄÎı¾ÉÏ¡£
Vue.js µÄºËÐÄÊÇÒ»¸öÏìÓ¦µÄÊý¾Ý°ó¶¨ÏµÍ³£¬ËüÈÃÊý¾ÝÓë DOM ±£³Öͬ²½·Ç³£¼òµ¥¡£ÔÚʹÓÃ
jQuery ÊÖ¹¤²Ù×÷ DOM ʱ£¬ÎÒÃǵĴúÂë³£³£ÊÇÃüÁîʽµÄ¡¢Öظ´µÄÓëÒ×´íµÄ¡£Vue.js Óµ±§Êý¾ÝÇý¶¯µÄÊÓͼ¸ÅÄͨË׵ؽ²£¬ËüÒâζ×ÅÎÒÃÇÔÚÆÕͨ
HTML Ä£°åÖÐʹÓÃÌØÊâµÄÓï·¨½« DOM ¡°°ó¶¨¡±µ½µ×²ãÊý¾Ý¡£Ò»µ©´´½¨Á˰󶨣¬DOM ½«ÓëÊý¾Ý±£³Öͬ²½¡£Ã¿µ±ÐÞ¸ÄÁËÊý¾Ý£¬DOM
±ãÏàÓ¦µØ¸üС£ÕâÑùÎÒÃÇÓ¦ÓÃÖеÄÂß¼¾Í¼¸ºõ¶¼ÊÇÖ±½ÓÐÞ¸ÄÊý¾ÝÁË£¬²»±ØÓë DOM ¸üнÁÔÚÒ»Æð¡£ÕâÈÃÎÒÃǵĴúÂë¸üÈÝÒ×׫д¡¢Àí½âÓëά»¤¡£
×é¼þϵͳ£º
×é¼þϵͳÊÇ Vue.js ÁíÒ»¸öÖØÒª¸ÅÄÒòΪËüÌṩÁËÒ»ÖÖ³éÏó£¬ÈÃÎÒÃÇ¿ÉÒÔÓöÀÁ¢¿É¸´ÓõÄС×é¼þÀ´¹¹½¨´óÐÍÓ¦Óá£Èç¹ûÎÒÃÇ¿¼Âǵ½Õâµã£¬¼¸ºõÈÎÒâÀàÐ͵ÄÓ¦ÓõĽçÃæ¶¼¿ÉÒÔ³éÏóΪһ¸ö×é¼þÊ÷£º
ʵ¼ÊÉÏ£¬Ò»¸öµäÐ͵ÄÓà Vue.js ¹¹½¨µÄ´óÐÍÓ¦Óý«ÐγÉÒ»¸ö×é¼þÊ÷¡£
Äã¿ÉÄÜÒѾעÒâµ½ Vue.js ×é¼þ·Ç³£ÀàËÆÓÚ×Ô¶¨ÒåÔªËØ¡ª¡ªËüÊÇ Web
×é¼þ¹æ·¶µÄÒ»²¿·Ö¡£Êµ¼ÊÉÏ Vue.js µÄ×é¼þÓï·¨²Î¿¼Á˸ù淶¡£ÀýÈç Vue ×é¼þʵÏÖÁË Slot
API Óë is ÌØÐÔ¡£µ«ÊÇ£¬Óм¸¸ö¹Ø¼üµÄ²»Í¬£º
Web ×é¼þ¹æ·¶ÈÔȻԶδÍê³É£¬²¢ÇÒûÓÐä¯ÀÀÆ÷ʵÏÖ¡£Ïà±È֮ϣ¬Vue.js
×é¼þ²»ÐèÒªÈκβ¹¶¡£¬²¢ÇÒÔÚËùÓÐÖ§³ÖµÄä¯ÀÀÆ÷£¨IE9 ¼°¸ü¸ß°æ±¾£©Ö®Ï±íÏÖÒ»Ö¡£±ØÒªÊ±£¬Vue.js
×é¼þÒ²¿ÉÒÔ·ÅÔÚÔÉú×Ô¶¨ÒåÔªËØÖ®ÄÚ¡£
Vue.js ×é¼þÌṩÁËÔÉú×Ô¶¨ÒåÔªËØËù²»¾ß±¸µÄÒ»Ð©ÖØÒª¹¦ÄÜ£¬±ÈÈç×é¼þ¼äµÄÊý¾ÝÁ÷£¬×Ô¶¨Òåʼþϵͳ£¬ÒÔ¼°¶¯Ì¬µÄ¡¢´øÌØÐ§µÄ×é¼þÌæ»»¡£
×é¼þϵͳÊÇÓà Vue.js ¹¹½¨´óÐÍÓ¦ÓõĻù´¡¡£ÁíÍ⣬Vue.js
Éú̬ϵͳҲÌṩÁ˸߼¶¹¤¾ßÓë¶àÖÖÖ§³Ö¿â£¬ËüÃÇºÍ Vue.js Ò»Æð¹¹³ÉÁËÒ»¸ö¸ü¼Ó¡°¿ò¼Ü¡±ÐÔµÄϵͳ¡£
ÕâÀï¼òµ¥½éÉÜÏÂvue×î³£ÓÃÒ²½ÏÖØÒªµÄÁ½¿é£ºÏìӦʽÔÀíºÍ×é¼þϵͳ¡£
ÏìӦʽÔÀí£º
Vue.jsµÄÊý¾Ý¹Û²âʵÏÖÔÀíºÍAngularÓÐ×ű¾ÖʵIJ»Í¬¡£Á˽âAngularµÄ¶ÁÕß¿ÉÄÜÖªµÀ£¬AngularµÄÊý¾Ý¹Û²â²ÉÓõÄÊÇÔà¼ì²é£¨dirty
checking£©»úÖÆ¡£Ã¿Ò»¸öÖ¸Áî¶¼»áÓÐÒ»¸ö¶ÔÓ¦µÄÓÃÀ´¹Û²âÊý¾ÝµÄ¶ÔÏ󣬽Ð×öwatcher£»Ò»¸ö×÷ÓÃÓòÖлáÓкܶà¸öwatcher¡£Ã¿µ±½çÃæÐèÒª¸üÐÂʱ£¬Angular»á±éÀúµ±Ç°×÷ÓÃÓòÀïµÄËùÓÐwatcher£¬¶ÔËüÃÇÒ»Ò»ÇóÖµ£¬È»ºóºÍ֮ǰ±£´æµÄ¾ÉÖµ½øÐбȽϡ£Èç¹ûÇóÖµµÄ½á¹û±ä»¯ÁË£¬¾Í´¥·¢¶ÔÓ¦µÄ¸üУ¬Õâ¸ö¹ý³Ì½Ð×ödigest
cycle¡£
Ôà¼ì²éÓÐÁ½¸öÎÊÌ⣺
1.ÈκÎÊý¾Ý±ä¶¯¶¼Òâζ×ŵ±Ç°×÷ÓÃÓòµÄÿһ¸öwatcherÐèÒª±»ÖØÐÂÇóÖµ£¬Òò´Ëµ±watcherµÄÊýÁ¿ÅÓ´óʱ£¬Ó¦ÓõÄÐÔÄܾͲ»¿É±ÜÃâµØÊܵ½Ó°Ï죬²¢ÇÒºÜÄÑÓÅ»¯¡£
2.µ±Êý¾Ý±ä¶¯Ê±£¬¿ò¼Ü²¢²»ÄÜÖ÷¶¯Õì²âµ½±ä»¯µÄ·¢Éú£¬ÐèÒªÊÖ¶¯´¥·¢digest
cycle²ÅÄÜ´¥·¢ÏàÓ¦µÄDOM ¸üС£Angularͨ¹ýÔÚDOMʼþ´¦Àíº¯ÊýÖÐ×Ô¶¯´¥·¢digest
cycle²¿·Ö¹æ±ÜÁËÕâ¸öÎÊÌ⣬µ«»¹ÊÇÓкܶàÇé¿öÐèÒªÓû§ÊÖ¶¯½øÐд¥·¢¡£
Vue.js²ÉÓõÄÔòÊÇ»ùÓÚÒÀÀµÊÕ¼¯µÄ¹Û²â»úÖÆ¡£´ÓÔÀíÉÏÀ´Ëµ£¬ºÍÀÏÅÆMVVM¿ò¼ÜKnockoutÊÇÒ»ÑùµÄ¡£ÒÀÀµÊÕ¼¯µÄ»ù±¾ÔÀíÊÇ£º
1.½«ÔÉúµÄÊý¾Ý¸ÄÔì³É ¡°¿É¹Û²ì¶ÔÏ󡱡£Ò»¸ö¿É¹Û²ì¶ÔÏó¿ÉÒÔ±»È¡Öµ£¬Ò²¿ÉÒÔ±»¸³Öµ¡£
2.ÔÚwatcherµÄÇóÖµ¹ý³ÌÖУ¬Ã¿Ò»¸ö±»È¡ÖµµÄ¿É¹Û²ì¶ÔÏ󶼻Ὣµ±Ç°µÄwatcher×¢²áΪ×Ô¼ºµÄÒ»¸ö¶©ÔÄÕߣ¬²¢³ÉΪµ±Ç°watcherµÄÒ»¸öÒÀÀµ¡£
3.µ±Ò»¸ö±»ÒÀÀµµÄ¿É¹Û²ì¶ÔÏ󱻸³ÖµÊ±£¬Ëü»á֪ͨËùÓж©ÔÄ×Ô¼ºµÄwatcherÖØÐÂÇóÖµ£¬²¢´¥·¢ÏàÓ¦µÄ¸üС£
4.ÒÀÀµÊÕ¼¯µÄÓŵãÔÚÓÚ¿ÉÒÔ¾«È·¡¢Ö÷¶¯µØ×·×ÙÊý¾ÝµÄ±ä»¯£¬²»´æÔÚÉÏÊöÌáµ½µÄÔà¼ì²éµÄÁ½¸öÎÊÌâ¡£µ«´«Í³µÄÒÀÀµÊÕ¼¯ÊµÏÖ£¬±ÈÈçKnockout£¬Í¨³£ÐèÒª°ü¹üÔÉúÊý¾ÝÀ´ÖÆÔì¿É¹Û²ì¶ÔÏó£¬ÔÚȡֵºÍ¸³ÖµÊ±ÐèÒª²ÉÓú¯Êýµ÷ÓõÄÐÎʽ£¬ÔÚ½øÐÐÊý¾Ý²Ù×÷ʱд·¨·±Ëö£¬²»¹»Ö±¹Û£»Í¬Ê±£¬¶Ô¸´ÔÓǶÌ׽ṹµÄ¶ÔÏóÖ§³ÖÒ²²»ÀíÏë¡£
Vue.jsÀûÓÃÁËES5µÄObject.defineProperty·½·¨£¬Ö±½Ó½«ÔÉúÊý¾Ý¶ÔÏóµÄÊôÐÔ¸ÄÔìΪgetterºÍsetter(ÕâÊÇES5µÄÌØÐÔ£¬ÐèÒªjs½âÊÍÒýÇæµÄÖ§³Ö£¬ÎÞ·¨Í¨¹ý¸÷ÖÖ´òshim²¹¶¡À´ÊµÏÖ£¬ÖÁÉÙÏÖÔÚµÄbabel
pollyfillºÍ¸÷ÖÖshimÊÇû·¨µÄ¡£ÕâÒ²ÊÇΪʲôVue²»Ö§³ÖIE8¼°ÒÔϰ汾µÄÔÒò£¬ÒòΪIE8µÄdefinePropertyÖ»Ö§³ÖDOM¶ÔÏ󣬴¿Object»á±¨´í¡£)£¬ÔÚÕâÁ½¸öº¯ÊýÄÚ²¿ÊµÏÖÒÀÀµµÄÊÕ¼¯ºÍ´¥·¢£¬¶øÇÒÍêÃÀÖ§³ÖǶÌ׵ĶÔÏó½á¹¹¡£¶ÔÓÚÊý×飬Ôòͨ¹ý°ü¹üÊý×éµÄ¿É±ä·½·¨£¨±ÈÈçpush£©À´¼àÌýÊý×éµÄ±ä»¯¡£ÕâʹµÃ²Ù×÷Vue.jsµÄÊý¾ÝºÍ²Ù×÷ÔÉú¶ÔÏ󼸺õûÓвî±ð[×¢:ÔÚÌí¼Ó/ɾ³ýÊôÐÔ£¬»òÊÇÐÞ¸ÄÊý×éÌØ¶¨Î»ÖÃÔªËØÊ±£¬ÐèÒªµ÷ÓÃÌØ¶¨µÄº¯Êý£¬Èçobj.$add(key,
value)²ÅÄÜ´¥·¢¸üС£ÕâÊÇÊÜES5µÄÓïÑÔÌØÐÔËùÏÞ¡£ÔÚ²Ù×÷¶ÔÏóÀàÐÍÊý¾ÝµÄʱºòÒ»¶¨Òª×¢ÒâÕâµã£¬·ñÔòÎÞ·¨ÊµÏÖÏìÓ¦¡£
±ä»¯¼ì²â£º
ÊÜ ES5 µÄÏÞÖÆ£¬Vue.js ²»Äܼì²âµ½¶ÔÏóÊôÐÔµÄÌí¼Ó»òɾ³ý¡£ÒòΪ
Vue.js ÔÚ³õʼ»¯ÊµÀýʱ½«ÊôÐÔתΪ getter/setter£¬ËùÒÔÊôÐÔ±ØÐëÔÚ data ¶ÔÏóÉϲÅÄÜÈÃ
Vue.js ת»»Ëü£¬²ÅÄÜÈÃËüÊÇÏìÓ¦µÄ¡£ÀýÈ磺
var
data = {a : 1}
var vm = new Vue({
data : data
})
//vm.a ºÍ data.a ÏÖÔÚÊÇÏìÓ¦µÄ
vm.b = 2
//vm.b ²»ÊÇÏìÓ¦µÄ
data.b = 2
//data.b ²»ÊÇÏìÓ¦µÄ |
²»¹ý£¬Óа취ÔÚʵÀý´´½¨Ö®ºóÌí¼ÓÊôÐÔ²¢ÇÒÈÃËüÊÇÏìÓ¦µÄ¡£
¶ÔÓÚ Vue ʵÀý£¬¿ÉÒÔʹÓà $set(key, value) ʵÀý·½·¨£º
vm.$set('b',
2)
//vm.b ºÍ data.b ÏÖÔÚÊÇÏìÓ¦µÄ |
¶ÔÓÚÆÕͨÊý¾Ý¶ÔÏ󣬿ÉÒÔʹÓÃÈ«¾Ö·½·¨ Vue.set(object,
key, value)£º
Vue.set(data,
'c', 3)
//vm.c ºÍ data.c ÏÖÔÚÊÇÏìÓ¦µÄ |
ÓÐʱÄãÏëÏòÒÑÓжÔÏóÉÏÌí¼ÓһЩÊôÐÔ£¬ÀýÈçʹÓà Object.assign()
»ò _.extend() Ìí¼ÓÊôÐÔ¡£µ«ÊÇ£¬Ìí¼Óµ½¶ÔÏóÉϵÄÐÂÊôÐÔ²»»á´¥·¢¸üС£Õâʱ¿ÉÒÔ´´½¨Ò»¸öеĶÔÏ󣬰üº¬Ô¶ÔÏóµÄÊôÐÔºÍеÄÊôÐÔ£º
//
²»Ê¹Óà Object.assign(this.someObject, {a : 1,b
: 2})
this.someObject = Object.assign({}, this.someObject,
{a : 1, b : 2}) |
¼ÆËãÊôÐԵİÂÃØ£º
ÄãÓ¦¸Ã×¢Òâµ½ Vue.js µÄ¼ÆËãÊôÐÔ²»ÊǼòµ¥µÄ getter¡£¼ÆËãÊôÐÔ³ÖÐø×·×ÙËüµÄÏìÓ¦ÒÀÀµ¡£ÔÚ¼ÆËãÒ»¸ö¼ÆËãÊôÐÔʱ£¬Vue.js
¸üÐÂËüµÄÒÀÀµÁÐ±í²¢»º´æ½á¹û£¬Ö»Óе±ÆäÖÐÒ»¸öÒÀÀµ·¢ÉúÁ˱仯£¬»º´æµÄ½á¹û²ÅÎÞЧ¡£Òò´Ë£¬Ö»ÒªÒÀÀµ²»·¢Éú±ä»¯£¬·ÃÎʼÆËãÊôÐÔ»áÖ±½Ó·µ»Ø»º´æµÄ½á¹û£¬¶ø²»Êǵ÷ÓÃ
getter¡£
ΪʲôҪ»º´æÄØ£¿¼ÙÉèÎÒÃÇÓÐÒ»¸ö¸ßºÄ¼ÆËãÊôÐÔ A£¬ËüÒª±éÀúÒ»¸ö¾ÞÐÍÊý×é²¢×ö´óÁ¿µÄ¼ÆË㡣Ȼºó£¬¿ÉÄÜÓÐÆäËüµÄ¼ÆËãÊôÐÔÒÀÀµ
A¡£Èç¹ûûÓлº´æ£¬ÎÒÃǽ«µ÷Óà A µÄ getter Ðí¶à´Î£¬³¬¹ý±ØÒª´ÎÊý¡£
ÓÉÓÚ¼ÆËãÊôÐÔ±»»º´æÁË£¬ÔÚ·ÃÎÊËüʱ getter ²»×ÜÊDZ»µ÷Ó᣿¼ÂÇÏÂÀý£º
var
vm = new Vue({
data : {
msg : 'hi'
},
computed : {
example : function (){
return Date.now() + this.msg
}
}
}) |
¼ÆËãÊôÐÔ example Ö»ÓÐÒ»¸öÒÀÀµ£º vm.msg ¡£ Date.now()
²»ÊÇ ÏìÓ¦ÒÀÀµ£¬ÒòΪËü¸ú Vue µÄÊý¾Ý¹Û²ìϵͳÎ޹ء£Òò¶ø£¬ÔÚ·ÃÎÊ vm.example ʱ½«·¢ÏÖʱ¼ä´Á²»±ä£¬³ý·Ç
vm.msg ±äÁË¡£
ÓÐʱϣÍû getter ²»¸Ä±äÔÓеÄÐÐΪ£¬Ã¿´Î·ÃÎÊ vm.example
ʱ¶¼µ÷Óà getter¡£Õâʱ¿ÉÒÔΪָ¶¨µÄ¼ÆËãÊôÐԹرջº´æ£º
computed
: {
example : {
cache : false,
get : function (){
return Date.now() + this.msg
}
}
} |
ÏÖÔÚÿ´Î·ÃÎÊ vm.example ʱ£¬Ê±¼ä´Á¶¼ÊÇеġ£µ«ÊÇ£¬Ö»ÊÇÔÚ
JavaScript ÖзÃÎÊÊÇÕâÑùµÄ£»Êý¾Ý°ó¶¨ÈÔÊÇÒÀÀµÇý¶¯µÄ¡£Èç¹ûÔÚÄ£¿éÖÐÕâÑù°ó¶¨¼ÆËãÊôÐÔ {{example}}
£¬Ö»ÓÐÏìÓ¦ÒÀÀµ·¢Éú±ä»¯Ê±²Å¸üÐÂDOM¡£
×é¼þϵͳ
×é¼þ£¨Component£©ÊÇ Vue.js ×îÇ¿´óµÄ¹¦ÄÜÖ®Ò»¡£×é¼þ¿ÉÒÔÀ©Õ¹
HTML ÔªËØ£¬·â×°¿ÉÖØÓõĴúÂë¡£Ôڽϸ߲ãÃæÉÏ£¬×é¼þÊÇ×Ô¶¨ÒåÔªËØ£¬Vue.js µÄ±àÒëÆ÷ΪËüÌí¼ÓÌØÊ⹦ÄÜ¡£ÔÚÓÐЩÇé¿öÏ£¬×é¼þÒ²¿ÉÒÔÊÇÔÉú
HTML ÔªËØµÄÐÎʽ£¬ÒÔ is ÌØÐÔÀ©Õ¹¡£
1.´´½¨ºÍ×¢²á×é¼þ£º
¿ÉÒÔÓà Vue.extend() ´´½¨Ò»¸ö×é¼þ¹¹ÔìÆ÷£º
var
MyComponent = Vue.extend({
template : '<div>A custom component!</div>'
}) |
Òª°ÑÕâ¸ö¹¹ÔìÆ÷ÓÃ×÷×é¼þ£¬ÐèÒªÓà Vue.component(tag,
constructor) ×¢²á(Õâ¸ö×¢²áÊÇÈ«¾ÖµÄ)£º
//È«¾Ö×¢²á×é¼þ£¬tag
Ϊ my-component
Vue.component('my-component', MyComponent) |
×é¼þÔÚ×¢²áÖ®ºó£¬±ã¿ÉÒÔÔÚ¸¸ÊµÀýµÄÄ£¿éÖÐÒÔ×Ô¶¨ÒåÔªËØ <my-component>
µÄÐÎʽʹÓá£ÒªÈ·±£ÔÚ³õʼ»¯¸ùʵÀý֮ǰע²áÁË×é¼þ£º
<div
id="example">
<my-component></my-component>
</div> |
×îºóäÖȾΪ£º
<div
id="example">
<div>A custom component!</div>
</div> |
µ±È»£¬¿ÉÒÔÈÃ×é¼þÖ»ÄÜÓÃÔÚÆäËü×é¼þÄÚ£¬ÓÃʵÀýÑ¡Ïî components
×¢²á£¬±ÈÈ磺
var
Child = Vue.extend({ /* ... */ })
var Parent = Vue.extend({
template : '...',
components : {
// <my-component> Ö»ÄÜÓÃÔÚ¸¸×é¼þÄ£°åÄÚ
'my-component': Child
}
}) |
ÕâÖÖ¾Ö²¿×¢²áµÄ·½Ê½Ò²ÊÊÓÃÓÚÆäËü×ÊÔ´£¬±ÈÈçÖ¸Áî¡¢¹ýÂËÆ÷ºÍ¹ý¶É¡£ËûÃǶ¼Ö§³ÖÈ«¾ÖºÍ¾Ö²¿×é¼þ×¢²á¡£
Ç°ÃæÌáµ½×é¼þÊÇ¿ÉÒÔ±»¸´Óõ쬶à¸öʵÀý¿ÉÄܻṲÏíÒ»¸ö×é¼þ¹¹ÔìÆ÷£¬ÄÇôÇë×¢ÒâÒ»¸ö×é¼þÑ¡ÏîµÄÎÊÌ⣺
´«Èë Vue ¹¹ÔìÆ÷µÄ¶àÊýÑ¡ÏîÒ²¿ÉÒÔÓÃÔÚ Vue.extend()
ÖУ¬²»¹ýÓÐÁ½¸öÌØÀý£º data ºÍ el¡£ÊÔÏëÈç¹ûÎÒÃǼòµ¥µØ°ÑÒ»¸ö¶ÔÏó×÷Ϊ data Ñ¡Ïî´«¸ø Vue.extend()
£º
var
data = {a : 1}
var MyComponent = Vue.extend({
data : data
}) |
Õâô×öµÄÎÊÌâÊÇ MyComponent ËùÓеÄʵÀý½«¹²Ïíͬһ¸ö data
¶ÔÏó£¡ÒòΪ¶ÔÏóÊÇÒýÓô«µÝµÄ£¬Õâ»ù±¾²»ÊÇÎÒÃÇÏëÒªµÄ£¬Òò´ËÎÒÃÇÓ¦µ±Ê¹ÓÃÒ»¸öº¯Êý×÷Ϊ data Ñ¡ÏÈÃÕâ¸öº¯Êý·µ»ØÒ»¸öжÔÏó£º
var
MyComponent = Vue.extend({
data : function (){
return {a : 1}
}
}) |
ͬÀí£¬el Ñ¡ÏîÓÃÔÚ Vue.extend() ÖÐʱҲÐëÊÇÒ»¸öº¯Êý¡£
2.ʹÓÃprops´«µÝÊý¾Ý
µ±Ò»¸ö×é¼þÄÚ²¿»¹ÓÐÒ»¸ö×Ó×é¼þµÄʱºò£¬ÓÉÓÚ×é¼þʵÀýµÄ×÷ÓÃÓòÊǹÂÁ¢µÄ£¬ÕâÒâζ×Ų»Äܲ¢ÇÒ²»Ó¦¸ÃÔÚ×Ó×é¼þµÄÄ£°åÄÚÖ±½ÓÒýÓø¸×é¼þµÄÊý¾Ý¡£Õâʱ£¬¸¸×é¼þ¿ÉÒÔʹÓÃprops°ÑÊý¾Ý´«¸ø×Ó×é¼þ£º
¡°prop¡± ÊÇ×é¼þÊý¾ÝµÄÒ»¸ö×ֶΣ¬ÆÚÍû´Ó¸¸×é¼þ´«ÏÂÀ´¡£×Ó×é¼þÐèÒªÏÔʽµØÓÃ
props Ñ¡Ïî ÉùÃ÷ props£º
Vue.component('child',
{
//camelCase in JavaScript
props : ['myMessage'],
template : '<span>{{ myMessage }}</span>'
}) |
È»ºóÏòËü´«ÈëÒ»¸öÆÕͨ×Ö·û´®£º
<child
my-message="hello!"></child> |
×Ó×é¼þµÄäÖȾ½á¹û£º
ÓÉÓÚÃüÃûµÄϰ¹ß£¬Çë×¢ÒâcamelCaseºÍkebab-case£ºHTML
ÌØÐÔ²»Çø·Ö´óСд¡£Ãû×ÖÐÎʽΪ camelCase µÄ prop ÓÃ×÷ÌØÐÔʱ£¬ÐèҪתΪ kebab-case(¶ÌºáÏ߸ô¿ª)¡£
¸ù¾ÝvueÏìÓ¦µÄÌØÐÔ£¬propsÒ²¿ÉÒÔÊǶ¯Ì¬µÄ£º
ÀàËÆÓÚÓà v-bind °ó¶¨ HTML ÌØÐÔµ½Ò»¸ö±í´ïʽ£¬Ò²¿ÉÒÔÓÃ
v-bind °ó¶¨¶¯Ì¬ Props µ½¸¸×é¼þµÄÊý¾Ý¡£Ã¿µ±¸¸×é¼þµÄÊý¾Ý±ä»¯Ê±£¬Ò²»á´«µ¼¸ø×Ó×é¼þ£º
<div>
<input v-model="parentMsg">
<br/>
<child v-bind:my-message="parentMsg"></child>
</div> |
Ò²¿ÉÒÔʹÓÃv-bindµÄËõдÓï·¨À´¼ò»¯°ó¶¨£º
<child
:my-message="parentMsg"></child> |
äÖȾ½á¹û£º
¸Ä±äÊäÈë¿òµÄÖµ£¬×Ó×é¼þµÄÎı¾»á¸úןıä
¹ØÓÚpropsµÄÆäËû½éÉÜ£¬Çë²Î¿¼ £ºprops
3.¸¸×Ó×é¼þµÄͨÐÅ
×Ó×é¼þ¿ÉÒÔÓà this.$parent ·ÃÎÊËüµÄ¸¸×é¼þ¡£¸ùʵÀýµÄºó´ú¿ÉÒÔÓÃ
this.$root ·ÃÎÊËü¡£¸¸×é¼þÓÐÒ»¸öÊý×é this.$children £¬°üº¬ËüËùÓеÄ×ÓÔªËØ¡£
¾¡¹Ü¿ÉÒÔ·ÃÎʸ¸Á´ÉÏÈÎÒâµÄʵÀý£¬²»¹ý×Ó×é¼þÓ¦µ±±ÜÃâÖ±½ÓÒÀÀµ¸¸×é¼þµÄÊý¾Ý£¬¾¡Á¿ÏÔʽµØÊ¹ÓÃ
props ´«µÝÊý¾Ý¡£ÁíÍ⣬ÔÚ×Ó×é¼þÖÐÐ޸ĸ¸×é¼þµÄ״̬ÊǷdz£Ôã¸âµÄ×ö·¨£¬ÒòΪ£º
ÕâÈø¸×é¼þÓë×Ó×é¼þ½ôÃܵØñîºÏ£»
Ö»¿´¸¸×é¼þ£¬ºÜÄÑÀí½â¸¸×é¼þµÄ״̬¡£ÒòΪËü¿ÉÄܱ»ÈÎÒâ×Ó×é¼þÐ޸ģ¡ÀíÏëÇé¿öÏ£¬Ö»ÓÐ×é¼þ×Ô¼ºÄÜÐÞ¸ÄËüµÄ״̬¡£
Vue ʵÀýʵÏÖÁËÒ»¸ö×Ô¶¨Òåʼþ½Ó¿Ú£¬ÓÃÓÚÔÚ×é¼þÊ÷ÖÐͨÐÅ¡£Õâ¸öʼþϵͳ¶ÀÁ¢ÓÚÔÉú
DOM ʼþ£¬Ó÷¨Ò²²»Í¬¡£
ÿ¸ö Vue ʵÀý¶¼ÊÇÒ»¸öʼþ´¥·¢Æ÷£º
ʹÓà $on() ¼àÌýʼþ£»
ʹÓà $emit() ÔÚËüÉÏÃæ´¥·¢Ê¼þ£»
ʹÓà $dispatch() ÅÉ·¢Ê¼þ£¬Ê¼þÑØ×Ÿ¸Á´Ã°ÅÝ£»
ʹÓà $broadcast() ¹ã²¥Ê¼þ£¬Ê¼þÏòÏ´«µ¼¸øËùÓеĺó´ú¡£
²»Í¬ÓÚ DOM ʼþ£¬Vue ʼþÔÚðÅݹý³ÌÖеÚÒ»´Î´¥·¢»Øµ÷Ö®ºó×Ô¶¯Í£Ö¹Ã°ÅÝ£¬³ý·Ç»Øµ÷Ã÷È··µ»Ø
true ¡£
Ò»¸ö¼òµ¥µÄÀý×Ó£º
<!--
×Ó×é¼þÄ£°å -->
<template id="child-template">
<input v-model="msg">
<button v-on:click="notify">Dispatch
Event</button>
</template>
<!-- ¸¸×é¼þÄ£°å -->
<div id="events-example">
<p>Messages: {{ messages | json }}</p>
<child></child>
</div> |

ÔÚ×Ó×é¼þµÄÊäÈë¿òÊäÈëÖµÒԺ󣬵ã»÷°´Å¥£¬¸¸×é¼þµÄMessages:[]Îı¾»á¶ÔÓ¦±ä»¯
4.ÔÙÀ´ËµËµ¶¯Ì¬×é¼þ
¶à¸ö×é¼þ¿ÉÒÔʹÓÃͬһ¸ö¹ÒÔØµã£¬È»ºó¶¯Ì¬µØÔÚËüÃÇÖ®¼äÇл»¡£Ê¹Óñ£ÁôµÄ
<component> ÔªËØ£¬¶¯Ì¬µØ°ó¶¨µ½ËüµÄ is ÌØÐÔ£º
new
Vue({
el : 'body',
data : {
currentView : 'home'
},
components : {
home : { /* ... */ },
posts : { /* ... */ },
archive : { /* ... */ }
}
}) |
<component
:is="currentView">
<!-- ×é¼þÔÚ vm.currentview ±ä»¯Ê±¸Ä±ä -->
</component> |
Èç¹û°ÑÇл»³öÈ¥µÄ×é¼þ±£ÁôÔÚÄÚ´æÖУ¬¿ÉÒÔ±£ÁôËüµÄ״̬»ò±ÜÃâÖØÐÂäÖȾ¡£Îª´Ë¿ÉÒÔÌí¼ÓÒ»¸ö
keep-alive Ö¸Áî²ÎÊý£º
<component
:is="currentView" keep-alive>
<!-- ·Ç»î¶¯×é¼þ½«±»»º´æ -->
</component> |
ÆäËû¶¯Ì¬×é¼þµÄÏêϸ½éÉÜ£¬Çë²Î¿¼£º¶¯Ì¬×é¼þ
ÔÚ´´½¨¸´ÔÓÓ¦ÓõÄʱºò£¬¶¯Ì¬×é¼þ»òÐí¾ÍÏԵò»ÄÇôÁé»îÁË£¬Õâʱ¿ÉÒÔʹÓ÷ÓÉ£¬vue-router·ÓÉÀ©Õ¹¿ÉÒÔ¿´×öÊǶ¯Ì¬×é¼þµÄÉý¼¶°æ£¬¿É²Î¿¼£ºvue-router
5.×îºó£¬×é¼þʵÀýµÄÉúÃüÖÜÆÚ£º
Vue ʵÀýÔÚ´´½¨Ê±ÓÐһϵÁгõʼ»¯²½Ö衪¡ªÀýÈ磬ËüÐèÒª½¨Á¢Êý¾Ý¹Û²ì£¬±àÒëÄ£°å£¬´´½¨±ØÒªµÄÊý¾Ý°ó¶¨¡£Ôڴ˹ý³ÌÖУ¬ËüÒ²½«µ÷ÓÃһЩÉúÃüÖÜÆÚ¹³×Ó£¬¸ø×Ô¶¨ÒåÂß¼ÌṩÔËÐлú»á¡£ÀýÈç
created ¹³×ÓÔÚʵÀý´´½¨ºóµ÷Óãº
var
vm = new Vue({
data : {
a : 1
},
created : function (){
// this Ö¸Ïò vm ʵÀý
console.log('a is: ' + this.a)
}
})
// => "a is: 1" |
Ò²ÓÐһЩÆäËüµÄ¹³×Ó£¬ÔÚʵÀýÉúÃüÖÜÆÚµÄ²»Í¬½×¶Îµ÷Óã¬Èç compiled¡¢
ready ¡¢destroyed¡£¹³× this Ö¸Ïòµ÷ÓÃËüµÄ Vue ʵÀý¡£Ò»Ð©Óû§¿ÉÄÜ»áÎÊ Vue.js
ÊÇ·ñÓС°¿ØÖÆÆ÷¡±µÄ¸ÅÄ´ð°¸ÊÇ£¬Ã»ÓС£×é¼þµÄ×Ô¶¨ÒåÂß¼¿ÉÒÔ·Ö¸îÔÚÕâЩ¹³×ÓÖС£
ÉùÃ÷ÖÜÆÚµÄͼʾ£º

×é¼þµÄ¼òµ¥½éÉܾ͵½ÕâÀï¡£
Vuex
ÔÚ´óÐÍÓ¦ÓÃÖУ¬×´Ì¬¹ÜÀí³£³£±äµÃ¸´ÔÓ£¬ÒòΪ״̬·ÖÉ¢ÔÚÐí¶à×é¼þÄÚ£¬ÔÚ²»Í¬µÄ×÷ÓÃÓòÄÚ¡£ÒÔvueÀ´Ëµ£¬µ±Ê¹ÓÃvue-routerÒÔ¼°×é¼þ»¯¿ª·¢(.vue)À´¹¹½¨´óÐ͵¥Ò³Ó¦ÓõÄʱºò£¬×é¼þÖ®¼ä״̬µÄÊý¾ÝµÄ´«µÝ»áºÜÀ§ÄÑ£¬ËäÈ»props¡¢dispatch¡¢broadcastµÈÄܹ»½øÐпç×é¼þµÄÊý¾Ý´«µÝ£¬µ«ÊÇ´óÁ¿Ê¹ÓÃËüÃÇ»áʹ×é¼þÖ®¼äµÄñîºÏ³Ì¶ÈºÜ¸ß£¬×é¼þÔ½¶à£¬²ã¼¶Ô½¶à£¬Î¬»¤ÆðÀ´¾ÍÔ½¸´ÔÓ¡£Ôõô°ìÄØ£¿ÄÜ·ñÔÚÈ«¾ÖÌṩһ¸ö״̬¹ÜÀí¹¹¼Ü£¿
ÕâÀïµÃÌá³öÒ»¸ö¸ÅÄFlux
FluxÊÇFacebookÓÃÀ´¹¹½¨Óû§¶ËµÄwebÓ¦ÓõÄÓ¦ÓóÌÐòÌåϵ¼Ü¹¹¡£Ëüͨ¹ýÀûÓÃÊý¾ÝµÄµ¥ÏòÁ÷¶¯ÎªReactµÄ¿É¸´ÓõÄÊÓͼ×é¼þÌṩÁ˲¹³ä¡£Ïà±ÈÓÚÐÎʽ»¯µÄ¿ò¼ÜËü¸üÏñÊÇÒ»¸ö¼Ü¹¹Ë¼Ï룬²»ÐèҪ̫¶àеĴúÂëÄã¾Í¿ÉÒÔÂíÉÏʹÓÃFlux¹¹½¨ÄãµÄÓ¦Óá£
FluxÓ¦ÓÃÖ÷Òª°üÀ¨Èý²¿·Ö£ºdispatcher¡¢storeºÍviews£¨React
components£©£¬Ç§Íò²»ÒªºÍMVC(model-View-Controller)¸ã»ì¡£ControllerÔÚFluxÓ¦ÓÃÖÐҲȷʵ´æÔÚ£¬µ«ÊÇÊÇÒÔcontroller-viewµÄÐÎʽ¡£viewͨ³£´¦ÓÚÓ¦ÓõĶ¥²ã£¬Ëü´ÓstoresÖлñÈ¡Êý¾Ý£¬Í¬Ê±½«ÕâЩÊý¾Ý´«µÝ¸øËüµÄºó´ú½Úµã¡£ÁíÍ⣬action
creators - dispatcher¸¨Öú·½·¨ - Ò»¸ö±»ÓÃÀ´ÌṩÃèÊöÓ¦ÓÃËùÓпÉÄÜ´æÔڵĸıäµÄÓïÒ廯µÄAPI¡£°ÑËüÀí½âΪFlux¸üбջ·µÄµÚËĸö×é³É²¿·Ö¿ÉÒÔ°ïÖúÄã¸üºÃµÄÀí½âËü¡£

Ò»¾ä»°£ºFlux¾ÍÊÇÊÖ¶¯½«Action´ÓÊý¾ÝÁ÷µ×²ãÊÓͼÖеÄʼþÊÖ¶¯°ó¶¨µ½Êý¾Ý¶¥²ãµÄÊý¾ÝÁ÷¼Ü¹¹¡£
µ¥ÏòÊý¾ÝÁ÷µÄÉè¼ÆÄ¿µÄ£ºÈκÎUI²»ÄÜÖ±½Ó¶ÔÊý¾ÝÓÐд²Ù×÷£¬¾ÍÊÇ·Àֹͬһ·ÝÊý¾ÝÓжà¸öµØ·½Í¬Ê±ÔÚд¡£Ïà¶ÔÓÚÖ±½Ó½øÐÐË«Ïò°ó¶¨£¬±àÂëÉÔ΢»á¸´ÔÓÒ»µã£¬µ«»»À´ÁËÅÅ´íºÍά»¤µÄ±ã½Ý¡£
Flux ¼Ü¹¹³£ÓÃÓÚ React Ó¦ÓÃÖУ¬µ«ËüµÄºËÐÄÀíÄîÒ²¿ÉÒÔÊÊÓÃÓÚ
Vue.js Ó¦ÓᣱÈÈç Vuex ¾ÍÊÇÒ»¸ö½è¼øÓÚ Flux£¬µ«ÊÇרÃÅΪ Vue.js ËùÉè¼ÆµÄ״̬¹ÜÀí·½°¸¡£React
Éú̬ȦÖÐ×îÁ÷ÐÐµÄ Flux ʵÏÖ Redux Ò²¿ÉÒÔͨ¹ý¼òµ¥µÄ°ó¶¨ºÍ Vue Ò»ÆðʹÓá£
ʲôÊÇVuex
Vuex ÊÇÒ»¸öרÃÅΪ Vue.js Ó¦ÓÃËùÉè¼ÆµÄ¼¯ÖÐʽ״̬¹ÜÀí¼Ü¹¹¡£Ëü½è¼øÁË
Flux ºÍ Redux µÄÉè¼ÆË¼Ï룬µ«¼ò»¯Á˸ÅÄ²¢ÇÒ²ÉÓÃÁËÒ»ÖÖΪÄܸüºÃ·¢»Ó Vue.js Êý¾ÝÏìÓ¦»úÖÆ¶ø×¨ÃÅÉè¼ÆµÄʵÏÖ¡£
ΪʲôÐèÒªËü£¿
µ±ÄãµÄÓ¦Óû¹ºÜ¼òµ¥µÄʱºò£¬Äã¶à°ë²¢²»ÐèÒª Vuex¡£Ò²²»½¨Òé¹ýÔçµØÊ¹ÓÃ
Vuex¡£µ«Èç¹ûÄãÕýÔÚ¹¹½¨Ò»¸öÖÐÐÍÒÔÉϹæÄ£µÄ SPA£¬ÄãºÜÓпÉÄÜÒѾÐèҪ˼¿¼Ó¦¸ÃÈçºÎ¸üºÃµØ¹éÄÉ Vue
Ö®Í⣬ӦÓÃµÄÆäËû×é³É²¿·Ö¡£Õâ¾ÍÊÇ Vuex Òª´óÏÔÉíÊÖµÄʱ¿Ì¡£
ÎÒÃÇÔÚµ¥¶ÀʹÓà Vue.js µÄʱºò£¬Í¨³£»á°Ñ״̬´¢´æÔÚ×é¼þµÄÄÚ²¿¡£Ò²¾ÍÊÇ˵£¬Ã¿Ò»¸ö×é¼þ¶¼ÓµÓе±Ç°Ó¦ÓÃ״̬µÄÒ»²¿·Ö£¬Õû¸öÓ¦ÓõÄ״̬ÊÇ·ÖÉ¢ÔÚ¸÷¸ö½ÇÂäµÄ¡£È»¶øÎÒÃǾ³£»áÐèÒª°Ñ״̬µÄÒ»²¿·Ö¹²Ïí¸ø¶à¸ö×é¼þ¡£Ò»¸ö³£¼ûµÄ½â¾ö²ßÂÔΪ£ºÊ¹Óö¨ÖƵÄʼþϵͳ£¬ÈÃÒ»¸ö×é¼þ°ÑһЩ״̬¡°·¢ËÍ¡±µ½ÆäËû×é¼þÖС£ÕâÖÖģʽµÄÎÊÌâÔÚÓÚ£¬´óÐÍ×é¼þÊ÷ÖеÄʼþÁ÷»áºÜ¿ì±äµÃ·Ç³£·±ÔÓ£¬²¢ÇÒµ÷ÊÔʱºÜÄÑÈ¥ÕÒ³ö¾¿¾¹ÄÄ´íÁË¡£
ΪÁ˸üºÃµÄ½â¾öÔÚ´óÐÍÓ¦ÓÃÖÐ״̬µÄ¹²ÓÃÎÊÌ⣬ÎÒÃÇÐèÒª¶Ô×é¼þµÄ ×é¼þ±¾µØ×´Ì¬(component
local state) ºÍ Ó¦Óò㼶״̬(application level state) ½øÐÐÇø·Ö¡£Ó¦Óü¶µÄ״̬²»ÊôÓÚÈκÎÌØ¶¨µÄ×é¼þ£¬µ«Ã¿Ò»¸ö×é¼þÈÔÈ»¿ÉÒÔ¼àÊÓ(Observe)Æä±ä»¯´Ó¶øÏìӦʽµØ¸üÐÂ
DOM¡£Í¨¹ý»ã×ÜÓ¦ÓõÄ״̬¹ÜÀíÓÚÒ»´¦£¬ÎÒÃǾͲ»±Øµ½´¦´«µÝʼþ¡£ÒòΪÈκÎÇ£³¶µ½Ò»¸öÒÔÉÏ×é¼þµÄÂß¼£¬¶¼Ó¦¸ÃдÔÚÕâÀï¡£´ËÍ⣬ÕâÑù×öÒ²ÄÜÈÃÎÒÃǸüÈÝÒ׵ؼǼ²¢¹Û²ì״̬µÄ±ä¸ü£¨Mutation£¬ÔÒâΪͻ±ä£©£¬ÉõÖÁ¿ÉÒÔʵÏÖ³ö»ªÀöÈçʱ¹âÂÃÐÐÒ»°ãµÄµ÷ÊÔЧ¹û¡££¨Òë×¢£ºÊÇʱºò°²ÀûÒ»²¨
vue-devtools ÁË£©
Vuex Ò²¶ÔÈçºÎ¹ÜÀí·ÖÈö¸÷µØµÄ״̬Ôö¼ÓÁËÒ»Ð©Ô¼Êø£¬µ«ÈÔ±£ÁôÓÐ×ã¹»Ãæ¶ÔÕæÊµÊ¹Óó¡¾°µÄÁé»îÐÔ¡£
Ò»¶¨ÐèÒªËüÂð£¿
VuexÓÐÕâô¶àºÃ´¦£¬µ«Õâ²¢²»´ú±íÎÒÃÇÒ»¶¨¾ÍÒªÔÚÏîÄ¿ÖÐʹÓÃËü¡£¼ÙÈçÎÒÃǵÄÏîÄ¿ÊÇÒ»¸ö¹ÜÀíÆ½Ì¨ÏµÍ³£¬Ò»°ãÎÞ·ÇÊÇÁбíÌø×ªÏêÇéÕâÖÖ´îÅ䣬²»Í¬ÁбíÒ³Ãæ¡¢²»Í¬ÏêÇéÒ³ÃæÖ®¼äûÓÐʲôÏ໥¹ØÁª»òÕßÐèÒª¹²ÏíµÄ״̬£¬Ò²²»»á³öÏÖijһ¸öÐèÒª»ñÈ¡µ½ËùÓÐÏêÇéÒ³ÃæµÄ״̬ÕâÖÖÐèÇó¡£ÕâʱºòÎÒÃÇÊDz»ÐèÒªVuexµÄ£¬Ê¹ÓÃËüÖ»»áÔö¼ÓÏîÄ¿µÄ¸´ÔÓ¶È¡£ÏÂÃæ½«½éÉܵ½µÄ»î¶¯·¢²¼ÏµÍ³£¬×îºó´´½¨µÄʱºòÐèÒª»ñÈ¡µ½ËùÓÐ×é¼þµÄÊý¾Ý£¬Õâ¸öʱºòʹÓÃVuexÏÔµÃÊ®·ÖÓбØÒª¡£Èç¹ûÄã¶¼²»ÖªµÀÊÇ·ñÐèÒªVuex£¬ÄǾͲ»ÓÃËü¡£
×î¼òµ¥µÄstore
´´½¨ Vuex store µÄ¹ý³ÌÏ൱ֱ½ØÁ˵± - Ö»ÒªÌṩһ¸ö³õʼ»¯µÄ
state ¶ÔÏó£¬ÒÔ¼°Ò»Ð© mutations£º
import
Vuex from 'vuex'
const state = {
count : 0
}
const mutations = {
INCREMENT (state){
state.count ++
}
}
export default new Vuex.Store({
state,
mutations
}) |
ÏÖÔÚ£¬Äã¿ÉÒÔͨ¹ý store.state À´¶ÁÈ¡ state ¶ÔÏ󣬻¹¿ÉÒÔͨ¹ý
dispatch ij mutation µÄÃû×ÖÀ´´¥·¢ÕâЩ״̬±ä¸ü£º
store.dispatch('INCREMENT')
console.log(store.state.count) // -> 1 |
Èç¹ûÄãÇãÏòÓÚ¶ÔÏó·ç¸ñµÄ·Ö·¢·½Ê½£¬Äã¿ÉÒÔÓÃÕâÖÖÓï·¨£º
//
Ч¹ûͬÉÏ
store.dispatch({
type : 'INCREMENT'
}) |
ÔÙ´ÎÇ¿µ÷£¬ÎÒÃÇͨ¹ý·Ö·¢ mutation µÄ·½Ê½£¬¶ø·ÇÖ±½Ó¸Ä±ä store.state
£¬ÊÇÒòΪÎÒÃÇÏëÒª¸üÃ÷È·µØ×·×Ùµ½×´Ì¬µÄ±ä»¯¡£Õâ¸ö¼òµ¥µÄÔ¼¶¨Äܹ»ÈÃÄãµÄÒâͼ¸ü¼ÓÃ÷ÏÔ£¬ÕâÑùÄãÔÚÔĶÁ´úÂëµÄʱºòÄܸüÈÝÒ׵ؽâ¶ÁÓ¦ÓÃÄÚ²¿µÄ״̬¸Ä±ä¡£´ËÍ⣬ÕâÑùÒ²ÈÃÎÒÃÇÓлú»áȥʵÏÖһЩÄܼǼÿ´Î״̬¸Ä±ä£¬±£´æ×´Ì¬¿ìÕյĵ÷ÊÔ¹¤¾ß¡£ÓÐÁËËü£¬ÎÒÃÇÉõÖÁ¿ÉÒÔʵÏÖÈçʱ¼ä´©Ëó°ãµÄµ÷ÊÔÌåÑé¡£
Vuex ʹÓà µ¥Ò»×´Ì¬Ê÷ ¡ª¡ª Êǵģ¬ÓÃÒ»¸ö¶ÔÏó¾Í°üº¬ÁËÈ«²¿µÄÓ¦Óò㼶״̬¡£ÖÁ´ËËü±ã×÷Ϊһ¸ö¡ºÎ¨Ò»Êý¾ÝÔ´(SSOT)¡»¶ø´æÔÚ¡£ÕâÒ²Òâζ×Å£¬Ã¿¸öÓ¦Óý«½ö½ö°üº¬Ò»¸ö
store ʵÀý¡£µ¥×´Ì¬Ê÷ÈÃÎÒÃÇÄܹ»Ö±½ÓµØ¶¨Î»ÈÎÒ»ÌØ¶¨µÄ״̬Ƭ¶Î£¬ÔÚµ÷ÊԵĹý³ÌÖÐÒ²ÄÜÇáÒ×µØÈ¡µÃÕû¸öµ±Ç°Ó¦ÓÃ״̬µÄ¿ìÕÕ¡£
ÒÔÉÏÖ»ÊÇÒ»¸öÓÃÀ´Õ¹Ê¾ store ¾¿¾¹ÊÇʲôµÄÒ»¸ö¼«¼òÀý×Ó¡£ÔÙ̸̸Èý¸çºËÐĸÅÄState£¨×´Ì¬£©£¬Mutations£¨±ä¸ü£©
ºÍ Actions£¨¶¯×÷£©¡£
StateºÍGetters
1.°²×° Vuex ²¢ÇÒ½«ÄúµÄ¸ù×é¼þÒýÈë store ʵÀý£º
import
Vue from 'vue'
import Vuex from 'vuex'
import store from './store'
import MyComponent from './MyComponent'
// ¹Ø¼üµã£¬½Ì Vue ×é¼þÈçºÎ´¦ÀíÓë Vuex Ïà¹ØµÄÑ¡Ïî
Vue.use(Vuex)
var app = new Vue({
el : '#app',
store, // °Ñ store ¶ÔÏóÌṩ¸ø ¡°store¡± Ñ¡ÏÕâ¿ÉÒÔ°Ñ store
µÄʵÀý×¢ÈëËùÓеÄ×Ó×é¼þ
components : {
MyComponent
}
}) |
ͨ¹ýÔÚ¸ùʵÀýÖÐ×¢²á store Ñ¡Ï¸Ã store ʵÀý»á×¢Èëµ½¸ù×é¼þϵÄËùÓÐ×Ó×é¼þÖУ¬ÇÒ×Ó×é¼þÄÜͨ¹ý
this.$store ·ÃÎʵ½¡£²»¹ýÊÂʵÉÏ£¬ÎÒÃǼ¸ºõ²»»áÐèÒªÖ±½ÓÒýÓÃËü¡£
2.ÔÚ×Ó×é¼þÖУ¬Í¨¹ýÔÚ vuex.getters Ñ¡ÏîÀﶨÒåµÄ getter
·½·¨À´¶Áȡ״̬£º
//
MyComponent.js
export default {
template : '...',
data (){ ... },
// ´Ë´¦ÎªÎÒÃÇ´Ó store ʵÀýÖÐÈ¡»Ø×´Ì¬µÄλÖÃ
vuex : {
getters : {
// ¸Ã getter º¯Êý½«»á°Ñ²Ö¿âµÄ `store.state.count` °ó¶¨Îª×é¼þµÄ
`this.count`
count : (state) => state.count
}
}
}
|
ÇëÁôÒâ vuex µÄÕâ¸öÌØÊâÑ¡ÏÒë×¢£ºgetters ×Ó¶ÔÏ󣩡£ËüÊÇÎÒÃÇÖ¸¶¨µ±Ç°×é¼þÄÜ´Ó
store Àï»ñÈ¡ÄÄЩ״̬ÐÅÏ¢µÄµØ·½¡£ËüµÄÿ¸öÊôÐÔÃû½«¶ÔÓ¦Ò»¸ö getter º¯Êý¡£¸Ãº¯Êý½ö½ÓÊÕ store
µÄÕû¸ö״̬Ê÷×÷ΪÆäΨһ²ÎÊý£¬Ö®ºó¼È¿ÉÒÔ·µ»Ø×´Ì¬Ê÷µÄÒ»²¿·Ö£¬Ò²¿ÉÒÔ·µ»Ø´Ó״̬Ê÷ÖÐÇóÈ¡µÄ¼ÆËãÖµ¡£¶ø·µ»Ø½á¹û£¬Ôò»áÒÀ¾ÝÕâ¸ö
getter µÄÊôÐÔÃûÌí¼Óµ½×é¼þÉÏ£¬Ó÷¨Óë×é¼þ×ÔÉíµÄ¼ÆËãÊôÐÔһëһÑù¡£
×é¼þ²»ÄÜÖ±½ÓÐÞ¸ÄstoreʵÀýµÄ״̬£º
ÇëʼÖռǵ÷dz£ÖØÒªµÄÕâµã£¬¾ÍÊÇ£º×é¼þÓÀÔ¶¶¼²»Ó¦¸ÃÖ±½Ó¸Ä±ä Vuex
store µÄ״̬¡£ÒòΪÎÒÃÇÏëÒªÈÃ״̬µÄÿ´Î¸Ä±ä¶¼ºÜÃ÷È·ÇÒ¿É×·×Ù£¬Vuex ״̬µÄËùÓиı䶼±ØÐëÔÚ
store µÄ mutation handler (±ä¸ü¾ä±ú) ÖйÜÀí¡£ÎªÁËÇ¿»¯¸Ã¹æÔò£¬ÔÚ¿ªÆô(Ñϸñģʽ(Strict
Mode))ʱ£¬ÈôÓÐ store µÄ״̬ÔÚ mutation ¾ä±úÍâ±»Ð޸ģ¬Vuex ¾Í»á±¨´í¡£ÏÖÔÚÓÐÁËÕâÒ»¹æÔò£¬ÎÒÃÇ
Vue ×é¼þµÄÖ°ÄܾÍÉÙÁ˺ࣺܶËûÃÇͨ¹ýÖ»¶ÁµÄ getter Óë Vuex store µÄ״̬Ïà°ó¶¨£¬×é¼þΨһÄÜÓ°ÏìÈ«¾Ö״̬µÄ·½·¨¾ÍÊÇÏë°ì·¨´¥·¢
mutations£¨ÎÒÃǽÓÏÂÀ´»á̸µ½£©¡£ÈôÓбØÒª£¬×é¼þÈÔÈ»Äܹ»´¦ÀíºÍ²Ù×÷±¾µØ×´Ì¬£¬µ«ÊÇÎÒÃDz»ÔÙÔÚµ¥¶ÀµÄ×é¼þÖзÅÖÃÈκÎÊý¾ÝÇëÇó»òÈ«¾Ö״̬±ä¸üµÄÂß¼¡£ÕâЩ²Ù×÷È«²¿¶¼¼¯ÖÐÓÚ
Vuex Ïà¹ØµÄÎļþÖУ¬ÕâÑùÄÜÈôóÐÍÓ¦ÓñäµÃ¸üÈÝÒ×Àí½âºÍά»¤¡£
Mutation
Mutations ±¾ÖÊÉÏÊÇÒ»¸öʼþϵͳ£ºÃ¿¸ö mutation ¶¼ÓÐÒ»¸ö
ʼþÃû (name) ºÍ Ò»¸ö »Øµ÷º¯Êý (handler). ÈκÎÒ»¸ö Mutation handler
µÄµÚÒ»¸ö²ÎÊýÓÀԶΪËùÊô store µÄÕû¸ö state ¶ÔÏó£º
import
Vuex from 'vuex'
const store = new Vuex.Store({
state : {
count : 1
},
mutations : {
INCREMENT (state){
// ¸Ä±ä state
state.count ++
}
}
}) |
ÓÃÈ«²¿´óдÃüÃû mutation ÊÇÒ»¸ö¹ßÀý£¬·½±ã½«ËüºÍ actions
Çø·Ö¿ª¡£
Äã²»ÄÜÖ±½Óµ÷Óà mutation handler. ÕâÀï´«Èë Store
¹¹Ô캯ÊýµÄÑ¡Ïî¸üÏñÊÇÔÚ×¢²áʼþ»Øµ÷£ºµ±INCREMENT ʼþ±»´¥·¢Ê±£¬µ÷ÓÃÕâ¸ö handler¡£´¥·¢
mutation handler µÄ·½·¨ÊÇ dispatch Ò»¸ö mutation µÄʼþÃû£º
store.dispatch('INCREMENT') |
Mutation±ØÐëÊÇͬ²½º¯Êý£º
ÒòΪµ± mutation ´¥·¢µÄʱºò£¬»Øµôº¯Êý»¹Ã»Óб»µ÷Óã¬ÎÒÃDz»ÖªµÀʲôʱºò»Øµ÷º¯Êýʵ¼ÊÉϱ»µ÷Óá£ÈκÎÔڻص÷º¯ÊýÖнøÐеĵÄ״̬µÄ¸Ä±ä¶¼ÊDz»¿É×·×ٵġ£
Mutation±ØÐë×ñÊØVueµÄÏìӦϵͳ¹æÔò£º
1.¾¡¿ÉÄÜÔÚ´´½¨ store ʱ¾Í³õʼ»¯ state ËùÐèÒªµÄËùÓÐÊôÐÔ¡£
2.µ±Ìí¼ÓÒ»¸öÔ±¾²»´æÔÚµÄÊôÐÔʱ£¬ÐèҪʹÓà Vue.set(obj,
'newProp', 123) »òÕß¿½±´²¢Ìæ»»Ô±¾µÄ¶ÔÏó¡£ÀûÓà stage 2 µÄÓïÑÔÌØÐÔ object
spread syntax£¬ÎÒÃÇ¿ÉÒÔʹÓÃÕâÑùµÄÓï·¨: state.obj = {...state.obj,
newProp : 123}
Actions
Actions ÊÇÓÃÓÚ·Ö·¢ mutations µÄº¯Êý¡£°´ÕÕ¹ßÀý£¬Vuex
actions µÄµÚÒ»¸ö²ÎÊýÊÇ store ʵÀý£¬¸½¼ÓÉÏ¿ÉÑ¡µÄ×Ô¶¨Òå²ÎÊý¡£
//
×î¼òµ¥µÄ action
function increment (store){
store.dispatch('INCREMENT')
}
// ´ø¸½¼Ó²ÎÊýµÄ action
// ʹÓà ES2015 ²ÎÊý½â¹¹
function incrementBy ({dispatch}, amount){
dispatch('INCREMENT', amount)
} |
Õ§Ò»ÑÛ¿´ÉÏÈ¥¸Ð¾õ¶à´ËÒ»¾Ù£¬ÎÒÃÇÖ±½Ó·Ö·¢ mutations Æñ²»¸ü·½±ã£¿Êµ¼ÊÉϲ¢·ÇÈç´Ë£¬»¹¼ÇµÃ
mutations ±ØÐëͬ²½Ö´ÐÐÕâ¸öÏÞÖÆÃ´£¿Actions ¾Í²»ÊÜÔ¼Êø£¡ÎÒÃÇ¿ÉÒÔÔÚ action ÄÚ²¿Ö´ÐÐÒì²½²Ù×÷£¬±ÈÈçÖ´ÐÐÒ»¸öajaxÇëÇóÊý¾ÝµÄ²Ù×÷£º
function
getData ({dispatch}){
ajax ({
url : "...",
data : {...},
success : (data) => {
dispatch("SET_DATA", data)
}
})
} |
ÎÒÃÇ¿ÉÒÔÕâÑùÔÚ×é¼þÖе÷ÓÃactions£º
//
ij×é¼þÄÚ²¿
// µ¼Èëactions
import {incrementBy} from './actions'
const vm = new Vue({
vuex : {
getters : { ... }, // state getters
actions : {
incrementBy
}
}
}) |
ÉÏÊö´úÂëËù×öµÄ¾ÍÊǰÑÔÉúµÄ incrementBy action
°ó¶¨µ½×é¼þµÄ store ʵÀýÖУ¬±©Â¶¸ø×é¼þÒ»¸ö vm.increamentBy ʵÀý·½·¨¡£ËùÓд«µÝ¸ø
vm.increamentBy µÄ²ÎÊý±äÁ¿¶¼»áÅÅÁÐÔÚ store ±äÁ¿ºóÃæÈ»ºóÒ»Æð´«µÝ¸øÔÉúµÄ action
º¯Êý£¬ËùÒÔµ÷Óà vm.incrementBy(1) µÈ¼ÛÓÚ incrementBy(vm.$store,
1) ¡£ËäÈ»¶àдÁËһЩ´úÂ룬µ«ÊÇ×é¼þµÄÄ£°åÖе÷Óà action ¸ü¼ÓÊ¡Á¦ÁË£º
<button
v-on:click="incrementBy(1)">increment
by one</button> |
ͨ³£ÔÚ´óÐÍ App ÖУ¬action Ó¦¸Ã°´²»Í¬Ä¿µÄ½øÐÐ ·Ö×é /
Ä£¿é»¯ µÄ¹ÜÀí£¬¾ßÌåÇë²Î¿¼£º Actions
ÏÂÃæÔÙ̸̸һ¸öÖØÒªµÄ¶«Î÷£¬Êý¾ÝÁ÷£º
ΪÁ˸üºÃµØÀí½â Vuex app ÖеÄÊý¾ÝÁ÷£¬ÎÒÃÇÀ´¿ª·¢Ò»¸ö¼òµ¥µÄ¼ÆÊýÆ÷
app¡£×¢Ò⣺Õâ¸öÀý×Ó½ö½öÊÇΪÁ˸üºÃµØ½âÊ͸ÅÄÔÚʵ¼ÊÇé¿öÖв¢²»ÐèÒªÔÚÕâÖÖ¼òµ¥µÄ³¡ºÏʹÓà Vuex.
//
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// Ó¦Óóõʼ״̬
const state = {
count : 0
}
// ¶¨ÒåËùÐèµÄ mutations
const mutations = {
INCREMENT (state){
state.count ++
},
DECREMENT (state){
state.count --
}
}
// ´´½¨ store ʵÀý
export default new Vuex.Store({
state,
mutations
}) |
//
actions.js
export const increment = ({ dispatch }) =>
dispatch('INCREMENT')
export const decrement = ({ dispatch }) =>
dispatch('DECREMENT') |
<!-
temmplate -->
<div>
Clicked: {{ count }} times
<button v-on:click="increment">+</button>
<button v-on:click="decrement">-</button>
</div> |
//
½öÐèÒªÔÚ¸ù×é¼þÖÐ×¢Èë store ʵÀýÒ»´Î¼´¿É
import store from './store'
import {increment, decrement} from './actions'
const app = new Vue({
el : '#app',
store,
vuex : {
getters: {
count: state => state.count
},
actions: {
increment,
decrement
}
}
}) |
Äã»á×¢Òâµ½×é¼þ±¾Éí·Ç³£¼òµ¥£ºËüËù×öµÄ½ö½öÊǰ󶨵½ state¡¢È»ºóÔÚÓû§ÊäÈëʱµ÷ÓÃ
actions¡£
ÄãÒ²»á·¢ÏÖÕû¸öÓ¦ÓõÄÊý¾ÝÁ÷Êǵ¥ÏòµÄ£¬ÕýÈç Flux ×î³õËù¶¨ÒåµÄÄÇÑù£º
1.Óû§ÔÚ×é¼þÖеÄÊäÈë²Ù×÷´¥·¢ action µ÷Óá£
2.Actions ͨ¹ý·Ö·¢ mutations À´ÐÞ¸Ä store
ʵÀýµÄ״̬¡£
3.Store ʵÀýµÄ״̬±ä»¯·´¹ýÀ´ÓÖͨ¹ý getters ±»×é¼þ»ñÖª¡£

×îºó£ºVuex ²¢²»Ç¿ÖÆÒªÇóËùÓеÄ״̬¶¼±ØÐë·ÅÔÚ Vuex store
ÖÐ £¬Èç¹ûÓÐЩ״̬Äã¾õµÃ²¢Ã»ÓÐÐèÒª¶ÔÆä±ä»¯½øÐÐ×·×Ù£¬ÄÇôÄãÍêÈ«¿ÉÒÔ°ÑËü·ÅÔÚ Vuex ÍâÃæ(±ÈÈç×÷Ϊ×é¼þµÄ±¾µØ×´Ì¬)¡£±ÈÈ繫¹²×é¼þ¶ÔÍâµÄ½Ó¿Ú£¬Í¨¹ýprops´«µÝÊý¾Ý¸üΪÓÐЧ¡£
VuexµÄÍêÕû½éÉÜÇë²Î¿¼£ºVuex
vue-devtools
vue-devtoolsÊÇchromeµÄÒ»¸övue¿ª·¢²å¼þ£¬¿ÉÒÔÔÚchromeÉ̵êÏÂÔØcrxÀ©Õ¹°ü½øÐа²×°¡£ÌṩComponentsºÍVuexÔ¤ÀÀ(state±ä»¯¸ú×ÙµÈ)¹¦ÄÜ£¬ÓÐÖúÓÚ¿ª·¢ºÍµ÷ÊÔ¡£


¿ÉÒÔ¿´µ½×é¼þµÄpropÊôÐÔ¡¢¼ÆËãÊôÐÔ¡¢vue getterÊôÐԵȣ¬ÒÔ¼°VuexÖеĴ¥·¢µÄmutation¡¢state
µ±Ç°µÄÖµµÈÎÒÃÇ¿ÉÄܹØ×¢µÄÄÚÈݶ¼Ö±¹ÛµØÕ¹Ê¾Á˳öÀ´¡£
VueÄ£¿é»¯
¶ÔÓÚ´óÐÍÏîÄ¿£¬ÎªÁ˸üºÃµØ¹ÜÀí´úÂëʹÓÃÄ£¿é¹¹½¨ÏµÍ³·Ç³£±ØÒª¡£ÍƼö´úÂëʹÓÃ
CommonJS »ò ES6 Ä£¿é£¬È»ºóʹÓà Webpack »ò Browserify ´ò°ü¡£
Webpack ºÍ Browserify ²»Ö»ÊÇÄ£¿é´ò°üÆ÷¡£Á½Õß¶¼ÌṩÁËÔ´Âëת»»
API£¬Í¨¹ýËü¿ÉÒÔÓÃÆäËüÔ¤´¦ÀíÆ÷ת»»Ô´Âë¡£ÀýÈ磬½èÖú babel-loader »ò babelify
´úÂë¿ÉÒÔʹÓà ES2015/2016 Óï·¨¡£
Äã¿ÉÒÔʹÓà Webpack + vue-loader »ò Browserify
+ vueify ¹¹½¨ÕâЩµ¥Îļþ Vue ×é¼þ¡£
Ñ¡ÔñÄÄÖÖ¹¹½¨¹¤¾ßÈ¡¾öÓÚÄãµÄ¾ÑéºÍÐèÇó¡£Webpack µÄ¹¦ÄܸüÇ¿´ó£¬Èç´úÂë·Ö¸î£¬½«¾²Ì¬×ÊÔ´µ±×÷Ä£¿é£¬ÌáÈ¡×é¼þµÄ
CSS µ½µ¥¶ÀµÄÒ»¸öÎļþµÈ£¬²»¹ýËüµÄÅäÖÃÏà¶Ô¸´ÔÓÒ»µã¡£Èç¹ûÄã²»ÐèÒª Webpack µÄÄÇЩ¹¦ÄÜ£¬Ê¹ÓÃ
Browserify ¸ü¼òµ¥£¬×î¿ìµÄ¹¹½¨·½Ê½ÊÇʹÓùٷ½³öÆ·µÄ½ÅÊּܹ¤¾ß vue-cli¡£²Î¿¼£ºvue-cli
»î¶¯Ä£°åÉè¼ÆÏµÍ³
Õâ¸öÉè¼ÆÏµÍ³Ö»ÊǶԻģ°åҪչʾµÄÄÚÈݽøÐÐÉè¼Æ£¬¾ßÌåµÄÑùʽºÍ½»»¥Óɻh5Ò³Ãæ¸ù¾ÝÊÓ¾õºÍ½»»¥Éè¼ÆÀ´¶¨¶á¡£»î¶¯ÀïÃæµÄÿһ¸ö×ÓÏî¶¼¿ÉÒÔ³éÏóΪһ¸ö×é¼þ£¬h5չʾ¶ËÄõ½Ã¿¸ö×é¼þµÄÄÚÈÝÔÙÌ×É϶ÔÓ¦×é¼þµÄÑùʽºÍ½»»¥Âß¼£¬×îÖÕ¾ÍÐγÉÁËÒ»¸öh5»î¶¯Ò³Ãæ¡£
ÿһ¸ö»î¶¯×é¼þ¶ÔÓ¦Èý¸öģʽ×é¼þ£º
1.±êÇ©×é¼þ£¬Í¨¹ýÍ϶¯À´´´½¨¶ÔÓ¦ÀàÐ͵Ä×é¼þ
2.Ô¤ÀÀ×é¼þ£¬Õ¹Ê¾µ±Ç°×é¼þ¸÷ÏîµÄÄÚÈÝ
3.±à¼×é¼þ£¬ÓÃÀ´±à¼µ±Ç°Ñ¡ÖеÄ×é¼þµÄ¸÷ÏîÄÚÈÝ
Íê³Éºó´ó¸ÅÊÇÕâÑùµÄ£¬ÒÔÒ»¸ö×î¼òµ¥µÄ½Ú±êÌâ×é¼þΪÀý£º

ÈçÉÏͼËùʾ£º×ó²àÈÝÆ÷ÅÅÁÐ×ÅÕâЩ³£ÓÃ×é¼þµÄ±êÇ©¡£½«»î¶¯ÐèÒªµÄ×é¼þ±êÇ©ÍÏÈëÔ¤ÀÀÇøÓòºó£¬»áÉú³É¶ÔÓ¦µÄÔ¤ÀÀ×é¼þºÍ±à¼×é¼þ£»µã»÷Õâ¸öÔ¤ÀÀ×é¼þ£¬×é¼þ±à¼ÇøÓò»áÏÔʾ¶ÔÓ¦µÄ±à¼×é¼þ£»ÔÚ±à¼×é¼þÖпÉÒÔ¶Ô×é¼þ¸÷Ïî½øÐб༡£±à¼Íê³Éºó£¬Í¨¹ýÊÂÏȵÄÊý¾Ý°ó¶¨£¬Ô¤ÀÀÇøÓò¶ÔÓ¦µÄ×é¼þ¾Í»á¸üÐÂÊÓͼ£¬ÏÔʾ×é¼þµ±Ç°µÄ×îÐÂÄÚÈÝ¡£
ÒÔÉϾÍÊÇÕâ¸öϵͳµÄÒ»¸ö´ó¸Å·½°¸£¬ÏÂÃæÌ¸Ì¸¾ßÌåµÄʵÏÖ¡£
Ê×ÏÈ£¬´Ó±êÇ©ÇøÓò¿ªÊ¼£º
±êÇ©×é¼þÊÇÿ¸ö»î¶¯×é¼þµÄ¿ª¶Ë£¬Ò²¾Í˵ÿһ¸ö±êÇ©×é¼þ±ØÐëÓÐÒ»¸öÊôÐÔÀ´±êʶËü´ú±íµÄÊÇÄÄÒ»¸ö»î¶¯×é¼þ¡£ÄǾÍÏȸøËüÃÇÖ¸¶¨ÀàÐÍ
type£º
¡¡¡¡½Ú±êÌâ type £º'sectionTitle'
¡¡¡¡Í¶Æ± type £º'vote'
¡¡¡¡ÕýÎÄ type £º'content'
¡¡¡¡Óû§ type £º'user'
¡¡¡¡Í¼Æ¬ type £º'image'
¡¡¡¡ÊÓÆµ type £º'video'
¡¡¡¡ÒôƵ type £º'audio'
¡¡¡¡Ìø×ªÁ´½Ó type £º'link'
È»ºóÿµ±ÎÒÃÇÍ϶¯Ò»¸ö±êÇ©×é¼þµ½Ô¤ÀÀÇøÓò£¬ÔÙ¸ù¾Ý¸Ã±êÇ©×é¼þµÄtypeÉú³É¶ÔÓ¦µÄÔ¤ÀÀºÍ±à¼×é¼þ¡£Ô¤ÀÀºÍ±à¼×é¼þÐèҪȷ¶¨µÄÎ޷ǾÍÊÇÓÐÄÄЩ±à¼ÏÕâЩ±à¼ÏîÊÇʲôÄÚÈÝ¡£ÒÔ½Ú±êÌâ×é¼þΪÀý£¬Ëü¾ÍÖ»ÓÐÒ»¸ö±à¼Ï½Ú±êÌâµÄÎı¾¡£Ò²¾ÍÊÇ˵½Ú±êÌâµÄÔ¤ÀÀ×é¼þÓÃÀ´ÏÔʾ½Ú±êÌâµÄÎı¾£¬±à¼×é¼þÐèÒªÓÐÒ»¸öÎı¾ÓòÀ´¶Ô½Ú±êÌâÎı¾½øÐб༣¬ÔÚÄ£°åÊÂÏȰ󶨺öÔÓ¦µÄÊý¾Ý£¬Îı¾ÓòµÄÊý¾Ý±ä»¯»á·´Ó¦µ½Ô¤ÀÀ×é¼þµÄDOMÉÏ¡£
ÎÒÃÇÐèÒªÓÐÒ»¸ö±£´æËùÓÐ×é¼þÊý¾Ý(¶ÔÏó)µÄÈÝÆ÷£¬¿ÉÒÔʹÓÃÒ»¸öÊý×é¡£
ÎÒ¸üϲ»¶²Ù×÷Ò»¸öÊý×é¶ø²»ÊǶÔÏóµÄÔÒò£ºvue¶ÔÊý×éµÄ»ù±¾·½·¨(push¡¢splice¡¢shiftµÈ)¶¼½øÐÐÁË·â×°£¬Í¨¹ýÕâЩ·½·¨À´¸Ä±äÊý×éµÄÊý¾Ý£¬½á¹û¶¼ÊÇÏìÓ¦µÄ¡£¶øÔÚ±£³ÖÏìÓ¦µÄÇé¿öÏ£¬¸Ä±ä¶ÔÏóµÄÊý¾ÝÒªÂ鷳Щ£¬ÌرðÊǸ´ÔÓµÄǶÌ×¶ÔÏó¡£Èç¹ûʹÓöÔÏó¿ÉÒÔͨ¹ýidÖ±½ÓÆ¥Åäµ½¶ÔÓ¦Êý¾Ý£¬Í¨¹ýÊý×éÐèÒª±éÀúһϡ£µ«ÊÇÓÐÁËes6µÄfor
of£¬´úÂ뻹ÊǺܼòµ¥£¬¶øÇÒÒ²²»ÊÇÔÚ²Ù×÷DOM£¬ÐÔÄÜÓ°Ïì²»´ó¡£
//widgetData.js
[
{id : "100",type : "vote",
...}, //ͶƱ
{id : "101",type : "image",
...}, //ͼƬ
{id : "102",type : "video",
...}, //ÊÓÆµ
] |
ÿ¸ö×é¼þÊý¾Ý¶ÔÏóµÄidÊôÐÔÊÇΨһµÄ£¬ÊÇÍÏÈë±êÇ©×é¼þʱÉú³ÉµÄ£¬Õâ¸öidÊôÐÔÊǹØÁªÔ¤ÀÀ×é¼þÓë¶ÔÓ¦±à¼×é¼þµÄ¹Ø¼ü£¬Í¨¹ýËü¿ÉÒÔÕÒµ½Ã¿¸öÔ¤ÀÀ×é¼þ¶ÔÓ¦µÄ±à¼×é¼þ¡£ÎªÊ²Ã´²»Í¨¹ýtypeÀ´ÅжÏÄØ£¿ÒòΪÿ¸ö»î¶¯¿ÉÄÜÓжà¸öÏàͬµÄ×é¼þ£¬±ÈÈç½Ú±êÌ⡣ͨ¹ýtypeû·¨È·¶¨¶ÔÓ¦¹ØÏµ¡£
ÕâÀïÎÒÃÇͨ¹ýVuex´´½¨Ò»¸östoreÀ´´æ´¢¼°ÐÞ¸ÄÕâ¸öÊý×é(¹Ù·½µãµÄ˵·¨¾ÍÊǹÜÀístate״̬)¡£°´ÕÕÉÏÃæÌáµ½µÄVuexµÄÊý¾ÝÁ÷¹æÔò£ºUI²»ÔÊÐíÖ±½ÓÐÞ¸ÄÊý¾Ý¡£ÔÚ±à¼ÏîÀïÃæ¸Ä±äijÏîÊäÈë¿òµÄÖµ£¬²¢²»ÊÇÖ±½Ó¸Ä±äÁ˶ÔÓ¦×é¼þÊý¾ÝÖÐÄÇÒ»ÏîµÄÖµ£¬¶øÊÇͨ¹ýDOMʼþ´¥·¢¶ÔÓ¦µÄaction£¬actionÔÙÅÉ·¢¶ÔÓ¦µÄmutaion´¦Àíº¯ÊýÀ´ÐÞ¸Ästate¡£ÕâÖÖ·½Ê½¿ÉÒÔÈ·±£ËùÓжÔijÏî×é¼þÊý¾ÝµÄÐ޸ͼÊÇͨ¹ý´¥·¢Ä³Ò»¸ö¹«¹²µÄactionÀ´Íê³ÉµÄ£¬Õâ¸öaction¾ÍÊǽøÐÐijÏîÐ޸ĵÄͳһºÍΨһµÄÈë¿Ú¡£
µ±ÎÒÃÇÖªµÀÐèÒªÉú³ÉʲôԤÀÀºÍ±à¼×é¼þµÄʱºò£¬²¢·Å½ø×é¼þÊý¾ÝÈÝÆ÷µÄʱºò£¬ÎÒÃǾͱØÐëÖªµÀÕâ¸ö×é¼þµ½µ×ÓÐÄÄЩ±à¼Ïî(³ýÁË×é¼þÀàÐÍÍ⣬ÎÒÃÇ·ÅÈëµÄÕâ¸ö×é¼þÊý¾Ý¶ÔÏó»¹ÐèÒªÄÄЩÊôÐÔ)£¬ÕâʱºòÎÒÃǾÍÐèÒªÒ»¸ömap£¬À´¹ÜÀí×é¼þtypeºÍ×é¼þ±à¼ÏîµÄ¹ØÏµ£¬ÒԻµÄͶƱ×é¼þΪÀý£º
¸ù¾ÝÐèÇó£¬Í¶Æ±×é¼þÐèÒªÓÐÒÔϱà¼Ï
1.ͶƱµÄ±êÌâ
2.ͶƱÏÿÏîÒªÓÐÒ»¸öÃû³Æ£¬ºóÐøÃ¿Ïî¿ÉÄÜ»¹»áÓÐÆäËûÊôÐÔ(ÀàËÆÕýÈ·Ñ¡ÏîµÄ±ê¼ÇµÈ)
//typeDataMap.js
export default {
vote : {
type : "vote",
title : "ͶƱ±êÌâÎı¾",
items : [
{name : "ͶƱÏî1"}, //ÿ¸öͶƱÏî
{name : "ͶƱÏî2"},
{name : "ͶƱÏî3"}
]
}
} |
Ö»ÒªÖªµÀÊÇʲôÀàÐÍ£¬Í¨¹ý typeData[type] ¾ÍÄÜ»ñÈ¡µ½×é¼þÊý¾Ý²¢´æÈë×é¼þÊý¾ÝÈÝÆ÷ÁË¡£ÓÉÓÚÎÒÃÇÔÚÔ¤ÀÀ×é¼þºÍ±à¼×é¼þµÄÄ£°åÊÓͼÒÑÊÂÏȶÔDOM½øÐÐÁËÊý¾Ý°ó¶¨£¬µ±ÎÒÃǸıä×é¼þÈÝÆ÷ÖÐij¸ö×é¼þµÄÊý¾ÝÏîʱ£¬¸üоͻᷴӦµ½DOMÉÏ¡£µ±ÎÒÃDZ£´æÕû¸öÄ£°åµÄʱºò£¬Ö»ÐèҪȡ³ö×é¼þÊý¾ÝÈÝÆ÷ÖеÄÖµ¾ÍÐÐÁË£¬ÆäʵҲ¾ÍÊÇÄǸöÊý×é±¾Éí¡£H5չʾ¶Ëͨ¹ýÕâ¸ö×é¼þÊý¾ÝÊý×飬¿ÉÒÔÄõ½×é¼þµÄÊý¾ÝÒÔ¼°ÅÅÐò£¬°´ÕÕ¶¨ºÃµÄÄ£°åäÖȾ³öÀ´¼´¿É¡£µ±È»£¬ÏñͶƱ×é¼þÕâÀàÓн»»¥Êý¾ÝµÄ×é¼þ£¬¸ÃϵͳÉè¼ÆµÄÄ£°åÖ»ÊÇÈ·¶¨ÁËҪչʾµÄ¹Ì¶¨µÄÄÚÈÝ¡£¾ßÌåµÄͶƱ×ÜÊý¡¢Ã¿ÏîͶƱÊýµÈÊôÐÔÐèÒªºó¶Ë´¦Àíºó²åÈëµ½¶ÔÓ¦×é¼þÊý¾ÝÀïÃæ£¬¹©Õ¹Ê¾¶ËÏÔʾ¡£
Õû¸öϵͳ´ó¸ÅµÄÉè¼ÆË¼Ïë¾ÍÊÇÕâÑùµÄ£¬ÏÂÃæÌôЩ¾ßÌåµÄÀ´½²½²£º
±êÇ©×é¼þ
ÒòΪ±êÇ©×é¼þµÄ±íÏֺͽ»»¥Âß¼µÈ¶¼ÊÇÒ»Öµģ¬ÕâÀï×öÁËÒ»¸ö¹«¹²¿É¸´ÓõıêÇ©×é¼þ£¬¶ÔÍâ½ÓÊÕÁ½¸ö²ÎÊý£ºtitle(±êÇ©Îı¾)ºÍtype(±êÇ©ÀàÐÍ)¡£ÔÚ±êÇ©ÈÝÆ÷×é¼þ´´½¨Ò»¸ö°üº¬ËùÓбêÇ©×é¼þÊý¾Ý¶ÔÏóµÄÊý×飬ÔÚÄ£°åÊÓͼÖбéÀúÕâ¸öÊý×飬¾Í´´½¨ÁËËùÓеıêÇ©×é¼þ¡£
¹«¹²±êÇ©×é¼þµÄͳһµÄÊôÐԺͷ½·¨µÈ´æÈëÁËÒ»¸ö¶ÔÏó×ÖÃæÁ¿ÀïÃæ£¬µ¼ÈëÒÔºóͨ¹ýmixin·½Ê½»ìºÏ£¬×é¼þ¾Í»áÓµÓÐÕâЩÊôÐԺͷ½·¨¡£Ä¿Ç°ÕâÑù×öµÄÒâÒå²»´ó£¬ÒòΪÒѾÓÐÒ»¸ö¹«¹²µÄ±êÇ©×é¼þÁË£¬mixinÀïÃæµÄ¶«Î÷ÍêÈ«¿ÉÒÔÖ±½Óдµ½Õâ¸ö¹«¹²×é¼þÄÚ¡£µ«Èç¹ûÿ¸öÀàÐ͵ıêÇ©×é¼þ¶¼ÊÇÒ»¸öµ¥¶ÀµÄ.vue×é¼þÎļþ£¬mixinµÄºÃ´¦¾ÍÌåÏÖ³öÀ´ÁË£º¿É¸´Óá¢Ò×ά»¤¡£
¾ßÌåʵÏֵĴúÂ룬ʡÂÔµôÑùʽ
//labelWrapper.vue
±êÇ©×é¼þÈÝÆ÷(×é¼þ±êÇ©ÇøÓò)
<template>
<div class="label-wrapper">
<div class="label-title">×é¼þ±êÇ©ÇøÓò</div>
<div class="label-box">
<common-label v-for="label in labelArr"
:title="label.title" :type="label.type"></common-label>
</div>
</div>
</template>
<script>
import commonLabel from './widget/commonLabel.vue'
//µ¼È빫¹²±êÇ©×é¼þ
export default {
name : "label_wrapper",
components : {
commonLabel //×¢²áΪ×Ó×é¼þ(es6ͬÃû¶ÔÏó×ÖÃæÁ¿Ëõд)
},
data (){
return {
labelArr : [
{title : "½Ú±êÌâ", type : "sectionTitle"},
{title : "ͶƱ", type : "vote"},
{title : "ÕýÎÄ", type : "content"},
{title : "Óû§", type : "user"},
{title : "ͼƬ", type : "image"},
{title : "ÊÓÆµ", type : "video"},
{title : "񙮵", type : "audio"},
{title : "Ìø×ªÁ´½Ó", type : "link"}
]
}
}
}
</script>
<style lang="stylus">
/*...*/
</style> |
//commonLabel.vue
¹«¹²±êÇ©×é¼þ
<template>
<div class="label-item-wrapper"
title="ÍÏÈëÄ£°åÉè¼ÆÇøÓò" draggable="true"
@dragstart="dragStart">
<img class="label-icon" alt="{{title}}"
:src="iconUrl">
<span class="label-text">{{title}}</span>
</div>
</template>
<script>
//µ¼Èëmixin
import labelMixin from './mixin/labelMixin'
export default {
name : "label",
props : {
title : String,
type : String
},
mixins : [labelMixin],
computed : {
iconUrl (){
return this.type + '.png'
}
}
}
</script>
<style lang="stylus">
/*...*/
</style> |
//labelMixin.js
import typeDataMap from './typeDataMap'
export default {
methods : {
dragStart (e){
var id = parseInt(Date.now() + ""
+ parseInt(Math.random() * 90))
var widgetData = typeDataMap[this.type]
¡¡¡¡¡¡¡¡¡¡¡¡¡¡var dt = e.dataTransfer
widgetData['id'] = id
dt.setData("id", id)
dt.setData("type", this.type)
dt.setData("widgetData", JSON.stringify(widgetData))
}
}
} |
Ô¤ÀÀ×é¼þ
Ô¤ÀÀ×é¼þÏà¶Ô½Ï¼òµ¥£¬³ýÁËÊý¾ÝµÄ°ó¶¨£¬¾ÍÊÇÍ϶¯ÅÅÐò¡£Í϶¯ÅÅÐòµÄʵÏÖÊÇͨ¹ýhtml5ÔÉúµÄdragʼþ£¬»ùÓÚvueÊý¾ÝÇý¶¯µÄÔÀí£¬Í϶¯µÄʱºò²¢²»ÐèҪȥÊÖ¶¯¸Ä±äÔ¤ÀÀÇøÓòÄÚ¸÷×é¼þµÄDOM˳Ðò£¬Ö»ÐèÒª¸Ä±ä×é¼þÊý¾ÝÊý×éÀïÃæ¸÷Êý¾Ý¶ÔÏóµÄindex¼´¿É£¬Êý¾ÝµÄ±ä»¯»á·´Ó¦µ½DOMÉÏ¡£¼òµ¥µÄ½Ú±êÌâÔ¤ÀÀ×é¼þ£º
<template>
<div class="preview-item-wrapper"
draggable="true" :class="{'active':
isActive}"
@click="showEdit"
@dragover="allowDrop"
@dragstart="dragStart"
@drop="dropIn"
>
<span class="preview-item-del"
:class="{'active': isActive}" title="ɾ³ý¸Ã×é¼þ">
<div v-on:click="delMe">x</div>
</span>
<label class="preview-item-label">-
½Ú±êÌâ -</label>
<div class="preview-item-input-wrapper">
<div class="title-text">{{text}}</div>
</div>
</div>
</template>
<script>
//µ¼Èëaction
import {addPreviewAndData, deleteWidgetPreview,
changeWidgetEdit, changPreviewAndDataIndex}
from '../../../store/actions'
//µ¼Èëmixin
import previewMixin from './mixin/previewMixin'
export default {
name : "sectionTitle_preview",
mixins : [previewMixin],
props : {
id : Number,
index : Number
},
computed : {
//mixinÍâµÄ˽ÓÐÊôÐÔ
text (){
for (let value of this.widgetDataArr)
if (value.id == this.id) return value.text
}
},
vuex : {
//°ó¶¨mixinÐèÒªµÄÊôÐԺͷ½·¨
getters : {
widgetDataArr : (state) => state.widgetDataArr,
currentEditWidgetId : (state) => state.currentEditWidgetId
},
actions : {
addPreviewAndData,
deleteWidgetPreview,
changeWidgetEdit,
changPreviewAndDataIndex
}
}
}
</script>
<style lang="stylus">
/*...*/
</style> |
/**
* previewMixin.js
* Ô¤ÀÀ×é¼þµÄmixin
* @ÌáȡͬÀà×é¼þÖ®¼ä¿É¸´ÓõļÆËãÊôÐÔÓë·½·¨
*/
export default {
computed : {
//¸ÃÔ¤ÀÀ×é¼þÊÇ·ñΪµ±Ç°µã»÷µÄ
isActive (){
return this.id == this.currentEditWidgetId
}
},
methods : {
//ɾ³ý¸ÃÔ¤ÀÀ×é¼þ
delMe (){
this.deleteWidgetPreview(this.id)
},
//ÏÔʾ¸ÃÔ¤ÀÀ×é¼þ¶ÔÓ¦µÄ±à¼×é¼þ
showEdit (){this.changeWidgetEdit(this.id)
},
//ÔÊÐíÏò¸ÃÔ¤ÀÀ×é¼þÍÏ·ÅÆäËû×é¼þ
allowDrop (e){
e.preventDefault();
},
//¿ªÊ¼ÍϷŸÃÔ¤ÀÀ×é¼þ
dragStart (e){
var dt = e.dataTransfer
dt.setData("index", this.index)
},
//Ïò¸ÃÔ¤ÀÀ×é¼þÍÏ·ÅÆäËû×é¼þ(Ô¤ÀÀ×é¼þ»òÕß±êÇ©×é¼þ)
dropIn (e){
e.preventDefault()
e.stopPropagation()
var dt = e.dataTransfer
var id = parseInt(dt.getData("id"))
if (id){ //ÓÐid±íÃ÷ÍÏÈëµÄÊDZêÇ©×é¼þ
var type = dt.getData("type")
var widgetData = JSON.parse(dt.getData("widgetData"))this.
changeWidgetEdit(id)
this.addValidation(id) //Ìí¼Ó×é¼þÑéÖ¤Ïî
} else {
var index = parseInt(dt.getData("index"))
this.changPreviewAndDataIndex(index, this.index)
}
//Çå¿ÕdataTransfer
dt.clearData()
}
}
} |
±à¼×é¼þ
»¹ÊÇÒÔ½Ú±êÌâ×é¼þΪÀý£º
<template>
<div class="edit-item-wrapper">
<label class="edit-item-label">½Ú±êÌâÎı¾</label>
<validator name="titleValidator">
<div class="edit-item-input-wrapper">
<textarea class="title-edit-input"
placeholder="±ØÌîÏ16×ÖÒÔÄÚ"
v-model="text"
v-validate:text="{
required: {rule: true,message: 'ÇëÌîд½Ú±êÌâÎı¾'},
maxlength: {rule: 16,message: '½Ú±êÌâÎı¾ÏÞÖÆÔÚ16×ÖÒÔÄÚ'}
}"
@input="inputValue"
@valid="onValid"
@invalid="onInvalid"
></textarea>
<div class="edit-input-err" v-if="$titleValidator.text.required">
{{$title
Validator.text.required}}</div>
<div class="edit-input-err" v-if="$titleValidator.text.maxlength">
{{$title
Validator.text.maxlength}}</div>
</div>
</validator>
</div>
</template>
<script>
//µ¼Èëaction
import {changeWidgetData, changeValidation}
from '../../../store/actions'
//µ¼Èëmixin
import editMixin from './mixin/editMixin'
export default {
name : "title_edit",
mixins : [editMixin],
props : {
id : Number
},
computed : {
//mixinÍâµÄ˽ÓÐÊôÐÔ
text (){
for (let value of this.widgetDataArr)
if (value.id == this.id) return value.text
}
},
methods : {
//mixinÍâµÄ˽Óз½·¨
inputValue (e){
this.changeWidgetData(this.id, 'text', e.target.value)
}
},
vuex : {
getters : {
widgetDataArr : (state) => state.widgetDataArr
},
actions : {
changeWidgetData,
changeValidation
}
}
}
</script>
<style lang="stylus">
/*...*/
</style> |
/**
* editMixin.js
* ±à¼×é¼þµÄmixin
*/
export default {
data (){
return {
//isValid : false
}
},
methods : {
onValid (){ //Ñé֤ͨ¹ý
this.isValid = true
this.changeValidation(this.id, true)
},
onInvalid (){ //Ñé֤ʧ°Ü
this.isValid = false
this.changeValidation(this.id, false)
}
}
} |
»¹ÓÐһЩ¹«¹²×é¼þÒÔ¼°storeµÈ¾Í²»ÔÙ½éÉÜÁË£¬Ç°ÃæµÄ½²½âÒÑ»ù±¾°üº¬£¬²î²»¶à¾Íµ½ÕâÀïÁË¡£×îºóÍê³ÉºóÊÇÕâÑùµÄ£º

»î¶¯µÄչʾ¶Ë
ÔÚ±à¼ÍêËùÓÐ×é¼þºó£¬±£´æ¸Ã»î¶¯IDºÍÒ»¸ö°üº¬ËùÓÐ×é¼þÊý¾Ý¶ÔÏóµÄÊý×éµ½server¶ËÊý¾Ý¿âÖС£ÎÒ˾µÄ»î¶¯ÊÇÓÃH5×öµÄ£¬H5Ò³Ãæ°´»î¶¯IDµ½server»ñÈ¡µ½¸Ã»î¶¯µÄ×é¼þÊý¾Ý£¬°´ÕÕÊý×éÖеÄ˳ÐòºÍÄÚÈÝÒÀ´ÎäÖȾ¼´¿ÉÉú³É¶ÔÓ¦µÄH5»î¶¯Ò³Ãæ¡£µ±È»H5¶ËÒ²ÐèÒªÓÐÒ»Ì××é¼þ»¯µÄʵÏÖ·½°¸£¬²¢Óë»î¶¯·¢²¼¶ËÓÐͳһµÄ×é¼þºÍÏàÓ¦ÊôÐÔµÄÃüÃû¹æ·¶µÈ¡£
Õâ¸ö»î¶¯Ä£°åÔÚijÖÖÒâÒåÉÏÊǶԻÄÚÈݽṹµÄ¸ß¶È³éÏó£¬Èç¹ûÔÙ¼ÓÉÏÿ¸ö×é¼þµÄÐÐΪ£¬¾ÍÏ൱ÓÚreactÖеÄÐéÄâDOMÒ»Ñù£¬ÓÉjavascriptά»¤µÄÒ»Ì׳éÏóµÄÄÚÈݽṹÊ÷¡£ÈκζËÄõ½ÁËÕâ¸ö½á¹¹Ê÷£¬¶¼¿ÉÒÔ°´ÕÕËüµÄÐèÇóäÖȾ³öËüÕâ¸ö¶ËҪչʾµÄ¶«Î÷¡£ÓÃreact¾ÙÀýÀ´ÃèÊö¾ÍÓ¦¸ÃÊÇÕâÑùµÄ£ºjsxµÄ½á¹¹ÔÚ±àÒëºó±»³éÏó³ÉÁËÐéÄâDOM£¬ÔÚweb¶ËÐéÄâDOM±»äÖȾ³ÉÁËhtml½á¹¹(react
js)£¬ÔÚÊÖ»únative¶Ë£¬ÐéÄâDOM±»äÖȾ³ÉÁËnativeµÄ×é¼þ½á¹¹(react native)¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÓÃÔÚlua¶Ë£¬wpf¶Ë(Èç¹û¿ÉÄܵϰ)£¬Ò²¿ÉÒÔÓ³Éä³ÉËüÃǵÄ×é¼þ½á¹¹¡£ÆäʵҲÓеãÀàËÆÓÚ·þÎñ¶ËµÄDAO²ã£¬¶¨ÒåÁËͳһÊý¾Ý·ÃÎʽӿڣ¬µ×²ãµÄÓÃʲôÊý¾Ý¿â¿ÉÒÔËæÒâÇл»¡£Õâµã±È¿ò¼Ü»òÕß˵¸ÃÏîÄ¿±¾ÉíÒâÒå¸üÖØ´ó¡£
|