±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËΪʲô
Vue3.0 ÒªÖØÐ´ÏìӦʽϵͳ ?ÏìӦʽÔÀí¡¢Object.defineProperty
µÄÎÊÌâ¡¢Composition API µÄÏìӦʽϵͳµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚbilibili,ÓÉ»ðÁú¹ûÈí¼þAnna±à¼ÍƼö¡£ |
|
ÃæÊÔµÄʱºò¾³£±»Îʵ½ ÏìӦʽ Ïà¹ØµÄÄÚÈÝ£¬¶øVue3.0 ¸üкó£¬ÃæÊÔ¹ÙÓÖÓÐÁËеÄÎäÆ÷£»
ÃæÊÔ¹Ù£ºÎªÊ²Ã´ Vue3.0 ÒªÖØÐ´ÏìӦʽϵͳ£¿
ã±ÆÊ÷ÉÏã±ƹû£¬ã±ÆÊ÷ÏÂÄãºÍÎÒ£¬ÃæÊÔ¹ÙÔÚÎÊʲô£¬ÎÒ¸ÃÔõô»Ø´ð£¬ÍêÈ«²»ÖªµÀÔõô»ØÊ£»
ÓÐЩ¾ÑéµÄС»ï°é¿ÉÄÜ»á´Ó½âÊÍ Proxy µÄºÃ´¦¿ªÊ¼¼òµ¥ÁÄһϣ¬±ÈÈ磺 Proxy ÊÇÖ±½Ó´úÀí¶ÔÏ󣬶ø²»ÊǽٳֶÔÏóµÄÊôÐÔ£»¸üºÃµÄÊý×é¼à¿Ø£»
ÕâÑùµÄ»Ø´ð£¬ÃãÇ¿ËãÊǺϸñ°É
Äǵ½µ×Ó¦¸ÃÔõô´ðÄØ£¿
ÃæÊÔ¹Ù±³ºóµÄ³öÌâÂß¼
±ð¼±£¬ÔÛÃÇÏÈÕûÀíÒ»ÏÂ˼·£¬Ëï×Ó±ø·¨ÓÐÔÆ£º¡°Öª¼ºÖª±Ë£¬°ÙÕ½²»´ù¡±£»ÃæÊÔ¾ÍÏñ´òÕÌ£¬ÄãÀ´ÎÒÍù£¬ËùÒÔÎÒÃÇÐèÒª»»Î»Ë¼¿¼£¬ÏëÒ»Ïë£¬ÎªÊ²Ã´ÃæÊÔ¹Ù»áÎÊÕâÑùÒ»¸öÎÊÌâ£¿ÃæÊÔ¹ÙÏë´ÓÕâ¸öÎÊÌâÀïµÃµ½Ê²Ã´»Ø´ð£¿Õâ¸öÎÊÌâ¿ÉÒÔ¿¼²ìÄÄЩ¼¼Êõµã£¿
ÏëÇå³þÕâ¸öÎÊÌ⣬Ôٻص½×Ô¼ºÉíÉÏ£¬ÕâЩ¼¼Êõµã£¬Äã¶¼ÕÆÎÕÁËÂð£¿
˵µÃÖ±°×Ò»µã£¬ÃæÊÔ¾ÍÏñ¿¼ÊÔ£¬ÄãÐèÒªÏÈ ¶ÁÌâ¡¢ÉóÌâ²ÅÄÜ´ðºÃÕâµÀÌ⣻
ΪʲôºÜ¶àÈËÈÏΪ ¡°ÃæÊÔÔì»ð¼ý£¬¹¤×÷Å¡ÂÝË¿¡±£¿ÒòΪûÓл»Î»Ë¼¿¼£¬Ã»ÓÐÏëÇå³þÃæÊÔÌâ±³ºóµÄÂß¼£»
ÄÇÎÒÃÇÏëÇå³þÕâ¸öÂß¼Ö®ºó£¬ÐèÒªÎÒÃÇ×öµÄ¾ÍÊÇÌáÈ¡¼¼Êõµã£¬ÕûÀí˼·£¬×ö³ö¶ÔÓ¦½â´ð£»µ±È»£¬Ç°ÌáÊÇÄãÐèÒª¾ß±¸ÕâЩ¼¼ÊõÄÜÁ¦
ÄÇô½ÓÏÂÀ´£¬ÎҾͳ¢ÊÔ²ð½âÒ»ÏÂÕâ¸öÃæÊÔÌâÁË£¬ÌáÈ¡ÆäÖеÄ֪ʶµã¡£
¶ÔÓÚÄãÀ´Ëµ£¬¾ÍÊÇÒª¿´¿´ÕâЩ֪ʶµã£¬Äã¶¼ÕÆÎÕÁ˶àÉÙ£¿
Ϊʲô Vue3.0 ÒªÖØÐ´ÏìӦʽϵͳ ?
ÎªÊ²Ã´ÖØÐ´£¿Èç¹û֮ǰºÃºÃµÄ£¬ÖØÐ´¾ÍûÓÐÒâÒ壬ÄÇ֮ǰ´æÔÚʲôÎÊÌ⣬ÏÖÔÚÊÇÔõô½â¾öµÄ£¿¾ÍÊǹؼüµãÁË£»
²»ÖªµÀÄã¶Ô Vue2.x µÄÏìÓ¦Ê½ÕÆÎÕ¶àÉÙ£¬ÊDz»ÊÇÇ·ÏÂÁ˼¼ÊõµÄծĨ£¿Ã»¹ØÏµ£¬ÎÒÀ´°ïÄ㻹ծ£¬ÏÈÊáÀí Vue2.x
µÄÏìӦʽ£»
Æäʵ»ùÓÚÕâ¸öÃæÊÔÌ⣬±³ºó»¹Óкܶ༼Êõµã£¬ÉÏÃæÕâЩ£¬ÊÇÓ뵱ǰÌâÄ¿ÓÐÖ±½Ó¹ØÏµµÄ£¬Êµ¼ÊÃæÊÔÖУ¬ºÜÓпÉÄÜ»ùÓÚÕâЩ¼¼Êõµã£¬ÔÚ½øÐÐÉîÈë½»Á÷£¬ÕâÀï¾Í²»À©Õ¹ÁË£¬ÄãÄܰÑÏÖÔÚÕâЩÎÊÌâÀíÇå³þ£¬¾ÍËã׬µ½ÁË£»
Vue2.x ÏìӦʽ
Æäʵ¹ØÓÚÕâÒ»µã£¬ÔÚVue µÄ¹Ù·½ÎĵµÖУ¬ÔçÒѾÓйý˵Ã÷ÁË£¬¶øÇÒ˵µÃ·Ç³£Ïêϸ£»¹Ù·½Îĵµ
µ±Äã°ÑÒ»¸öÆÕͨµÄ 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£¬´Ó¶øÊ¹Ëü¹ØÁªµÄ×é¼þÖØÐÂäÖȾ¡£
ÎÒÃÇʹÓùٷ½¸øµÄÒ»ÕÅͼʾ£¬À´ÊáÀíÕû¸öÁ÷³Ì£»

ÎÒÃÇÏÈÀ´¿´Ò»¶Î´úÂë

ÏìӦʽÔÀí
data ÖÐµÄ obj ¾ÍÊÇÒ»¸öÆÕͨµÄ JavaScript ¶ÔÏó£¬Í¨¹ýµã»÷
Click °´Å¥£¬½«»ñÈ¡µ½µÄËæ»úÊý¸³Öµ¸ø this.message £¬¶ø this.message
Ö¸ÏòµÄ¾ÍÊÇ data ÖÐ obj ¶ÔÏóµÄ message ÊôÐÔ£»µ±message ·¢ÉúÊý¾Ý¸Ä±äʱ£¬Ò³ÃæÖÐ
H1 ±êÇ©µÄÄÚÈÝ»áËæÖ®¸Ä±ä£¬Õâ¸ö¹ý³Ì¾ÍÊǾÍÊÇÏìӦʽµÄ£»ÄÇôVue ÊÇÈçºÎʵÏÖµÄÄØ£¿
Ê×ÏÈ£¬Vue ÄÚ²¿Ê¹Óà Object.defineProperty()
½« Data ÖеÄÿһ¸ö³ÉÔ±¶¼×ª»»Îª getter / setter µÄÐÎʽ£»getterÓÃÀ´ÒÀÀµÊÕ¼¯£¬setter?ÓÃÀ´ÅÉ·¢¸üУ»¶øÄ£°åÄÚÈÝ£¬×îÖջᱻ±àÒëΪ
render º¯Êý£¬ÔÚ render º¯ÊýÖУ¬ÎÒÃÇÄÜ·¢ÏÖ_v(_s(message))?message
±»·ÃÎÊÁË£¬¾Í»á´¥·¢ getter À´½øÐÐÒÀÀµÊÕ¼¯£¬¶øÔÚ´úÂëÖеĵã»÷ʼþÖУ¬Ò»µ©Ê¼þ´¦Àí³ÌÐò±»´¥·¢Ö´ÐУ¬ÄÇô
message Ôò»á±»Ð޸ģ¬¾Í»á´¥·¢ setterÀ´½øÐÐÅÉ·¢¸üУ»

ËäÈ»Á÷³ÌÀíÇå³þÁË£¬µ«ÊÇ×ܸоõÉÙµãʲô£¬Ôõô²ÅÄܸüÍ¨Í¸ÄØ£¿
ÎÒÃÇÓôúÂëÀ´Ä£ÄâÕû¸öµÄʵÏÖ¹ý³Ì£»
defineProperty Ä£Äâ´úÂë
defineProperty µÄ»ù±¾Ó÷¨£¬Ö±½Ó¿´ÊÖ²á¾ÍÐÐÁË£º
ÎÒÃÇÀ´¿´¿´´úÂ룺

ÄãûÓп´´í£¬¼ÓÉÏ×¢ÊÍ£¬Ò»¹² 36ÐдúÂ룬Õâ¾ÍÊÇ Vue2.x ¶ÔÏìӦʽʵÏÖµÄÕû¸öÁ÷³Ì£»
¼ÌÐøÊµÏÖ¶à¸öÊý¾ÝµÄÏìӦʽ

ÉÏÃæµÄ´úÂëÖ»ÊÇÄ£ÄâÁË ÏìӦʽ µÄÔÀí£¬µ«VueÔÚʵÏÖÖУ¬¿Ï¶¨²»»áÄÇô¼òµ¥£¬½ÓÏÂÀ´£¬ÎÒÃÇ¿´Ò»ÏÂÔ´Âëѽ¡¡
Vue2 Ô´Âë½â¶Á
Ê×ÏÈÕÒµ½ÏìӦʽ´úÂëµÄ´¦ÀíλÖãº


¿´ÍêVue2.x ÏìӦʽµÄ´úÂ룬ÎÒÃÇÔٻعýÍ·À´Ë¼¿¼×ʼµÄÎÊÌ⣬Ϊʲô Vue3.0 ÒªÖØÐ´ÏìӦʽϵͳ
?
ÎªÊ²Ã´ÖØÐ´£¿Èç¹û֮ǰºÃºÃµÄ£¬ÖØÐ´¾ÍûÓÐÒâÒ壬ÄÇ֮ǰ´æÔÚʲôÎÊÌ⣬»»¾ä»°ÎʾÍÊÇ defineProperty
?ÓÐʲôÎÊÌ⣿
Object.defineProperty µÄÎÊÌâ
Æäʵ£¬ defineProperty µÄÎÊÌ⣬ÔÚVue2.x µÄÊÖ²áÖУ¬ÒѾ˵¹ýÁË£»¡°°¥£¬ºÜ¶àÈ˾ÍÊDz»¿´Îĵµ°¡¡±
ÏÂÃæ·Ö±ðʹÓà Vue2 ºÍ Vue3 ʵÏÖÁËÒ»¸öС¹¦ÄÜ£¬´úÂëһģһÑù£¬¹¦Äܵ±È»Ò²Ò»Ñù£¬µ«ÊÇ£¬ÔÚ Vue2
ÖоͻáÓÐBug£¬¶øÔËÐÐÔÚvue3Öеģ¬ÔòûÓÐÈκÎÎÊÌ⣻
Vue2:

Vue3£º

ÆäºËÐĵãÔÚÓÚ defineProperty ²»ÄܺܺõÄʵÏÖ¶ÔÊý×éϱêµÄ¼à¿Ø£¬¶øÔÚ
Vue2 µÄʵÏÖ´úÂëÖУ¬Ã»ÓиüºÃµÄ·½°¸¶Ô´Ë½øÐиÄÉÆ£¬ÓÈ´óË÷ÐÔÖ±½Ó·ÅÆúÁËʵÏÖ£»¹ØÓÚÕâ¸öÎÊÌ⣬ÓÈ´óÒ²ÔÚ
github ×ö¹ý»ØÓ¦£¬½Ø¸öͼ¸ø´ó¼Ò¿´¿´£»

ÄÇô£¬Vue Ŀǰ»¹Ã»Óнâ¾öµÄÎÊÌ⣬Vue3ÖÐÏÔÈ»ÊÇÒѾ½â¾öµÄÁË£¬ÎÊÌâÊÇ£¬Vue3
ÊÇÈçºÎ½â¾öµÄÄØ£¿Ç°ÃæÔÚ Vue3 µÄ´úÂëÖÐÎÒÃÇʹÓõÄÊÇ´«Í³µÄ Options Api À´ÊµÏÖµÄÊý¾ÝÏìӦʽ£¬
¶øÔÚ Vue3 ÖÐÈ«Ð嵀 Composition Api ҲʵÏÖÁËÏìӦʽϵͳ£¬ÎÒÃÇÏÈÀ´¸ÐÊÜһϠComposition
Api µÄ»ù´¡Ó÷¨
Composition API µÄÏìӦʽϵͳ
ref ÏìӦʽ

reactive ÏìӦʽ

Vue3 ÖеÄÏìӦʽÊÇÈçºÎʵÏÖµÄÄØ£¿¹Ø¼üµãÔÚÓÚProxy º¯Êý£»
Proxy ʵÏÖÔÀí
ʹÓà Proxy ʵÏÖµÄÏìӦʽ´úÂ룬Ҫ±ÈʹÓà defineProperty µÄ´úÂë¼òµ¥µÃ¶à£¬ÒòΪ Proxy
ÌìÈ»µÄÄܹ»¶ÔÕû¸ö¶ÔÏó×ö¼àÌý£¬¶ø²»ÐèÒª¶ÔÊý¾ÝÐбéÀúºó×ö¼àÌý£¬Í¬Ê±Ò²¾Í½â¾öÁËÊý×éϱêµÄÎÊÌ⣻
ÎÒÃÇÀ´Ò»¶ÎÄ£Äâ´úÂ뿴һϣº

|