±à¼ÍƼö: |
±¾ÎÄ´ÓÈçϼ¸·½Ãæ½²½âÁËÖØ¹¹ºóµÄÏìӦʽÊý¾Ý£ºÖع¹µÄÓÐÄÄЩ¸Ä±ä-¶ÔÊý×éµÄÈ«Ãæ¼àÌý¡¢¶èÐÔ¼àÌý¡¢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 Õýʽ°æ±¾µÄÔçÈÕµ½À´¡£
|