±à¼ÍƼö: |
±¾ÎĽéÉÜÁË
Vue ÏìӦʽϵͳµÄµ×²ãµÄϸ½Ú£¬°üÀ¨ÈçºÎ×·×ٱ仯£¬±ä»¯µÄ×¢ÒâÊÂÏÉùÃ÷ÏìӦʽ property£¬Òì²½¸üжÓÁеÈÏà¹Ø¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
ÏÖÔÚÊÇʱºòÉîÈëÒ»ÏÂÁË£¡Vue ×î¶ÀÌØµÄÌØÐÔÖ®Ò»£¬ÊÇÆä·ÇÇÖÈëÐÔµÄÏìӦʽϵͳ¡£Êý¾ÝÄ£Ðͽö½öÊÇÆÕͨµÄ
JavaScript ¶ÔÏó¡£¶øµ±ÄãÐÞ¸ÄËüÃÇʱ£¬ÊÓͼ»á½øÐиüС£ÕâʹµÃ״̬¹ÜÀí·Ç³£¼òµ¥Ö±½Ó£¬²»¹ýÀí½âÆä¹¤×÷ÔÀíͬÑùÖØÒª£¬ÕâÑùÄã¿ÉÒԱܿªÒ»Ð©³£¼ûµÄÎÊÌâ¡£ÔÚÕâ¸öÕ½ڣ¬ÎÒÃǽ«Ñо¿Ò»ÏÂ
Vue ÏìӦʽϵͳµÄµ×²ãµÄϸ½Ú¡£
ÈçºÎ×·×ٱ仯
ÔÚ Vue Mastery ¹Û¿´ÊÓÆµ½²½â
µ±Äã°ÑÒ»¸öÆÕͨµÄ JavaScript ¶ÔÏó´«Èë Vue ʵÀý×÷Ϊ data Ñ¡ÏVue ½«±éÀú´Ë¶ÔÏóËùÓеÄ
property£¬²¢Ê¹Óà Object.defineProperty °ÑÕâЩ property È«²¿×ªÎª
getter/setter¡£Object.defineProperty ÊÇ ES5 ÖÐÒ»¸öÎÞ·¨ shim
µÄÌØÐÔ£¬ÕâÒ²¾ÍÊÇ Vue ²»Ö§³Ö IE8 ÒÔ¼°¸üµÍ°æ±¾ä¯ÀÀÆ÷µÄÔÒò¡£
ÕâЩ getter/setter ¶ÔÓû§À´ËµÊDz»¿É¼ûµÄ£¬µ«ÊÇÔÚÄÚ²¿ËüÃÇÈà Vue Äܹ»×·×ÙÒÀÀµ£¬ÔÚ
property ±»·ÃÎʺÍÐÞ¸Äʱ֪ͨ±ä¸ü¡£ÕâÀïÐèҪעÒâµÄÊDz»Í¬ä¯ÀÀÆ÷ÔÚ¿ØÖÆÌ¨´òÓ¡Êý¾Ý¶ÔÏóʱ¶Ô getter/setter
µÄ¸ñʽ»¯²¢²»Í¬£¬ËùÒÔ½¨Òé°²×° vue-devtools À´»ñÈ¡¶Ô¼ì²éÊý¾Ý¸ü¼ÓÓѺõÄÓû§½çÃæ¡£
ÿ¸ö×é¼þʵÀý¶¼¶ÔÓ¦Ò»¸ö watcher ʵÀý£¬Ëü»áÔÚ×é¼þäÖȾµÄ¹ý³ÌÖаѡ°½Ó´¥¡±¹ýµÄÊý¾Ý property
¼Ç¼ΪÒÀÀµ¡£Ö®ºóµ±ÒÀÀµÏîµÄ setter ´¥·¢Ê±£¬»á֪ͨ watcher£¬´Ó¶øÊ¹Ëü¹ØÁªµÄ×é¼þÖØÐÂäÖȾ¡£

¼ì²â±ä»¯µÄ×¢ÒâÊÂÏî
ÓÉÓÚ JavaScript µÄÏÞÖÆ£¬Vue ²»Äܼì²âÊý×éºÍ¶ÔÏóµÄ±ä»¯¡£¾¡¹ÜÈç´ËÎÒÃÇ»¹ÊÇÓÐһЩ°ì·¨À´»Ø±ÜÕâЩÏÞÖÆ²¢±£Ö¤ËüÃǵÄÏìÓ¦ÐÔ¡£
¶ÔÓÚ¶ÔÏó
Vue ÎÞ·¨¼ì²â property µÄÌí¼Ó»òÒÆ³ý¡£ÓÉÓÚ Vue »áÔÚ³õʼ»¯ÊµÀýʱ¶Ô
property Ö´ÐÐ getter/setter ת»¯£¬ËùÒÔ property ±ØÐëÔÚ data
¶ÔÏóÉÏ´æÔÚ²ÅÄÜÈà Vue ½«Ëüת»»ÎªÏìӦʽµÄ¡£ÀýÈ磺
ar vm = new Vue({
data:{
a:1
}
})
// `vm.a` ÊÇÏìӦʽµÄ
vm.b = 2
// `vm.b` ÊÇ·ÇÏìӦʽµÄ |
¶ÔÓÚÒѾ´´½¨µÄʵÀý£¬Vue ²»ÔÊÐí¶¯Ì¬Ìí¼Ó¸ù¼¶±ðµÄÏìӦʽ property¡£µ«ÊÇ£¬¿ÉÒÔʹÓÃ
Vue.set(object, propertyName, value) ·½·¨ÏòǶÌ×¶ÔÏóÌí¼ÓÏìӦʽ
property¡£ÀýÈ磬¶ÔÓÚ£º
Vue.set(vm.someObject,
'b', 2)
|
Äú»¹¿ÉÒÔʹÓà vm.$set ʵÀý·½·¨£¬ÕâÒ²ÊÇÈ«¾Ö Vue.set ·½·¨µÄ±ðÃû£º
this.$set(this.someObject,'b',2) |
ÓÐʱÄã¿ÉÄÜÐèҪΪÒÑÓжÔÏó¸³Öµ¶à¸öРproperty£¬±ÈÈçʹÓà Object.assign()
»ò _.extend()¡£µ«ÊÇ£¬ÕâÑùÌí¼Óµ½¶ÔÏóÉϵÄРproperty ²»»á´¥·¢¸üС£ÔÚÕâÖÖÇé¿öÏ£¬ÄãÓ¦¸ÃÓÃÔ¶ÔÏóÓëÒª»ìºÏ½øÈ¥µÄ¶ÔÏóµÄ
property Ò»Æð´´½¨Ò»¸öеĶÔÏó¡£
/ ´úÌæ `Object.assign(this.someObject,
{ a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject,
{ a: 1, b: 2 }) |
¶ÔÓÚÊý×é
Vue ²»Äܼì²âÒÔÏÂÊý×éµÄ±ä¶¯£º
µ±ÄãÀûÓÃË÷ÒýÖ±½ÓÉèÖÃÒ»¸öÊý×éÏîʱ£¬ÀýÈ磺vm.items[indexOfItem] = newValue
µ±ÄãÐÞ¸ÄÊý×éµÄ³¤¶Èʱ£¬ÀýÈ磺vm.items.length = newLength
¾Ù¸öÀý×Ó£º
var vm = new
Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] = 'x' // ²»ÊÇÏìÓ¦ÐÔµÄ
vm.items.length = 2 // ²»ÊÇÏìÓ¦Ð﵀ |
ΪÁ˽â¾öµÚÒ»ÀàÎÊÌ⣬ÒÔÏÂÁ½ÖÖ·½Ê½¶¼¿ÉÒÔʵÏÖºÍ vm.items[indexOfItem]
= newValue ÏàͬµÄЧ¹û£¬Í¬Ê±Ò²½«ÔÚÏìӦʽϵͳÄÚ´¥·¢×´Ì¬¸üУº
// Vue.set
Vue.set(vm.items, indexOfItem, newValue) |
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue) |
ÄãÒ²¿ÉÒÔʹÓà vm.$set ʵÀý·½·¨£¬¸Ã·½·¨ÊÇÈ«¾Ö·½·¨ Vue.set
µÄÒ»¸ö±ðÃû£º
vm.$set(vm.items,
indexOfItem, newValue) |
ΪÁ˽â¾öµÚ¶þÀàÎÊÌ⣬Äã¿ÉÒÔʹÓà splice£º
vm.items.splice(newLength) |
ÉùÃ÷ÏìӦʽ property
ÓÉÓÚ Vue ²»ÔÊÐí¶¯Ì¬Ìí¼Ó¸ù¼¶ÏìӦʽ property£¬ËùÒÔÄã±ØÐëÔÚ³õʼ»¯ÊµÀýǰÉùÃ÷ËùÓиù¼¶ÏìӦʽ
property£¬ÄÄÅÂÖ»ÊÇÒ»¸ö¿ÕÖµ£º
var vm = new
Vue({
data: {
// ÉùÃ÷ message Ϊһ¸ö¿ÕÖµ×Ö·û´®
message: ''
},
template: '<div>{{ message }}</div>'
})
// Ö®ºóÉèÖà `message`
vm.message = 'Hello!' |
Èç¹ûÄãδÔÚ data Ñ¡ÏîÖÐÉùÃ÷ message£¬Vue ½«¾¯¸æÄãäÖȾº¯ÊýÕýÔÚÊÔͼ·ÃÎʲ»´æÔÚµÄ property¡£
ÕâÑùµÄÏÞÖÆÔÚ±³ºóÊÇÓÐÆä¼¼ÊõÔÒòµÄ£¬ËüÏû³ýÁËÔÚÒÀÀµÏî¸ú×ÙϵͳÖеÄÒ»Àà±ß½çÇé¿ö£¬Ò²Ê¹ Vue ʵÀýÄܸüºÃµØÅäºÏÀàÐͼì²éϵͳ¹¤×÷¡£µ«Óë´ËͬʱÔÚ´úÂë¿Éά»¤ÐÔ·½ÃæÒ²ÓÐÒ»µãÖØÒªµÄ¿¼ÂÇ£ºdata
¶ÔÏó¾ÍÏñ×é¼þ״̬µÄ½á¹¹ (schema)¡£ÌáǰÉùÃ÷ËùÓеÄÏìӦʽ property£¬¿ÉÒÔÈÃ×é¼þ´úÂëÔÚδÀ´Ð޸Ļò¸øÆäËû¿ª·¢ÈËÔ±ÔĶÁʱ¸üÒ×ÓÚÀí½â¡£
Òì²½¸üжÓÁÐ
¿ÉÄÜÄ㻹ûÓÐ×¢Òâµ½£¬Vue ÔÚ¸üРDOM ʱÊÇÒì²½Ö´Ðеġ£Ö»ÒªÕìÌýµ½Êý¾Ý±ä»¯£¬Vue ½«¿ªÆôÒ»¸ö¶ÓÁУ¬²¢»º³åÔÚͬһʼþÑ»·Öз¢ÉúµÄËùÓÐÊý¾Ý±ä¸ü¡£Èç¹ûͬһ¸ö
watcher ±»¶à´Î´¥·¢£¬Ö»»á±»ÍÆÈëµ½¶ÓÁÐÖÐÒ»´Î¡£ÕâÖÖÔÚ»º³åʱȥ³ýÖØ¸´Êý¾Ý¶ÔÓÚ±ÜÃâ²»±ØÒªµÄ¼ÆËãºÍ
DOM ²Ù×÷ÊǷdz£ÖØÒªµÄ¡£È»ºó£¬ÔÚÏÂÒ»¸öµÄʼþÑ»·¡°tick¡±ÖУ¬Vue ˢжÓÁв¢Ö´ÐÐʵ¼Ê (ÒÑÈ¥ÖØµÄ)
¹¤×÷¡£Vue ÔÚÄÚ²¿¶ÔÒì²½¶ÓÁг¢ÊÔʹÓÃÔÉúµÄ Promise.then¡¢MutationObserver
ºÍ setImmediate£¬Èç¹ûÖ´Ðл·¾³²»Ö§³Ö£¬Ôò»á²ÉÓà setTimeout(fn, 0) ´úÌæ¡£
ÀýÈ磬µ±ÄãÉèÖà vm.someData = 'new value'£¬¸Ã×é¼þ²»»áÁ¢¼´ÖØÐÂäÖȾ¡£µ±Ë¢Ð¶ÓÁÐʱ£¬×é¼þ»áÔÚÏÂÒ»¸öʼþÑ»·¡°tick¡±ÖиüС£¶àÊýÇé¿öÎÒÃDz»ÐèÒª¹ØÐÄÕâ¸ö¹ý³Ì£¬µ«ÊÇÈç¹ûÄãÏë»ùÓÚ¸üкóµÄ
DOM ״̬À´×öµãʲô£¬Õâ¾Í¿ÉÄÜ»áÓÐЩ¼¬ÊÖ¡£ËäÈ» Vue.js ͨ³£¹ÄÀø¿ª·¢ÈËԱʹÓá°Êý¾ÝÇý¶¯¡±µÄ·½Ê½Ë¼¿¼£¬±ÜÃâÖ±½Ó½Ó´¥
DOM£¬µ«ÊÇÓÐʱÎÒÃDZØÐëÒªÕâô×ö¡£ÎªÁËÔÚÊý¾Ý±ä»¯Ö®ºóµÈ´ý Vue Íê³É¸üРDOM£¬¿ÉÒÔÔÚÊý¾Ý±ä»¯Ö®ºóÁ¢¼´Ê¹ÓÃ
Vue.nextTick(callback)¡£ÕâÑù»Øµ÷º¯Êý½«ÔÚ DOM ¸üÐÂÍê³Éºó±»µ÷Óá£ÀýÈ磺
<div id="example">{{message}}</div> |
var vm = new
Vue({
el: '#example',
data: {
message: '123'
}
})
vm.message = 'new message' // ¸ü¸ÄÊý¾Ý
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
vm.$el.textContent === 'new message' // true
}) |
ÔÚ×é¼þÄÚʹÓà vm.$nextTick() ʵÀý·½·¨Ìر𷽱㣬ÒòΪËü²»ÐèҪȫ¾Ö
Vue£¬²¢Çһص÷º¯ÊýÖÐµÄ this ½«×Ô¶¯°ó¶¨µ½µ±Ç°µÄ Vue ʵÀýÉÏ£º
Vue.component('example',
{
template: '<span>{{ message }}</span>',
data: function () {
return {
message: 'δ¸üÐÂ'
}
},
methods: {
updateMessage: function () {
this.message = 'ÒѸüÐÂ'
console.log(this.$el.textContent) // => 'δ¸üÐÂ'
this.$nextTick(function () {
console.log(this.$el.textContent) // => 'ÒѸüÐÂ'
})
}
}
}) |
ÒòΪ $nextTick() ·µ»ØÒ»¸ö Promise ¶ÔÏó£¬ËùÒÔÄã¿ÉÒÔʹÓÃеÄ
ES2017 async/await Óï·¨Íê³ÉÏàͬµÄÊÂÇ飺
methods: {
updateMessage: async function () {
this.message = 'ÒѸüÐÂ'
console.log(this.$el.textContent) // => 'δ¸üÐÂ'
await this.$nextTick()
console.log(this.$el.textContent) // => 'ÒѸüÐÂ'
}
} |
|