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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÀí½âvue
 
  2082  次浏览      27
  2019-5-8
 
±à¼­ÍƼö:
±¾ÎÄÀ´×Ô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·½·¨£¬Êä³ö£¼ÈËÐÔµÄÈõµã£¾£¬Èç¹ûÔÚ´úÂëÖмÓÈëÕâ¾ä»°Ê±£¬»á´òÓ¡³öÊ²Ã´ÄØ£¿

console.log(Book)

½á¹ûÈçÏ£º

ÓëÉÏÃæ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

Ïà¹ØÎÄÕÂ

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

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

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

 
   
2082 ´Îä¯ÀÀ       27