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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÁÄÁÄ Vue3.0 ÏìӦʽÊý¾Ý
 
 
  1971  次浏览      31
 2021-3-11 
 
±à¼­ÍƼö:
±¾ÎÄ´ÓÈçϼ¸·½Ãæ½²½âÁËÖØ¹¹ºóµÄÏìӦʽÊý¾Ý£ºÖع¹µÄÓÐÄÄЩ¸Ä±ä-¶ÔÊý×éµÄÈ«Ãæ¼àÌý¡¢¶èÐÔ¼àÌý¡¢Map¡¢Set¡¢WeakSet¡¢WeakMapµÄ¼àÌýµÈµÈ¡£
±¾ÎÄÀ´×ÔÓÚСÃȺ¢ÖªµÀ,ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­ÍƼö¡£

±ðÔÙ¸üÐÂÁË£¬ÊµÔÚÊÇѧ²»¶¯ÁË"Õâ¾ä»°µÀ³öÁ˶àÉÙǰ¶Ë¿ª·¢ÕßµÄÐÄÉù£¬"²»ÐÒ"µÄÊÇ Vue µÄ×÷ÕßÔÚ¹úÇìÇø¼ä·¢²¼ÁË Vue3.0 µÄ pre-Aplha °æ±¾£¬ÕâÒâζ×Å Vue3.0 ¿ìÒªºÍÎÒÃǼûÃæÁË¡£¼ÈÀ´Ö®Ôò°²Ö®£¬·öÎÒÆðÀ´ÎÒÒª¿ªÊ¼½²ÁË¡£Vue3.0 ΪÁË´ïµ½¸ü¿ì¡¢¸üС¡¢¸üÒ×ÓÚά»¤¡¢¸üÌù½üÔ­Éú¡¢¶Ô¿ª·¢Õ߸üÓѺõÄÄ¿µÄ£¬ÔÚºÜ¶à·½Ãæ½øÐÐÁËÖØ¹¹£º

ʹÓà Typescript

·ÅÆú class ²ÉÓà function-based API

ÖØ¹¹ complier

ÖØ¹¹ virtual DOM

еÄÏìӦʽ»úÖÆ

½ñÌìÔÛ¾ÍÁÄÁÄÖØ¹¹ºóµÄÏìӦʽÊý¾Ý¡£

³¢ÏÊ

ÖØ¹¹ºóµÄ Vue3.0 ºÍ֮ǰÔÚд·¨ÉÏÓкܴóµÄ²î±ð£¬ÔçǰÔÚÍøÂçÉ϶ÔÓÚ Vue3.0 ÕâÖÖ¼¤½øÊ½µÄÖØ¹¹·½Ê½·¢ÆðÁËÒ»³¡ÌÖÂÛ£¬¼ûÈʼûÖÇ¡£²»¶à˵ÏÈ¿´¿´ Vue3.0 ÔÚд·¨Éϼ¤½øµ½Ê²Ã´³Ì¶È¡£

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../packages/vue/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div>
<script>
const { reactive, computed, effect, createApp } = Vue
const App = {
template: `
<div id="box">
<button @click="add">{{ state.count }}</button>
</div>
`,
setup() {
const state = reactive({
count: 0
})
function add() {
state.count++
}
effect(() => {
console.log('count¸Ä±ä', state.count);
})
return {
state,
add
}
}
}
createApp().mount(App, '#app')
</script>
</body>
</html>

ȷʵд·¨ÉÏºÍ Vue2.x ²î±ðÓеã´ó£¬»¹Õû³öÁ˸ö setup¡£²»¹ýÎҵĵÚÒ»¸Ð¾õµ¹²»ÊÇд·¨ÉϵIJîÒ죬±Ï¾¹Ð´¹ý React£¬ÕâÖÖд·¨Ò²Ã»É¶ÌرðµÄ¡£¹Ø¼üÊÇÕâÖÖÏìӦʽÊý¾ÝµÄд·¨ºÃÏñÔÚÄÄÀï¼û¹ýÓÐûÓУ¿Ð´¹ý React ÏîÄ¿µÄÈË¿ÉÄÜÒ»ÑÛ¾ÍÄÜ¿´³öÀ´£¬Ã»´í¾ÍÊÇËü mobx£¬Ò»ÖÖ React µÄÏìӦʽ״̬¹ÜÀí²å¼þ

import {observable,computed,autorun} from "mobx"
var numbers = observable([1,2,3]);
var sum = computed(() => numbers.reduce((a, b) => a + b, 0));

var disposer = autorun(() => console.log(sum.get()));
// Êä³ö '6'
numbers.push(4);
// Êä³ö '10'
numbers.push(5);

ÔÙ¿´¿´ Vue3.0 ±©Â¶µÄÕ⼸¸öºÍÏìӦʽÊý¾ÝÏà¹ØµÄ·½·¨£º

reactive(value)´´½¨¿É¹Û²ìµÄ±äÁ¿£¬²ÎÊý¿ÉÒÔÊÇ JS ԭʼÀàÐÍ¡¢ÒýÓᢴ¿¶ÔÏó¡¢ÀàʵÀý¡¢Êý×é¡¢¼¯ºÏ£¨Map|Set£©¡£

effect(fn)effect Òâ˼ÊǸ±×÷Ó㬴˷½·¨Ä¬ÈÏ»áÏÈÖ´ÐÐÒ»´Î¡£Èç¹û fn ÖÐÓÐÒÀÀµµÄ¿É¹Û²ìÊôÐԱ仯ʱ£¬»áÔٴδ¥·¢´Ë»Øµ÷º¯Êý

computed(()=>expression)´´½¨Ò»¸ö¼ÆËãÖµ£¬computed ʵÏÖÒ²ÊÇ»ùÓÚ effect À´ÊµÏֵģ¬ÌصãÊÇ computed Öеĺ¯Êý²»»áÁ¢¼´Ö´ÐУ¬¶à´ÎȡֵÊÇÓлº´æ»úÖÆµÄ£¬expression ²»Ó¦¸ÃÓÐÈκθ±×÷Ó㬶ø½ö½öÊÇ·µ»ØÒ»¸öÖµ¡£µ±Õâ¸ö expression ÒÀÀµµÄ¿É¹Û²ìÊôÐԱ仯ʱ£¬Õâ¸ö±í´ïʽ»áÖØÐ¼ÆËã¡£

ºÍ mobx ÓÐÒìÇúͬ¹¤Ö®Ãî¡£

Vue3.0 °Ñ´´½¨ÏìӦʽ¶ÔÏó´Ó×é¼þʵÀý³õʼ»¯ÖгéÀëÁ˳öÀ´£¬Í¨¹ý±©Â¶ API µÄ·½Ê½½«ÏìӦʽ¶ÔÏó´´½¨µÄȨÀû½»¸ø¿ª·¢Õߣ¬¿ª·¢Õß¿ÉÒÔ×ÔÓɵľö¶¨ºÎʱºÎµØ´´½¨ÏìӦʽ¶ÔÏ󣬾ͳåÕâµã Vue3.0 ÎÒÏÈ·ÛÁË¡£

ÖØ¹¹ºóµÄÏìӦʽ»úÖÆ´øÀ´ÁËÄÄЩ¸Ä±ä£¿

ÿһ¸ö´ó°æ±¾µÄ·¢²¼¶¼Òâζ×Åй¦ÄÜ¡¢ÐÂÌØÐԵijöÏÖ£¬ÄÇÃ´ÖØ¹¹ºóµÄÏìӦʽÊý¾Ý²¿·ÖÏà±È 3.0 ֮ǰµÄ°æ±¾ÓÐÁËÄÄЩ·½ÃæµÄ¸Ä±äÄØ£¿ÏÂÃæÌýÎÒæ¸æ¸µÀÀ´£º

¶ÔÊý×éµÄÈ«Ãæ¼àÌý

Vue2.x Öб»´ó¼ÒͲ۵Ä×î¶àµÄÒ»µã¾ÍÊÇÕë¶ÔÊý×éֻʵÏÖÁË push,pop,shift,unshift,splice,sort,reverse' ÕâÆß¸ö·½·¨µÄ¼àÌý£¬ÒÔǰͨ¹ýÊý×éϱê¸Ä±äÖµµÄʱºò£¬ÊDz»ÄÜ´¥·¢ÊÓͼ¸üеġ£ÕâÀï²åÒ»¸öÌâÍâ»°£¬ºÜ¶àÈËÈÏΪ Vue2.x ÖÐÊý×é²»ÄÜʵÏÖÈ«·½Î»¼àÌýÊÇ Object.defineProperty ²»ÄܼàÌýÊý×éϱêµÄ¸Ä±ä£¬Õâ¿É¾ÍÔ©Í÷È˼ÒÁË£¬È˼ÒÒ²ÄÜÕìÌýÊý×éϱê±ä»¯µÄºÃÂ𣬲»ÐÅÄã¿´

const arr = ["2019","ÔÆ","ÆÜ","Òô","ÀÖ","½Ú"];
arr.forEach((val,index)=>{
Object.defineProperty(arr,index,{
set(newVal){
console.log("¸³Öµ");
},
get(){
console.log("ȡֵ");
return val;
}
})
})
let index = arr[1];
//ȡֵ
arr[0] = "2050";
//¸³Öµ

û벡£¬Ò»Çб仯¶¼ÔÚÈ˼ҵÄÕÆÎÕÖС£ÉÏÃæÕâ¶Î´úÂ룬ÓÐûÓÐÈËû¿´¶®£¬ÎÒ¼Ù×°ÄãÃǶ¼²»¶®£¬ÌùÕÅͼ

´ÓÊý×éµÄÊý¾Ý½á¹¹À´¿´£¬Êý×éÒ²ÊÇÒ»¸ö Key-Value µÄ¼üÖµ¶Ô¼¯ºÏ£¬Ö»ÊÇ Key ÊÇÊý×Ö°ÕÁË£¬×ÔȻҲ¿ÉÒÔͨ¹ýObject.defineProperty À´ÊµÏÖÊý×éµÄϱê·ÃÎʺ͸³ÖµÀ¹½ØÁË¡£Æäʵ Vue2.x ûÓÐʵÏÖÊý×éµÄÈ«·½Î»¼àÌýÖ÷ÒªÓÐÁ½·½ÃæÔ­Òò£º

Êý×éºÍÆÕͨ¶ÔÏóÏà±È£¬JS Êý×éÌ«"¶à±ä"ÁË¡£±ÈÈ磺arr.length=0£¬¿ÉÒÔ˲¼äÇå¿ÕÒ»¸öÊý×飻arr[100]=1ÓÖ¿ÉÒÔ˲¼ä½«Ò»¸öÊý×éµÄ³¤¶È±äΪ 100£¨ÆäËûλÖÃÓÿÕÔªËØÌî³ä£©£¬µÈµÈɧ²Ù×÷¡£¶ÔÓÚÒ»¸öÆÕͨ¶ÔÏó£¬ÎÒÃÇÒ»°ãÖ»»á¸Ä±ä Key ¶ÔÓ¦µÄ Value Öµ£¬¶ø²»»áÁ¬key¶¼¸Ä±äÁË,¶øÊý×é¾Í²»Ò»ÑùÁË Key ºÍ Value ¶¼¾­³£Ôö¼Ó»ò¼õÉÙ£¬Òò´Ëÿ´Î±ä»¯ºóÎÒÃǶ¼ÐèÒªÖØÐ½«Õû¸öÊý×éµÄËùÓÐ key µÝ¹éµÄʹÓà Object.defineProperty ¼ÓÉÏ setter ºÍ getter£¬Í¬Ê±ÎÒÃÇ»¹ÒªÇî¾ÙÿһÖÖÊý×é±ä»¯µÄ¿ÉÄÜ£¬ÕâÑùÊÆ±Ø¾Í»á´øÀ´ÐÔÄÜ¿ªÏúÎÊÌ⣬ÓеÄÈË»á¾õµÃÕâµãÐÔÄÜ¿ªÏúËã¸ö x ѽ£¬µ«ÊÇÐÔÄÜÎÊÌâ¶¼ÊÇÓÉС±ä´óµÄ£¬Èç¹ûÊý×éÖдæµÄÊý¾ÝÁ¿´ó¶øÇÒ²Ù×÷Ƶ·±Ê±£¬Õâ¾Í»áÊÇÒ»¸ö´óÎÊÌâ¡£React16.x ÔÚ¾ÍÒòΪÔÚÓÅ»¯ textNode µÄʱºò£¬ÒƳýÁËÎÞÒâÒåµÄ span ±êÇ©£¬ÐÔÄܾÝ˵¶¼ÌáÉýÁ˶àÉÙ¸ö°Ù·Öµã£¬ËùÒÔÐÔÄÜÎÊÌâ²»¿ÉС¿´¡£

Êý×éÔÚÓ¦ÓÃÖо­³£»á±»²Ù×÷£¬µ«ÊÇͨ³£ push,pop,shift,unshift,splice,sort,reverse Õâ 7 ÖÖ²Ù×÷¾ÍÄܴﵽĿµÄ¡£Òò´Ë£¬³öÓÚÐÔÄÜ·½ÃæµÄ¿¼ÂÇ Vue2.x ×ö³öÁËÒ»¶¨µÄÈ¡Éá¡£

ÄÇô Vue3.0 ÔõôÓÖ×ß»ØÍ·Â·È¥ÊµÏÖÁËÊý×éµÄÈ«Ãæ¼àÌýÁËÄØ£¿´ð°¸¾ÍÊÇ Proxy ºÍ Reflet ÕâÒ»¶ÔÔ­Éú CP µÄ³öÏÖ£¬Vue3.0 ʹÓà Proxy ×÷ΪÏìӦʽÊý¾ÝʵÏֵĺËÐÄ£¬Óà Proxy ·µ»ØÒ»¸ö´úÀí¶ÔÏó£¬Í¨¹ý´úÀí¶ÔÏóÀ´ÊÕ¼¯ÒÀÀµºÍ´¥·¢¸üС£´ó¸ÅµÄÔ­ÀíÏñÕâ¶Î´úÂëÒ»Ñù£º

const arr = ["2019","ÔÆ","ÆÜ","Òô","ÀÖ","½Ú"];
let ProxyArray = new Proxy(arr,{
get:function(target, name, value, receiver) {
console.log("ȡֵ")
return Reflect.get(target,name);
},
set: function(target, name, value, receiver) {
console.log("¸³Öµ")
Reflect.set(target,name, value, receiver);;
}
})
const index = ProxyArray[0];
//ȡֵ
ProxyArray[0]="2050"
//¸³Öµ

Ч¹ûºÍ Object.defineProperty Ò»ÑùÒ»ÑùµÄ£¬ÓÖÏÔµÃÇåÐÂÍÑË×ÓÐûÓУ¿¶øÇÒ Proxy Ö»ÒªÊǶÔÏó¶¼ÄÜ´úÀí£¬ºóÃæ»¹»áÌáµ½¡£µ±È» Vue3.0 ÊÇËäÈ»ÓÐÁËл¶£¬µ«Ò²Ã»Íü¼Ç¾É°®£¬¶ÔÓÚÔÚ֮ǰ°æ±¾ÖÐÊý×éµÄ¼¸ÖÖ·½·¨µÄ¼àÌý»¹ÊÇÕÕÑùÖ§³ÖµÄ¡£

¶èÐÔ¼àÌý

ʲôÊÇ"¶èÐÔ¼àÌý"?

¼òµ¥½²¾ÍÊÇ"͵ÀÁ"£¬¿ª·¢Õß¿ÉÒÔÑ¡ÔñÐÔµÄÉú³É¿É¹Û²ì¶ÔÏó¡£ÔÚÆ½Ê±µÄ¿ª·¢Öг£ÓÐÕâÑùµÄ³¡¾°£¬Ò»Ð©Ò³ÃæÉϵÄÊý¾ÝÔÚÒ³ÃæµÄÕû¸öÉúÃüÖÜÆÚÖÐÊDz»»á±ä»¯µÄ£¬ÕâʱÕⲿ·ÖÊý¾Ý²»ÐèÒª¾ß±¸ÏìӦʽÄÜÁ¦£¬ÕâÔÚ Vue3.0 ÒÔǰÊÇûÓÐÑ¡ÔñÓàµØµÄ£¬ËùÓÐÔÚÄ£°åÖÐʹÓõ½µÄÊý¾Ý¶¼ÐèÒªÔÚ data Öж¨Ò壬×é¼þʵÀýÔÚ³õʼ»¯µÄʱºò»á½« data Õû¸ö¶ÔÏó±äΪ¿É¹Û²ì¶ÔÏó¡£

¶èÐÔ¼àÌýÓÐʲôºÃ´¦£¿

Ìá¸ßÁË×é¼þʵÀý³õʼ»¯ËÙ¶ÈVue3.0 ÒÔǰ×é¼þʵÀýÔÚ³õʼ»¯µÄʱºò»á½« data Õû¸ö¶ÔÏó±äΪ¿É¹Û²ì¶ÔÏó£¬Í¨¹ýµÝ¹éµÄ·½Ê½¸øÃ¿¸ö Key ʹÓÃObject.defineProperty ¼ÓÉÏ getter ºÍ settter£¬Èç¹ûÊÇÊý×é¾ÍÖØÐ´´úÀíÊý×é¶ÔÏóµÄÆß¸ö·½·¨¡£¶øÔÚ Vue3.0 ÖУ¬½«¿ÉÏìӦʽ¶ÔÏó´´½¨µÄȨÀû½»¸øÁË¿ª·¢Õߣ¬¿ª·¢Õß¿ÉÒÔͨ¹ý±©Â¶µÄ reactive, compted, effect ·½·¨×Ô¶¨Òå×Ô¼ºÐèÒªÏìӦʽÄÜÁ¦µÄÊý¾Ý£¬ÊµÀýÔÚ³õʼ»¯Ê±²»ÐèÒªÔÙÈ¥µÝ¹é data ¶ÔÏóÁË£¬´Ó¶ø½µµÍÁË×é¼þʵÀý»¯µÄʱ¼ä¡£

½µµÍÁËÔËÐÐÄÚ´æµÄʹÓÃVue3.0 ÒÔǰÉú³ÉÏìӦʽ¶ÔÏó»á¶Ô¶ÔÏó½øÐÐÉî¶È±éÀú£¬Í¬Ê±ÎªÃ¿¸ö Key Éú³ÉÒ»¸ö def ¶ÔÏóÓÃÀ´±£´æ Key µÄËùÓÐÒÀÀµÏµ± Key ¶ÔÓ¦µÄ Value ±ä»¯µÄʱºò֪ͨÒÀÀµÏî½øÐÐ update¡£µ«Èç¹ûÕâЩÒÀÀµÏîÔÚÒ³ÃæÕû¸öÉúÃüÖÜÆÚÄÚ²»ÐèÒª¸üеÄʱºò£¬Õâʱ def ¶ÔÏóÊÕ¼¯µÄÒÀÀµÏî²»½öûÓöøÇÒ»¹»áÕ¼ÓÃÄڴ棬Èç¹û¿ÉÒÔÔÚ³õʼ»¯ data µÄʱºòºöÂÔµôÕâЩ²»»á±ä»¯µÄÖµ¾ÍºÃÁË¡£Vue3.0 ͨ¹ý±©Â¶µÄ reactive ·½·¨£¬¿ª·¢Õß¿ÉÒÔÑ¡ÔñÐԵĴ´½¨¿É¹Û²ì¶ÔÏ󣬴ﵽ¼õÉÙÒÀÀµÏîµÄ±£´æ£¬½µµÍÁËÔËÐÐÄÚ´æµÄʹÓá£

Map¡¢Set¡¢WeakSet¡¢WeakMapµÄ¼àÌý

Ç°ÃæÌáµ½ Proxy ¿ÉÒÔ´úÀíËùÓеĶÔÏó£¬Á¢ÂíÁªÏëµ½ÁË ES6 ÀïÃæÐÂÔöµÄ¼¯ºÏ Map¡¢Set£¬ ¾ÛºÏÀàÐ͵ÄÖ§³ÖµÃÒæÓÚ Proxy ºÍ Reflect¡£½²ÕæµÄÕâ֮ǰ»¹Õæ²»ÖªµÀ Proxy Õâô¸Õɶ¶¼ÄÜ´úÀí£¬¶þ»°²»ËµÖ±½Ó¶¯ÊÖÓà Proxy ´úÀíÁËÒ»¸ö map ÊÔÊÔË®

let map = new Map([["name","zhengcaiyun"]])
let mapProxy = new Proxy(map, {
get(target, key, receiver) {
console.log("ȡֵ:",key)
return Reflect.get(target, key, receiver)
}
})
mapProxy.get("name")

 

Uncaught TypeError: Method Map.prototype.get called on incompatible receiver [object Object]

Ò»ÅèÁ¹Ë®ÆÃÀ´£¬±¨´íÁË¡£Ô­À´ Map¡¢Set ¶ÔÏó¸³Öµ¡¢È¡ÖµºÍËûÃÇÄÚ²¿µÄ this Ö¸ÏòÓйØÏµ£¬µ«ÕâÀïµÄ this Ö¸ÏòµÄÊÇÆäʵÊÇ Proxy ¶ÔÏó£¬ËùÒÔµÃÕâÑù¸É

let map = new Map([["name","zhengcaiyun"]])
let mapProxy = new Proxy(map, {
get(target, key, receiver) {
console.log("ȡֵ:",key)
return Reflect.get(target, key, receiver)
}
})
mapProxy.get("name")

µ±»ñÈ¡µÄÊÇÒ»¸öº¯ÊýµÄʱºò£¬Í¨¹ý×÷ÓÃÓò°ó¶¨µÄ·½Ê½½«Ô­¶ÔÏó°ó¶¨µ½ Map¡¢Set ¶ÔÏóÉϾͺÃÁË¡£

Vue3.0 ÊÇÈçºÎʵÏÖ¼¯ºÏÀàÐÍÊý¾Ý¼àÌýµÄ£¿

ÑÛ¼âµÄͬѧ¿´ÍêÉÏÃæÕâ¶Î´úÂë»á·¢ÏÖÒ»¸öÎÊÌ⣬¼¯ºÏÊÇûÓÐ set ·½·¨£¬¼¯ºÏ¸³ÖµÓõÄÊÇ add ²Ù×÷,ÄÇÕ¦°ìÄØ£¿À´¿´¿´ÄÇô Vue3.0 ÊÇÔõô´¦ÀíµÄ£¬ÉÏÒ»¶Î¼ò»¯ºóµÄÔ´Âë

function reactive(target: object) {
return createReactiveObject(
target,
rawToReactive,
reactiveToRaw,
mutableHandlers,
mutableCollectionHandlers
)
}

function createReactiveObject(
target: any,
toProxy: WeakMap<any, any>,
toRaw: WeakMap<any, any>,
baseHandlers: ProxyHandler<any>,
collectionHandlers: ProxyHandler<any>
) {
//collectionTypes = new Set<Function>([Set, Map, WeakMap, WeakSet])
const handlers = collectionTypes.has(target.constructor)
? collectionHandlers
: baseHandlers
//Éú³É´úÀí¶ÔÏó
observed = new Proxy(target, handlers)
toProxy.set(target, observed)
toRaw.set(observed, target)
if (!targetMap.has(target)) {
targetMap.set(target, new Map())
}
return observed
}

¸ù¾Ý target ÀàÐÍÊÊÅ䲻ͬµÄ handler£¬Èç¹ûÊǼ¯ºÏ £¨Map¡¢Set£©¾ÍʹÓà collectionHandlers£¬ÊÇÆäËûÀàÐ;ÍʹÓà baseHandlers¡£½ÓÏÂÀ´¿´¿´ collectionHandlers

export const mutableCollectionHandlers: ProxyHandler<any> = {
get: createInstrumentationGetter(mutableInstrumentations)
}
export const readonlyCollectionHandlers: ProxyHandler<any> = {
get: createInstrumentationGetter(readonlyInstrumentations)
}

ûÓÐÒâÍâÖ»ÓÐ get£¬É§¾ÍɧÔÚÕâ¶ù:

// ¿É±äÊý¾Ý²å×®¶ÔÏó£¬ÒÔ¼°Ò»ÏµÁÐÏàÓ¦µÄ²å×®·½·¨
const mutableInstrumentations: any = {
get(key: any) {
return get(this, key, toReactive)
},
get size() {
return size(this)
},
has,
add,
set,
delete: deleteEntry,
clear,
forEach: createForEach(false)
}
// µü´úÆ÷Ïà¹ØµÄ·½·¨
const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator]
iteratorMethods.forEach(method => {
mutableInstrumentations[method] = createIterableMethod(method, false)
readonlyInstrumentations[method] = createIterableMethod(method, true)
})
// ´´½¨getterµÄº¯Êý
function createInstrumentationGetter(instrumentations: any) {
return function getInstrumented(
target: any,
key: string | symbol,
receiver: any
) {
target =
hasOwn(instrumentations, key) && key in target ? instrumentations : target
return Reflect.get(target, key, receiver)
}
}

ÓÉÓÚ Proxy µÄ traps ¸ú Map|Set ¼¯ºÏµÄÔ­Éú·½·¨²»Ò»Ö£¬Òò´ËÎÞ·¨Í¨¹ý Proxy ½Ù³Ö set£¬ËùÒÔ×÷ÕßÔÚÔÚÕâÀï½øÐÐÁË"͵Áº»»Öù"£¬ÕâÀïд´½¨ÁËÒ»¸öºÍ¼¯ºÏ¶ÔÏó¾ßÓÐÏàͬÊôÐԺͷ½·¨µÄÆÕͨ¶ÔÏó£¬ÔÚ¼¯ºÏ¶ÔÏó get ²Ù×÷ʱ½« target ¶ÔÏó»»³Éд´½¨µÄÆÕͨ¶ÔÏó¡£ÕâÑù£¬µ±µ÷Óà get ²Ù×÷ʱ Reflect ·´Éäµ½Õâ¸öжÔÏóÉÏ£¬µ±µ÷Óà set ·½·¨Ê±¾ÍÖ±½Óµ÷ÓÃжÔÏóÉÏ¿ÉÒÔ´¥·¢ÏìÓ¦µÄ·½·¨£¬ÊDz»ÊǺÜÇÉÃËùÒÔ¶à¿´Ô´ÂëºÃ´¦¶à¶à£¬¿ÉÒÔ¶àѧѧÈ˼ҵÄɧ²Ù×÷¡£

IE Ôõô°ì£¿

ÕâÊǸöʵÔÚ²»ÏëÌᵫÓÖÈÆ²»¿ªµÄ»°Ì⣬IE ÔÚǰ¶Ë¿ª·¢ÕßÑÛÀïºÍħ¹íÃ»Ê²Ã´Çø±ð¡£ÔÚ Vue3.0 ֮ǰ£¬ÏìӦʽÊý¾ÝµÄʵÏÖÊÇÒÀÀµ ES5 µÄ Object.defineProperty£¬Òò´ËÖ»ÒªÖ§³Ö ES5 µÄä¯ÀÀÆ÷¶¼Ö§³Ö Vue£¬Ò²¾ÍÊÇ˵ Vue2.x ÄÜÖ§³Öµ½ IE9¡£Vue3.0 ÒÀÀµµÄÊÇ Proxy ºÍ Reflect ÕâÒ»¶Ô³öÉúÐÂʱ´úµÄ CP£¬ÇÒÎÞ·¨±»×ªÒë³É ES5£¬»òÕßͨ¹ý Polyfill Ìṩ¼æÈÝ£¬Õâ¾ÍÞÏÞÎÁË¡£¿ª·¢Õß¼¼ÊõǰÏß»ñϤµÄÐÅÏ¢£¬¹Ù·½ÔÚ·¢²¼×îÖհ汾֮ǰ»á×öµ½¼æÈÝ IE11£¬ÖÁÓÚ¸üµÍ°æ±¾µÄ IE ÄǾÍÖ»ÓÐËÍÉÏÒ»ÇúÁ¹Á¹ÁË¡£

ÆäʵҲ²»ÓÃÌ«¾À½áIEµÄÎÊÌ⣬ÒòΪÁ¬Î¢Èí×Ô¼º¶¼ÒѾ­·ÅÆúÖÎÁÆ IE Óµ±§ Chromium ÁË£¬ÎÒÃÇÓֺαؾÀ½áÄØ£¿

½áÓï

ÔÚʹÓÿªÔ´¿ò¼Üʱ²»ÒªÍüÁË£¬ÎÒÃÇÖ®ËùÒÔÄÜÃâ·ÑÊÔÓÃËû£¬¿¿µÄά»¤ÕßͶÈëµÄ´óÁ¿¾«Á¦¡£Ï£ÍûÎÒÃǶàÈ¥·¢ÏÖËü´øÀ´µÄÓŵãºÍ×÷ÕßÏëͨ¹ýËü´«µÝµÄ±à³Ì˼Ïë¡£×îºóÆÚ´ý Vue3.0 Õýʽ°æ±¾µÄÔçÈÕµ½À´¡£

 

 
   
1971 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

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

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

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
 
×îÐÂÎÄÕÂ
ÈçºÎÉè¼Æ¸ßÀ©Õ¹µÄÔÚÏßÍøÒ³ÖÆ×÷ƽ̨
electronÈëÃÅÐĵÃ
ʹÓà Electron ¹¹½¨×ÀÃæÓ¦ÓÃ
VUE.JS×é¼þ»¯¿ª·¢Êµ¼ù
ÉîÈëÀí½âJSCore
×îпγÌ
HTML 5 + CSS3 Ô­ÀíÓ뿪·¢Ó¦ÓÃ
Webǰ¶Ë¸ß¼¶¹¤³Ìʦ±Ø±¸¼¼ÄÜʵս
Vue´óÐÍÏîÄ¿¿ª·¢ÊµÕ½
ReactÔ­ÀíÓëʵ¼ù
Vue.js½ø½×Óë°¸Àýʵ¼ù
³É¹¦°¸Àý
Öн»¼¯ÍÅ ¹¹½¨Web×Ô¶¯»¯²âÊÔ¿ò¼Ü
ijָÃûµçÐŹ«Ë¾ Vue.js½ø½×Óë°¸Àý
¹úµçÍ¨ÍøÂç¼¼Êõ HTML5+CSS3 +webǰ¶Ë¿ò
ÒÆ¶¯Í¨ÐÅ ÒÆ¶¯»¥ÁªÍøÓ¦Óÿª·¢Ô­Àí
ijµçÁ¦ÐÐ android¿ª·¢Æ½Ì¨×î¼Ñ