±à¼ÍƼö: |
±¾ÎÄÀ´×Ôcnblogs£¬±¾ÎÄÖ÷Òª½éÉÜvueµÄºËÐÄÀíÄîÒÔ¼°vueµÄË«Ïò°ó¶¨ÔÀí¼°ÊµÏÖ·½·¨µÈ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£ |
|
Ò» ¡¡Àí½âvueµÄºËÐÄÀíÄî
ʹÓÃvue»áÈÃÈ˸е½ÉíÐÄÓäÔÃ,Ëüͬʱ¾ß±¸angularºÍreactµÄÓŵã,ÇáÁ¿¼¶,api¼òµ¥,ÎĵµÆëÈ«,¼òµ¥Ç¿´ó,ÂéȸËäСÎåÔà¾ãÈ«.
ÌÈÈôÓÃÒ»¾ä»°À´¸ÅÀ¨vue,ÄÇôÎÒÊ×ÏÈÏëµ½µÄ±ãÊǹٷ½ÎĵµÖеÄÒ»¾ä»°:
Vue.js£¨¶ÁÒô /vju:/£¬ÀàËÆÓÚ view£© ÊÇÒ»Ì×¹¹½¨Óû§½çÃæµÄ½¥½øÊ½¿ò¼Ü¡£
Õâ¾ä»°¿ÉÄÜ´ó¼Ò²¢²»Ä°Éú,µ«ÊÇÕæÕýÀí½âÕâ¾ä»°µÄ¿ÉÄܲ¢²»¶à,Æäʵ,¶Á¶®ÁËÕâ¾ä»°,Ò²¾ÍÃ÷°×ÁËvueµÄºËÐÄÀíÄî.
ÄÇô,ÔõÑùÀí½âʲôÊǽ¥½øÊ½¿ò¼Ü?ÔÚÕâ֮ǰ,ÎÒÃÇÊ×ÏÈÒªÀí½âʲôÊÇ¿ò¼Ü.ÔÚ×î³õµÄǰ¶Ë¿ª·¢ÖÐ,ΪÁËÍê³Éij¸ö¹¦ÄÜ,ÎÒÃÇÐèҪͨ¹ýjsÔÚHTMLÒ³ÃæÖлñµÃdom½Úµã,Ëæºó»ñµÃdom½ÚµãÖеÄÎı¾ÄÚÈÝ»òÕßÔÚdom½ÚµãÉÏÌí¼Óʼþ,½øÐÐһϵÁеijÌÐò²Ù×÷,µ«ÊÇ,Èç¹ûÈÎÎñÁ¿ºÜ´óµÄÇé¿öÏÂ,´úÂë»áËæ×ÅÒµÎñµÄÔö¼Ó¶ø±äµÃÓ·Ö׺ͻìÂÒ,ÔÚÏÖʵµÄ¿ª·¢ÖÐ,¸ºÔðµÄÂß¼ºÍ¾Þ´óµÄ¿ª·¢Á¿,ÊÇÔÉújsÎÞ·¨Íê³ÉµÄ.
Õâ¸öʱºò,¿ª·¢ÈËÔ±½«js´úÂë·ÖΪÁËÈý¸ö°å¿é,Êý¾Ý(Model),Âß¼¿ØÖÆ(*),ÊÓͼ(View),Êý¾Ý°å¿éÖ»¸ºÔðÊý¾Ý²¿·Ö,ÊÓͼ°å¿é¸ºÔð¸ü¸ÄÑùʽ,Âß¼¿ØÖƸºÔðÁªÏµÊÓͼ°å¿éºÍÊý¾Ý°å¿é,ÕâÑù×ÓÓкܴóµÄºÃ´¦,µ±ÐèÇó·¢Éú±ä¶¯Ê±,Ö»ÐèÒªÐ޸ĶÔÓ¦µÄ°å¿é¾ÍºÃ

ÕâÖÖ¿ª·¢Ä£Ê½,¾ÍÊÇËùνµÄMV*½á¹¹,ÎÒÃÇÏÖÔÚÁ˽âµÄMVC,MVP,£Í£Ö£Ö£Í¶¼ÊÇMV*µÄÑÜÉúÎ¶Ô±ÈÕ⼸ÖÖ¿ò¼Üģʽ£¬ÎÒÃÇ»á×ܽá³öÀ´Ò»¸ö±¾ÖʵÄÌØµã£¬ÄǾÍÊÇÕâЩ¿ª·¢Ä£Ê½¶¼ÊÇÈÃÊÓͼºÍÊý¾Ý¼ä²»»á·¢ÉúÖ±½ÓÁªÏµ£®¶Ô±ÈÓÃÔÉúJS»ñµÃdomµÄ²Ù×÷£¬Äã»á·¢ÏÖÔÉúdomÁ÷ÆäʵÊǽ«dom×÷ΪÊý¾Ý£¬´ÓdomÖлñµÃ£Í£ï£ä£å£ì£¬ËæºóÓÖ¸ü¸ÄdomÀ´ÊµÏÖ¸üÐÂÊÓͼ£¬ÊÓͼºÍÄ£ÐÍÆäʵ»ìÔÚÒ»Æð£¬ËùÒÔ´úÂë×ÔÈ»»ìÂÒ£¬²»Ò×ά»¤£®
ÔÚ¾ßÓÐÏìӦʽϵͳµÄVueʵÀýÖУ¬DOM״ֻ̬ÊÇÊý¾Ý״̬µÄÒ»¸öÓ³Éä ¼´ UI=VM(State) £¬µ±µÈʽÓÒ±ßState¸Ä±äÁË£¬Ò³ÃæÕ¹Ê¾²¿·ÖUI¾Í»á·¢ÉúÏàÓ¦¸Ä±ä¡£ºÜ¶àÈ˳õ´ÎÉÏÊÖVueʱ£¬¾õµÃºÜºÃÓã¬ÔÒò¾ÍÊÇÕâ¸ö£®²»¹ý£¬VueµÄºËÐĶ¨Î»²¢²»ÊÇÒ»¸ö¿ò¼Ü£¬Éè¼ÆÉÏҲûÓÐÍêÈ«×ñÑMVVMģʽ£¬¿ÉÒÔ¿´µ½ÔÚͼÖÐÖ»ÓÐStateºÍViewÁ½²¿·Ö£¬
VueµÄºËÐŦÄÜÇ¿µ÷µÄÊÇ״̬µ½½çÃæµÄÓ³É䣬¶ÔÓÚ´úÂëµÄ½á¹¹×éÖ¯²¢²»ÖØÊÓ£¬ ËùÒÔµ¥´¿Ö»Ê¹ÓÃÆäºËÐŦÄÜʱ£¬Ëü²¢²»ÊÇÒ»¸ö¿ò¼Ü£¬¶ø¸üÏñÒ»¸öÊÓͼģ°åÒýÇæ£¬ÕâÒ²ÊÇΪʲôVue¿ª·¢Õß°ÑÆäÃüÃû³É¶ÁÒôÀàËÆÓÚviewµÄÔÒò¡£
ÉÏÎÄÌáµ½£¬VueµÄºËÐĵŦÄÜ£¬ÊÇÒ»¸öÊÓͼģ°åÒýÇæ£¬µ«Õâ²»ÊÇ˵Vue¾Í²»ÄܳÉΪһ¸ö¿ò¼Ü¡£ÈçÏÂͼËùʾ£¬ÕâÀï°üº¬ÁËVueµÄËùÓв¿¼þ£¬ÔÚÉùÃ÷ʽäÖȾ£¨ÊÓͼģ°åÒýÇæ£©µÄ»ù´¡ÉÏ£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÌí¼Ó×é¼þϵͳ¡¢¿Í»§¶Ë·ÓÉ¡¢´ó¹æÄ£×´Ì¬¹ÜÀíÀ´¹¹½¨Ò»¸öÍêÕûµÄ¿ò¼Ü¡£¸üÖØÒªµÄÊÇ£¬ÕâЩ¹¦ÄÜÏ໥¶ÀÁ¢£¬Äã¿ÉÒÔÔÚºËÐŦÄܵĻù´¡ÉÏÈÎÒâÑ¡ÓÃÆäËûµÄ²¿¼þ£¬²»Ò»¶¨ÒªÈ«²¿ÕûºÏÔÚÒ»Æð¡£¿ÉÒÔ¿´µ½£¬Ëù˵µÄ¡°½¥½øÊ½¡±£¬Æäʵ¾ÍÊÇVueµÄʹÓ÷½Ê½£¬Í¬Ê±Ò²ÌåÏÖÁËVueµÄÉè¼ÆµÄÀíÄ
¶þ¡¡Ì½ÌÖvueµÄË«Ïò°ó¶¨ÔÀí¼°ÊµÏÖ
¡¡¡¡³É¹ûͼ


ÏÂÃæ½éÉÜÁ½¸öÄÚÈÝ
¡¡¡¡£±£®vueË«Ïò°ó¶¨µÄÔÀí
¡¡¡¡£²£®ÊµÏÖ¼òÒ×°ævueµÄ¹ý³Ì£¬°üÀ¨ÉùÃ÷ʽÊý¾ÝäÖȾ¼°Ò»Ð©¼òµ¥µÄÖ¸Áî
vueË«Ïò°ó¶¨ÔÀí
vueµÄË«Ïò°ó¶¨ÊÇÓÉÊý¾Ý½Ù³Ö½áºÏ·¢²¼Õߣ¶©ÔÄÕßģʽʵÏֵģ¬ÄÇôʲôÊÇÊý¾Ý½Ù³Ö£¿vueÊÇÈçºÎ½øÐÐÊý¾Ý½Ù³ÖµÄ£¿Ëµ°×Á˾ÍÊÇͨ¹ýObject.defineProperty()À´½Ù³Ö¶ÔÏóÊôÐÔµÄsetterºÍgetter²Ù×÷£¬ÔÚÊý¾Ý±ä¶¯Ê±×öÄãÏëÒª×öµÄÊÂÇ飮ÎÒÃÇ¿ÉÒÔ¿´Ò»ÏÂͨ¹ý¿ØÖÆÌ¨Êá³ÝÒ»¸ö¶¨ÒåÔÚvue³õʼ»¯Êý¾ÝÉϵĶÔÏóÊÇʲô£®
var vm = new
Vue({
data: {
test : {
a: 1
}
},
created: function () {
console.log(this.test);
}
}); |
´òÓ¡½á¹û£º

ÔÚ´òÓ¡½á¹ûÖÐÎÒÃÇ¿ÉÒÔ¿´µ½ÊôÐÔaÓÐÁ½¸ö·½·¨£ºgetºÍset.Ϊʲô»áÓÐÕâÁ½¸ö·½·¨ÄØ£¬ÕâÕýÊÇvueͨ¹ýObject.defineProperty()½øÐÐÊý¾Ý½Ù³ÖµÄ£®
Object.defineProperty()Õâ¸ö·½·¨ÊÇ×öʲôµÄÄØ£¿ÎĵµÉÏÊÇÕâÑù˵µÄ

¼òµ¥µÄ˵£¬Ëû¿ÉÒÔ¿ØÖÆÒ»¸ö¶ÔÏóÊôÐÔµÄÒ»Ð©ÌØÓвÙ×÷£¬±ÈÈç¶ÁдȨ£¬ÊÇ·ñ¿Éö¾Ù£¬ÕâÀïÎÒÃÇÖ÷ÒªÑо¿ËüµÄgetºÍset·½·¨£¬Èç¹ûÏëÇå³þ¸ü¶àÓ÷¨£¬¿ÉÒԲο¼£ºhttps://developer.mozilla.org/zh-CN/docs/Web/ JavaScript/Reference/Global_Objects/Object /defineProperty
ÎÒÃÇ¿ÉÒÔºÜÇáËɵĴòÓ¡³öÒ»¸ö¶ÔÏóµÄÊôÐÔÊý¾Ý£º
var Book = {
name: 'ÈËÐÔµÄÈõµã'
};
console.log(Book.name); // ÈËÐÔµÄÈõµã |
µ«ÊÇÈç¹ûÔÚÖ´ÐÐconsole.log(Book.name)µÄͬʱ£¬¸øÊéµÄÊéÃûÔö¼ÓÒ»¸öÊéÃûºÅÄØ£¬Õâ¸öʱºòÓ¦¸ÃÔõô×ö£¬ÕâʱºòÎÒÃǾÍÐèÒªÓõ½Object.defineProperty(
)ÁË£º
//ÔÚconsole.log(book.name)ͬʱ,Ö±½Ó¸øÊé¼ÓÒ»¸öÊéºÅ
var Book = {};
var name = '';
Object.defineProperty(Book,'name',{
set:function(value) {
name = value;
console.log('ÄãÈ¡ÁËÒ»¸öÊéÃû½Ð:'+value);
},
get:function() {
console.log('get·½·¨±»¼àÌýµ½');
return '<'+name+'>';
}
});
Book.name = 'ÈËÐÔµÄÈõµã'; //ÄãÈ¡ÁËÒ»¸öÊéÃû½Ð:ÈËÐÔµÄÈõµã
console.log(Book.name);¡¡//<ÈËÐÔµÄÈõµã> |
ͨ¹ýObject.defineProperty( )Õâ¸ö·½·¨ÉèÖÃÁËBook¶ÔÏóµÄnameÊôÐÔ£¬¶ÔÆägetºÍset·½·¨½øÐÐÖØÐ´²Ù×÷£¬get·½·¨ÔÚ»ñµÃnameÊôÐÔʱ±»µ÷Óã¬set·½·¨ÔÚÉèÖÃnameÊôÐÔʱ±»´¥·¢£®ËùÒÔÔÚÖ´ÐÐBook.name='ÈËÐÔµÄÈõµã'¡¡Õâ¸öÓï¾äʱµ÷ÓÃset·½·¨£¬Êä³öÄãÈ¡ÁËÒ»¸öÊéÃû½Ð£ºÈËÐÔµÄÈõµã£®µ±µ÷ÓÃconsole.log(Book.name)ʱ´¥·¢get·½·¨£¬Êä³ö£¼ÈËÐÔµÄÈõµã£¾£¬Èç¹ûÔÚ´úÂëÖмÓÈëÕâ¾ä»°Ê±£¬»á´òÓ¡³öÊ²Ã´ÄØ£¿
½á¹ûÈçÏ£º

ÓëÉÏÃævue´òÓ¡Êý¾Ý½øÐжԱȷdz£ÀàËÆ£¬ËµÃ÷vueȷʵÊÇͨ¹ýÕâÖÖ·½Ê½½øÐÐÊý¾Ý½Ù³ÖµÄ£®ÄÇôʲôÊÇ·¢²¼Õߣ¶©ÔÄÕßÄ£Ê½ÄØ£¿£¿
¶©ÔÄÕߺͷ¢²¼Õßģʽ£¬Í¨³£ÓÃÓÚÏûÏ¢¶ÓÁÐÖУ®Ò»°ãÓÐÁ½ÖÖÐÎʽÀ´ÊµÏÖÏûÏ¢¶ÓÁУ¬Ò»ÊÇʹÓÃÉú²úÕߺÍÏû·ÑÕßÀ´ÊµÏÖ£¬¶þÊÇʹÓö©ÔÄÕߣ·¢²¼ÕßģʽÀ´ÊµÏÖ£¬ÆäÖж©ÔÄÕߺͷ¢²¼ÕßʵÏÖÏûÏ¢¶ÓÁеķ½Ê½£¬¾Í»áÓö©ÔÄÕßģʽ£®
´ò¸ö±È·½£¬ËùνµÄ¶©ÔÄÕߣ¬¾ÍÏñÎÒÃÇÔÚÈÕ³£Éú»îÖж©Ôı¨Ö½Ò»Ñù£¬ÔÚ¶©Ôı¨Ö½µÄʱºò£¬Í¨³£¶¼µÃÐèÒªÔÚ±¨Éç»òÕßһЩÖнé»ú¹¹½øÐÐ×¢²á£¬µ±ÓÐаæµÄ±¨Ö½·¢¿¯µÄʱºò£¬ÓʵÝÔ±¾ÍÐèÒªÏò¶©Ôĸñ¨Ö½µÄÈË£¬ÒÀ´Î·¢·Å±¨Ö½£®
ËùνµÄ¶©ÔÄÕߣ¬¾ÍÏñÎÒÃÇÔÚÈÕ³£Éú»îÖУ¬¶©Ôı¨Ö½Ò»Ñù¡£ÎÒÃǶ©Ôı¨Ö½µÄʱºò£¬Í¨³£¶¼µÃÐèÒªÔÚ±¨Éç»òÕßһЩÖнé»ú¹¹½øÐÐ×¢²á¡£µ±ÓÐаæµÄ±¨Ö½·¢¿¯µÄʱºò£¬ÓʵÝÔ±¾ÍÐèÒªÏò¶©Ôĸñ¨Ö½µÄÈË£¬ÒÀ´Î·¢·Å±¨Ö½¡£
ËùÓÐÈç¹ûÓôúÂëʵÏÖ¸Ãģʽ£¬ÐèÒª½øÐÐÁ½¸ö²½Ö裺
1¡¢³õʼ»¯·¢²¼Õß¡¢¶©ÔÄÕß¡£
2¡¢¶©ÔÄÕßÐèҪע²áµ½·¢²¼Õߣ¬·¢²¼Õß·¢²¼ÏûϢʱ£¬ÒÀ´ÎÏò¶©ÔÄÕß·¢²¼ÏûÏ¢¡£
¶©ÔÄÕß×¢²á

·¢²¼Õß·¢²¼ÏûÏ¢

ÄÇô½ÓÏÂÀ´ÎÒÃǽ«Í¨¹ývueÔÀíʵÏÖÒ»¸ö¼òµ¥µÄmvvmË«Ïò°ó¶¨µÄdemo
˼··ÖÎö
ÒªÏëʵÏÖmvvm£¬Ö÷Òª°üº¬Á½¸ö·½Ã棬ÊÓͼ±ä»¯¸üÐÂÊý¾Ý£¬Êý¾Ý±ä»¯¸üÐÂÊÓͼ£®
view±ä»¯¸üÐÂdataÆäʵ¿ÉÒÔͨ¹ýʼþ¼àÌýʵÏÖ£¬±ÈÈçinput±êÇ©¼àÌýinputʼþ£¬ËùÓÐÎÒÃÇ×ÅÖØ·ÖÎödata±ä»¯¸üÐÂview.
data±ä»¯¸üÐÂviewµÄÖØµãÊÇÈçºÎÖªµÀviewʲôʱºò±ä»¯ÁË£¬Ö»ÒªÖªµÀʲôʱºòview±ä»¯ÁË£¬ÄÇô½ÓÏÂÀ´µÄ¾ÍºÃ´¦ÀíÁË£®Õâ¸öʱºòÎÒÃÇÉÏÎÄÌáµ½µÄObject.defineProperty(
)¾ÍÆð×÷ÓÃÁË£®Í¨¹ýObject.defineProperty( )¶ÔÊôÐÔÉèÖÃÒ»¸ösetº¯Êý£¬µ±ÊôÐԱ仯ʱ¾Í»á´¥·¢Õâ¸öº¯Êý£¬ËùÒÔÎÒÃÇÖ»ÐèÒª½«Ò»Ð©¸üÐµķ½·¨·ÅÔÚsetº¯ÊýÖоͿÉÒÔʵÏÖdata±ä»¯¸üÐÂviewÁË£®

ʵÏÖ¹ý³Ì
ÎÒÃÇÒѾ֪µÀÈçºÎʵÏÖÊý¾ÝµÄË«Ïò°ó¶¨ÁË£¬¡¡ÄÇôÊ×ÏÈÒª¶ÔÊý¾Ý½øÐнٳּàÌý£¬ËùÒÔÎÒÃÇÊ×ÏÈÒªÉèÖÃÒ»¸ö¼àÌýÆ÷Observer,ÓÃÀ´¼àÌýËùÓеÄÊôÐÔ£¬µ±ÊôÐԱ仯ʱ£¬¾ÍÐèҪ֪ͨ¶©ÔÄÕßWatcher,¿´ÊÇ·ñÐèÒª¸üУ®ÒòΪÊôÐÔ¿ÉÄÜÊǶà¸ö£¬ËùÒÔ»áÓжà¸ö¶©ÔÄÕߣ¬¹ÊÎÒÃÇÐèÒªÒ»¸öÏûÏ¢¶©ÔÄÆ÷DepÀ´×¨ÃÅÊÕ¼¯ÕâЩ¶©ÔÄÕߣ¬²¢ÔÚ¼àÌýÆ÷ObserverºÍ¶©ÔÄÕßWatcherÖ®¼ä½øÐÐͳһµÄ¹ÜÀí£®ÒÔΪÔÚ½ÚµãÔªËØÉÏ¿ÉÄÜ´æÔÚһЩָÁËùÒÔÎÒÃÇ»¹ÐèÒªÓÐÒ»¸öÖ¸Áî½âÎöÆ÷Compile£¬¶Ôÿ¸ö½ÚµãÔªËØ½øÐÐɨÃèºÍ½âÎö£¬½«Ïà¹ØÖ¸Áî³õʼ»¯³ÉÒ»¸ö¶©ÔÄÕßWatcher£¬²¢Ì滻ģ°åÊý¾Ý²¢°ó¶¨ÏàÓ¦µÄº¯Êý£¬Õâʱºòµ±¶©ÔÄÕßWatcher½ÓÊܵ½ÏàÓ¦ÊôÐԵı仯£¬¾Í»áÖ´ÐÐÏà¶ÔÓ¦µÄ¸üк¯Êý£¬´Ó¶ø¸üÐÂÊÓͼ£®
ÕûÀíÉÏÃæµÄ˼·£¬ÎÒÃÇÐèҪʵÏÖÈý¸ö²½Ö裬À´Íê³ÉË«Ïò°ó¶¨£º
1.ʵÏÖÒ»¸ö¼àÌýÆ÷Observer£¬ÓÃÀ´½Ù³Ö²¢¼àÌýËùÓÐÊôÐÔ£¬Èç¹ûÓб䶯µÄ£¬¾Í֪ͨ¶©ÔÄÕß¡£
2.ʵÏÖÒ»¸ö¶©ÔÄÕßWatcher£¬¿ÉÒÔÊÕµ½ÊôÐԵı仯֪ͨ²¢Ö´ÐÐÏàÓ¦µÄº¯Êý£¬´Ó¶ø¸üÐÂÊÓͼ¡£
3.ʵÏÖÒ»¸ö½âÎöÆ÷Compile£¬¿ÉÒÔɨÃèºÍ½âÎöÿ¸ö½ÚµãµÄÏà¹ØÖ¸Á²¢¸ù¾Ý³õʼ»¯Ä£°åÊý¾ÝÒÔ¼°³õʼ»¯ÏàÓ¦µÄ¶©ÔÄÆ÷¡£
Á÷³ÌͼÈçÏ£º

1.ʵÏÖÒ»¸ö¼àÌýÆ÷Observer
Êý¾Ý¼àÌýÆ÷µÄºËÐÄ·½·¨¾ÍÊÇObject.defineProperty(
)£¬Í¨¹ý±éÀúÑ»·¶ÔËùÓÐÊôÐÔÖµ½øÐмàÌý£¬²¢¶ÔÆä½øÐÐObject.defineProperty( )´¦Àí£¬ÄÇô´úÂë¿ÉÒÔÕâÑùд£º
//¶ÔËùÓÐÊôÐÔ¶¼Òª½¯æÃ,µÝ¹é±éÀúËùÓÐÊôÐÔ
function defineReactive(data,key,val) {
observe(val); //µÝ¹é±éÀúËùÓеÄÊôÐÔ
Object.defineProperty(data,key,{
enumerable:true, //µ±ÇÒ½öµ±¸ÃÊôÐ﵀ configurable Ϊ true
ʱ£¬¸ÃÊôÐÔÃèÊö·û²ÅÄܹ»±»¸Ä±ä£¬Í¬Ê±¸ÃÊôÐÔÒ²ÄÜ´Ó¶ÔÓ¦µÄ¶ÔÏóÉϱ»É¾³ý¡£
configurable:true, //µ±ÇÒ½öµ±¸ÃÊôÐÔµÄenumerableΪtrueʱ£¬¸ÃÊôÐÔ²ÅÄܹ»³öÏÖÔÚ¶ÔÏóµÄö¾ÙÊôÐÔÖÐ
get:function() {
return val;
},
set:function(newVal) {
val = newVal;
console.log('ÊôÐÔ'+key+'ÒѾ±»¼àÌý,ÏÖÔÚֵΪ:"'+newVal.toString()+'"');
}
})
}
function observe(data) {
if(!data || typeof data !== 'object') {
return;
}
Object.keys(data).forEach(function(key){
defineReactive(data,key,data[key]);
});
}
var library = {
book1: {
name: ''
},
book2: ''
};
observe(library);
library.book1.name = 'vueȨÍþÖ¸ÄÏ'; // ÊôÐÔnameÒѾ±»¼àÌýÁË£¬ÏÖÔÚֵΪ£º¡°vueȨÍþÖ¸ÄÏ¡±
library.book2 = 'ûÓдËÊé¼®'; // ÊôÐÔbook2ÒѾ±»¼àÌýÁË£¬ÏÖÔÚֵΪ£º¡°Ã»ÓдËÊé¼®¡± |
ͨ¹ýobserve()·½·¨½øÐбéÀúÏòÏÂÕÒµ½ËùÓеÄÊôÐÔ£¬²¢Í¨¹ýdefineReactive()·½·¨½øÐÐÊý¾Ý½Ù³Ö¼àÌý£®
ÔÚÉÏÃæµÄ˼·ÖУ¬ÎÒÃÇÐèÒªÒ»¸ö¿ÉÒÔÈÝÄÉÏûÏ¢¶©ÔÄÕßµÄÏûÏ¢¶©ÔÄÆ÷Dep£¬¶©ÔÄÆ÷Ö÷ÒªÊÕ¼¯ÏûÏ¢¶©ÔÄÕߣ¬È»ºóÔÚÊôÐԱ仯ʱִÐÐÏàÓ¦¶©ÔÄÕߵĸüк¯Êý£¬ÄÇôÏûÏ¢¶©ÔÄÆ÷DepÐèÒªÓÐÒ»¸öÈÝÆ÷£¬ÓÃÀ´´æ·ÅÏûÏ¢¶©ÔÄÕߣ®ÎÒÃǽ«ÉÏÃæµÄ¼àÌýÆ÷ObserverÉÔ΢ÐÞ¸Äһϣº
function defineReactive(data,key,val)
{
observe(val);
var dep = new Dep();
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get: function() {
if (ÊÇ·ñÐèÒªÌí¼Ó¶©ÔÄÕß) { //Watcher³õʼ»¯´¥·¢
dep.addSub(watcher); // ÔÚÕâÀïÌí¼ÓÒ»¸ö¶©ÔÄÕß
}
return val;
},
set: function(newVal) {
if (val === newVal) {
return;
}
val = newVal;
console.log('ÊôÐÔ' + key + 'ÒѾ±»¼àÌýÁË£¬ÏÖÔÚֵΪ£º¡°' + newVal.toString()
+ '¡±');
dep.notify(); // Èç¹ûÊý¾Ý±ä»¯£¬Í¨ÖªËùÓж©ÔÄÕß
}
});
}
function observe(data) {
if(!data || typeof data !== 'object') {
return;
}
Object.keys(data).forEach(function(key){
defineReactive(data,key,data[key]);
});
}
function Dep() {
this.subs = [];
}
//prototype ÊôÐÔʹÄúÓÐÄÜÁ¦Ïò¶ÔÏóÌí¼ÓÊôÐԺͷ½·¨
//prototypeÕâ¸öÊôÐÔÖ»Óк¯Êý¶ÔÏó²ÅÓУ¬¾ßÌåµÄ˵¾ÍÊǹ¹Ô캯Êý¾ßÓÐ.Ö»ÒªÄãÉùÃ÷¶¨ÒåÁËÒ»¸öº¯Êý¶ÔÏó£¬Õâ¸öprototype¾Í»á´æÔÚ
//¶ÔÏóʵÀýÊÇûÓÐÕâ¸öÊôÐÔ
Dep.prototype = {
addSub:function(sub) {
this.subs.push(sub);
},
notify:function() {
this.subs.forEach(function(sub) {
sub.update(); //֪ͨÿ¸ö¶©ÔÄÕß¼ì²é¸üÐÂ
})
}
}
Dep.target = null; |
ÔÚ´úÂëÖУ¬ÎÒÃǽ«¶©ÔÄÆ÷DepÌí¼ÓÒ»¸ö¶©ÔÄÕßÉè¼ÆÔÚgetÀïÃæ£¬ÕâÊÇΪÁËÈÃWatcherÔÚ³õʼ»¯Ê±´¥·¢£¬Òò´ËÅжÏÊÇ·ñÐèÒªÐèÒªÌí¼Ó¶©ÔÄÕߣ¬ÖÁÓÚ¾ßÌåʵÏֵķ½·¨£¬ÎÒÃÇÔÚÏÂÎÄÖÐÉ£®ÔÚset·½·¨ÖУ¬Èç¹ûº¯Êý±ä»¯£¬¾Í»á֪ͨËùÓеĶ©ÔÄÕߣ¬¶©ÔÄÕßÃǽ«»áÖ´ÐÐÏà¶ÔÓ¦µÄ¸üк¯Êý£¬µ½Ä¿Ç°ÎªÖ¹£¬Ò»¸ö±È½ÏÍêÉÆµÄObserverÒѾ³ÉÐÍÁË£¬ÏÂÃæÎÒÃÇҪд¶©ÔÄÕßWatcher.
£²£®ÊµÏÖ¶©ÔÄÕßWatcher
¸ù¾ÝÎÒÃǵÄ˼·£¬¶©ÔÄÕßWahcherÔÚ³õʼ»¯Ê±Òª½«×Ô¼ºÌí¼Óµ½¶©ÔÄÆ÷DepÖУ¬ÄÇôÈçºÎ½øÐÐÌí¼ÓÄØ£¿
ÎÒÃÇÒѾ֪µÀ¼àÌýÆ÷ObserverÊÇÔÚgetº¯ÊýÖÐÖ´ÐÐÁËÌí¼Ó¶©ÔÄÕߵIJÙ×÷µÄ£¬ËùÒÔÎÒÃÇÖ»ÐèÒªÔÚ¶©ÔÄÕßWatcherÔÚ³õʼ»¯Ê±´¥·¢Ïà¶ÔÓ¦µÄgetº¯ÊýÀ´Ö´ÐÐÌí¼Ó¶©ÔÄÕߵIJÙ×÷¼´¿É£®ÄÇôÔõô´¥·¢¶ÔÓ¦µÄgetº¯ÊýÄØ£¿ÎÒÃÇÖ»ÐèÒª»ñÈ¡¶ÔÓ¦µÄÊôÐÔÖµ£¬¾Í¿ÉÒÔͨ¹ýObject.defineProperty(
)´¥·¢¶ÔÓ¦µÄgetÁË£®
ÔÚÕâÀïÐèҪעÒâÒ»¸öϸ½Ú£¬ÎÒÃÇÖ»ÐèÒªÔÚ¶©ÔÄÕß³õʼ»¯Ê±²ÅÖ´ÐÐÌí¼Ó¶©ÔÄÕߣ¬ËùÒÔÎÒÃÇÐèÒªÒ»¸öÅжϣ¬ÔÚDep.targetÉÏ»º´æÒ»Ï¶©ÔÄÕߣ¬Ìí¼Ó³É¹¦ºóÈ¥³ý¾ÍÐÐÁË£¬´úÂëÈçÏ£º
function Watcher(vm,exp,cb)
{
this.vm = vm; //Ö¸ÏòSelfVueµÄ×÷ÓÃÓò
this.exp = exp; //°ó¶¨ÊôÐÔµÄkeyÖµ
this.cb = cb; //±Õ°ü
this.value = this.get();
}
Watcher.prototype = {
update:function() {
this.run();
},
run:function() {
var value = this.vm.data[this.exp];
var oldVal = this.value;
if(value !== oldVal) {
this.value = value;
this.cb.call(this.vm,value,oldVal);
}
},
get:function() {
Dep.target = this; // »º´æ×Ô¼º
var value = this.vm.data[this.exp]; // Ç¿ÖÆÖ´ÐмàÌýÆ÷ÀïµÄgetº¯Êý
Dep.target = null; // ÊÍ·Å×Ô¼º
return value;
}
} |
Õâ¸öʱºòÎÒÃÇÐèÒª¶Ô¼àÌýÆ÷ObserverÖеÄdefineReactive()×öÉÔ΢µÄµ÷Õû£º
function defineReactive(data,key,val)
{
observe(val);
var dep = new Dep();
Object.defineProperty(data, key, {
enumerable: true,
configurable: true,
get: function() {
if(Dep.target) { //ÅжÏÊÇ·ñÐèÒªÌí¼Ó¶©ÔÄÕß
dep.addSub(Dep.target);
}
return val;
},
set: function(newVal) {
if (val === newVal) {
return;
}
val = newVal;
console.log('ÊôÐÔ' + key + 'ÒѾ±»¼àÌýÁË£¬ÏÖÔÚֵΪ£º¡°' + newVal.toString()
+ '¡±');
dep.notify(); // Èç¹ûÊý¾Ý±ä»¯£¬Í¨ÖªËùÓж©ÔÄÕß
}
});
} |
µ½Ä¿Ç°ÎªÖ¹£¬Ò»¸ö¼òÒ×°æµÄWatcherÒѾ³ÉÐÍÁË£¬ÎÒÃÇÖ»ÐèÒª½«¶©ÔÄÕßWatcherºÍ¼àÌýÆ÷Observer¹ØÁªÆðÀ´£¬¾Í¿ÉÒÔʵÏÖÒ»¸ö¼òµ¥µÄË«Ïò°ó¶¨£®ÒòΪÕâÀﻹûÓÐÉè¼ÆÖ¸Áî½âÎöÆ÷£¬ËùÒÔ¶ÔÓÚÄ£°åÊý¾ÝÎÒÃǶ¼½øÐÐдËÀ´¦Àí£¬¼ÙÉèÄ£°åÉÏÓÐÒ»¸ö½ÚµãÔªËØ£¬ÇÒidΪ£§name£§,²¢ÇÒË«Ïò°ó¶¨µÄ°ó¶¨±äÁ¿Ò²ÊÇ'name'£¬ÇÒÊÇͨ¹ýÁ½¸ö´óË«À¨ºÅ°üÆðÀ´£¨ÔÝʱûÓÐʲôÓô¦£©£¬Ä£°å´úÂëÈçÏ£º
<body>
<h1 id="name">{{name}}</h1>
</body> |
ÎÒÃÇÐèÒª¶¨ÒåÒ»¸öSelfVueÀ࣬À´ÊµÏÖobserverºÍwatcherµÄ¹ØÁª£¬´úÂëÈçÏ£º
//½«ObserverºÍWatcher¹ØÁªÆðÀ´
function SelfVue(data,el,exp) {
this.data = data;
observe(data);
el.innerHTML = this.data[exp];
new Watcher(this,exp,function(value) {
el.innerHTML = value;
});
return this;
} |
È»ºóÔÚÒ³ÃæÉÏnewÒ»¸öSelfVue£¬¾Í¿ÉÒÔʵÏÖË«Ïò°ó¶¨ÁË£º
<body>
<h1 id="name"{{name}}></h1>
</body>
<script src="../js/observer.js"></script>
<script src="../js/Watcher.js"></script>
<script src="../js/SelfVue.js"></script>
<script>
var ele = document.querySelector('#name');
var selfVue = new SelfVue({
name:'hello world'
},ele,'name');
window.setTimeout(function() {
console.log('nameÖµ¸Ä±äÁË');
selfVue.name = 'byebye world';
},2000);
</script>> |
ÕâʱÎÒÃÇ´ò¿ªÒ³Ã棬ÏÔʾµÄÊÇ'hello world',£²sºó±ä³ÉÁË'byebye world',Ò»¸ö¼òµ¥µÄË«Ïò°ó¶¨ÊµÏÖÁË£®
¶Ô±Èvue,ÎÒÃÇ·¢ÏÖÁËÓÐÒ»¸öÎÊÌ⣬ÎÒÃÇÔÚΪÊôÐÔ¸³ÖµµÄʱºòÐÎʽÊÇ£º '
selfVue.data.name = 'byebye world' ',¶øÎÒÃÇÀíÏëµÄÐÎʽÊÇ£º' selfVue.name
= 'byebye world' '£¬ÄÇôÔõôʵÏÖÕâÖÖÐÎÊ½ÄØ£¬Ö»ÐèÒªÔÚnew SelfVueʱ×öÒ»¸ö´úÀí´¦Àí£¬È÷ÃÎÊSelfVueµÄÊôÐÔ´úÀíΪ·ÃÎÊselfVue.dataµÄÊôÐÔ£¬ÔÀí»¹ÊÇʹÓÃObject.defineProperty(
)¶ÔÊôÐÔÔÚ°ü×°Ò»²ã£®´úÂëÈçÏ£º
function SelfVue(data,el,exp)
{
var self = this;
this.data = data;
//Object.keys() ·½·¨»á·µ»ØÒ»¸öÓÉÒ»¸ö¸ø¶¨¶ÔÏóµÄ×ÔÉí¿Éö¾ÙÊôÐÔ×é³ÉµÄÊý×é
Object.keys(data).forEach(function(key) {
self.proxyKeys(key); //°ó¶¨´úÀíÊôÐÔ
});
observe(data);
el.innerHTML = this.data[exp]; // ³õʼ»¯Ä£°åÊý¾ÝµÄÖµ
new Watcher(this,exp,function(value) {
el.innerHTML = value;
});
return this;
}
SelfVue.prototype = {
proxyKeys:function(key) {
var self = this;
Object.defineProperty(this,key,{
enumerable:false,
configurable:true,
get:function proxyGetter() {
return self.data[key];
},
set:function proxySetter(newVal) {
self.data[key] = newVal;
}
});
}
} |
ÕâÑùÎÒÃǾͿÉÒÔÓÃÀíÏëµÄÐÎʽ¸Ä±äÄ£°åÊý¾ÝÁË£®
£³£®ÊµÏÖÖ¸Áî½âÎöÆ÷Compile
ÔÙÉÏÃæµÄË«Ïò°ó¶¨demoÖУ¬ÎÒÃÇ·¢ÏÖÕû¸ö¹ý³Ì¶¼Ã»ÓнâÎödom½Úµã£¬¶øÊǹ̶¨Ä³¸ö½Úµã½øÐÐÌæ»»Êý¾Ý£¬ËùÒÔ½ÓÏÂÀ´ÎÒÃÇҪʵÏÖÒ»¸ö½âÎöÆ÷CompileÀ´½âÎöºÍ°ó¶¨¹¤×÷£¬·ÖÎö½âÎöÆ÷µÄ×÷Óã¬ÊµÏÖ²½ÖèÈçÏ£º
1.½âÎöÄ£°åÖ¸Á²¢Ì滻ģ°åÊý¾Ý£¬³õʼ»¯ÊÓͼ
2.½«Ä£°åÖ¸Áî¶ÔÓ¦µÄ½Úµã°ó¶¨¶ÔÓ¦µÄ¸üк¯Êý£¬³õʼ»¯ÏàÓ¦µÄ¶©ÔÄÆ÷
ΪÁ˽âÎöÄ£°å£¬Ê×ÏÈÒª»ñµÃdomÔªËØ£¬È»ºó¶Ôº¬ÓÐdomÔªËØÉϺ¬ÓÐÖ¸ÁîµÄ½Úµã½øÐд¦Àí£¬Õâ¸ö¹ý³Ì¶ÔdomÔªËØµÄ²Ù×÷±È½Ï·±Ëö£¬ËùÒÔÎÒÃÇ¿ÉÒÔÏȽ¨Ò»¸öfragmentƬ¶Î£¬½«ÐèÒª½âÎöµÄdomÔªËØ´æµ½fragmentƬ¶ÎÖÐÔÚ×ö´¦Àí£º
nodeToFragment:function(el)
{
var fragment = document.createDocumentFragment();
//createdocumentfragment()·½·¨´´½¨ÁËÒ»ÐéÄâµÄ½Úµã¶ÔÏ󣬽ڵã¶ÔÏó°üº¬ËùÓÐÊôÐԺͷ½·¨¡£
var child = el.firstChild;
while(child) {
// ½«DomÔªËØÒÆÈëfragmentÖÐ
fragment.appendChild(child);
child = el.firstChild;
}
return fragment;
} |
½ÓÏÂÀ´ÐèÒª±éÀúËùÓнڵ㣬¶Ôº¬ÓÐÖ¸ÁîµÄ½Úµã½øÐÐÌØÊâµÄ´¦Àí£¬ÕâÀïÎÒÃÇÏÈ´¦Àí×î¼òµ¥µÄÇé¿ö£¬Ö»¶Ô´øÓÐ
'{{±äÁ¿}}' ÕâÖÖÐÎʽµÄÖ¸Áî½øÐд¦Àí£¬´úÂëÈçÏ£º
//±éÀú¸÷¸ö½Úµã,¶Ôº¬ÓÐÏà¹ØÖ¸¶¨µÄ½Úµã½øÐÐÌØÊâ´¦Àí
compileElement:function(el) {
var childNodes = el.childNodes; //childNodesÊôÐÔ·µ»Ø½ÚµãµÄ×ӽڵ㼯ºÏ£¬ÒÔ
NodeList ¶ÔÏó¡£
var self = this;
//slice() ·½·¨¿É´ÓÒÑÓеÄÊý×éÖзµ»ØÑ¡¶¨µÄÔªËØ¡£
[].slice.call(childNodes).forEach(function(node)
{
var reg = /\{\{(.*)\}\}/;
var text = node.textContent; //textContent ÊôÐÔÉèÖûò·µ»ØÖ¸¶¨½ÚµãµÄÎı¾ÄÚÈÝ
if(self.isTextNode(node) && reg.test(text))
{ //ÅжÏÊÇ·ñ·ûºÏ{{}}µÄÖ¸Áî
//exec() ·½·¨ÓÃÓÚ¼ìË÷×Ö·û´®ÖеÄÕýÔò±í´ïʽµÄÆ¥Åä¡£
//·µ»ØÒ»¸öÊý×飬ÆäÖдæ·ÅÆ¥ÅäµÄ½á¹û¡£Èç¹ûδÕÒµ½Æ¥Å䣬Ôò·µ»ØÖµÎª null¡£
self.compileText(node,reg.exec(text)[1]);
}
if(node.childNodes && node.childNodes.length)
{
self.compileElement(node); //¼ÌÐøµÝ¹é±éÀú×Ó½Úµã
}
});
},
compileText:function(node,exp) {
var self = this;
var initText = this.vm[exp];
this.updateText(node,initText); // ½«³õʼ»¯µÄÊý¾Ý³õʼ»¯µ½ÊÓͼÖÐ
new Watcher(this.vm,exp,function(value) {
self.updateText(node,value);
});
},
updateText:function(node,value) {
node.textContent = typeof value == 'undefined'
? '': value;
}, |
»ñÈ¡µ½×îÍâ²ã½Úµãºó£¬µ÷ÓÃcompileElementº¯Êý£¬¶ÔËùÓÐ×Ó½Úµã½øÐÐÅжϣ¬Èç¹û½ÚµãÊÇÎı¾½ÚµãÇÒÆ¥Åä{{}}ÕâÖÖÐÎʽָÁîµÄ½Úµã¾Í¿ªÊ¼½øÐбàÒë´¦Àí£¬±àÒë´¦ÀíÊ×ÏÈÐèÒª³õʼ»¯ÊÓͼÊý¾Ý£¬¶ÔÓ¦ÉÏÃæËù˵µÄ²½Öè1£¬½ÓÏÂÈ¥ÐèÒªÉú³ÉÒ»¸ö²¢°ó¶¨¸üк¯ÊýµÄ¶©ÔÄÆ÷£¬¶ÔÓ¦ÉÏÃæËù˵µÄ²½Öè2¡£ÕâÑù¾ÍÍê³ÉÖ¸ÁîµÄ½âÎö¡¢³õʼ»¯¡¢±àÒëÈý¸ö¹ý³Ì£¬Ò»¸ö½âÎöÆ÷CompileÒ²¾Í¿ÉÒÔÕý³£µÄ¹¤×÷ÁË¡£
ΪÁ˽«½âÎöÆ÷CompileÓë¼àÌýÆ÷ObserverºÍ¶©ÔÄÕßWatcher¹ØÁªÆðÀ´£¬ÎÒÃÇÐèÒªÔÙÐÞ¸ÄÒ»ÏÂÀàSelfVueº¯Êý£º
function SelfVue(options)
{
var self = this;
this.vm = this;
this.data = options.data;
Object.keys(this.data).forEach(function(key) {
self.proxyKeys(key); //°ó¶¨´úÀíÊôÐÔ
});
observe(options.data);
new Compile(options.el,this.vm);
return this;
} |
¸ü¸Äºó£¬ÎÒÃǾͲ»ÒªÏñ֮ǰͨ¹ý´«Èë¹Ì¶¨µÄÔªËØÖµ½øÐÐË«Ïò°ó¶¨ÁË£¬¿ÉÒÔËæ±ãÃüÃû¸÷ÖÖ±äÁ¿½øÐÐË«Ïò°ó¶¨ÁË£º
<body>
<div id="app"> <h1>{{title}}</h1>
<h2>{{name}}</h2> <h3>{{content}}</h3>
</div>
</body>
<script src="../js/observer2.js"></script>
<script src="../js/Watcher1.js"></script>
<script src="../js/compile1.js"></script>
<script src="../js/index3.js"></script>
<script>
var selfVue = new SelfVue({
el:'#app',
data:{
title:'aaa',
name:'bbb',
content:'ccc'
}
});
window.setTimeout(function() {
selfVue.title = 'ddd';
selfVue.name = 'eee';
selfVue.content = 'fff'
},2000);
</script> |
µ½ÕâÀһ¸öÊý¾ÝË«Ïò°ó¶¨¹¦ÄÜÒѾ»ù±¾Íê³ÉÁË£¬½ÓÏÂÈ¥¾ÍÊÇÐèÒªÍêÉÆ¸ü¶àÖ¸ÁîµÄ½âÎö±àÒ룬ÔÚÄÄÀï½øÐиü¶àÖ¸ÁîµÄ´¦ÀíÄØ£¿´ð°¸ºÜÃ÷ÏÔ£¬Ö»ÒªÔÚÉÏÎÄ˵µÄcompileElementº¯Êý¼ÓÉÏ¶ÔÆäËûÖ¸Áî½Úµã½øÐÐÅжϣ¬È»ºó±éÀúÆäËùÓÐÊôÐÔ£¬¿´ÊÇ·ñÓÐÆ¥ÅäµÄÖ¸ÁîµÄÊôÐÔ£¬Èç¹ûÓеϰ£¬¾Í¶ÔÆä½øÐнâÎö±àÒë¡£ÕâÀïÎÒÃÇÔÙÌí¼ÓÒ»¸öv-modelÖ¸ÁîºÍʼþÖ¸ÁîµÄ½âÎö±àÒ룬¶ÔÓÚÕâЩ½ÚµãÎÒÃÇʹÓú¯Êýcompile½øÐнâÎö´¦Àí£º
compile:function(node)
{
var nodeAttrs = node.attributes; //attributes
ÊôÐÔ·µ»ØÖ¸¶¨½ÚµãµÄÊôÐÔ¼¯ºÏ£¬¼´ NamedNodeMap¡£
var self = this;
//Array.prototypeÊôÐÔ±íʾArray¹¹Ô캯ÊýµÄÔÐÍ£¬²¢ÔÊÐíΪËùÓÐArray¶ÔÏóÌí¼ÓеÄÊôÐԺͷ½·¨¡£
//Array.prototype±¾Éí¾ÍÊÇÒ»¸öArray
Array.prototype.forEach.call(nodeAttrs,function(attr)
{
var attrName = attr.name; //Ìí¼ÓʼþµÄ·½·¨ÃûºÍǰ׺:v-on:click="onClick"
,ÔòattrName = 'v-on:click' id="app" attrname=
'id'
if(self.isDirective(attrName)) {
var exp = attr.value; //Ìí¼ÓʼþµÄ·½·¨ÃûºÍǰ׺:v-on:click="onClick"
,exp = 'onClick'
//substring() ·½·¨ÓÃÓÚÌáÈ¡×Ö·û´®ÖнéÓÚÁ½¸öÖ¸¶¨Ï±êÖ®¼äµÄ×Ö·û¡£·µ»ØÖµÎªÒ»¸öеÄ×Ö·û´®
//dir = 'on:click'
var dir = attrName.substring(2);
if(self.isEventDirective(dir)) { //ʼþÖ¸Áî
self.compileEvent(node,self.vm,exp,dir);
}else { //v-modelÖ¸Áî
self.compileModel(node,self.vm,exp,dir);
}
node.removeAttribute(attrName);
}
});
} |
ÉÏÃæµÄcompileº¯ÊýÊǹÒÔØCompileÔÐÍÉϵģ¬ËüÊ×ÏȱéÀúËùÓнڵãÊôÐÔ£¬È»ºóÔÙÅжÏÊôÐÔÊÇ·ñÊÇÖ¸ÁîÊôÐÔ£¬Èç¹ûÊǵϰÔÙÇø·ÖÊÇÄÄÖÖÖ¸ÁÔÙ½øÐÐÏàÓ¦µÄ´¦Àí.
×îºóÎÒÃÇÔٴθÄÔìÒ»ÏÂSelfVue£¬ÊÇËüµÄ¸ñʽ¿´ÉÏÈ¥¸üÏñvue:
function SelfVue(options)
{
var self = this;
this.data = options.data;
this.methods = options.methods;
Object.keys(this.data).forEach(function(key) {
self.proxyKeys(key);
});
observe(options.data);
new Compile(options.el,this);
options.mounted.call(this);
} |
²âÊÔһϣº
<body>
<div id="app"> <h2>{{title}}</h2>
<input v-model="name"> <h1>{{name}}</h1>
<button v-on:click="clickMe">click
me!</button> </div>
</body>
<script src="../js/observer3.js"></script>
<script src="../js/Watcher1.js"></script>
<script src="../js/compile2.js"></script>
<script src="../js/index4.js"></script>
<script>
new SelfVue({
el: '#app',
data: {
title: 'hello world',
name: 'canfoo'
},
methods: {
clickMe: function () {
this.title = 'hello world';
}
},
mounted: function () {
window.setTimeout(() => {
this.title = 'ÄãºÃ';
}, 1000);
}
});
</script> |
Ч¹ûÈçÏ£º

µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃǼòÒ×°æµÄdemoÒѾ³É¹¦ÁË£¬Í¨¹ýÉÏÃæÕâ¸öÀý×Ó£¬ÎÒÃÇ¿ÉÒÔ¸ü¼ÓÉî¿ÌµÄÀí½âvueµÄһЩ»úÖÆ£¬±ÈÈçË«Ïò°ó¶¨£¬ÉùÃ÷ʽäÖȾµÈ£®
дÔÚºóÃæ
ÒòΪ´úÂëÁ¿±È½Ï¶à£¬ËùÒÔ¶ÔÓÚһЩ²»ÖØÒªµÄûÓÐһһչʾ£¬ÎÒ°Ñ´úÂë·ÅÔÚÎÒµÄgithubÉÏÁË£¬github
Clone with HTTPS:
https://github.com/2686685661/SelfVue.git
|