在vue中,一個常見的屬性是computed。它是一個計算屬性,只有在依賴的數(shù)據(jù)發(fā)生改變時才會重新計算,而不是每次渲染都重新計算。那么computed屬性的底層是如何實現(xiàn)的呢?
computed屬性的本質(zhì)是一個函數(shù),它接收一個對象作為參數(shù)。這個參數(shù)對象包含了依賴的數(shù)據(jù),每當這些數(shù)據(jù)發(fā)生變化時,computed函數(shù)都會重新計算。
const dep = { a: 1, b: 2, }; const computedFn = function () { console.log(dep.a + dep.b); }; const reactiveDep = new Proxy(dep, { get(target, key, receiver) { /*...*/ }, set(target, key, value, receiver) { /*...*/ }, }); // 在computed函數(shù)中訪問依賴的數(shù)據(jù) computedFn.call(reactiveDep); // 3
在computed函數(shù)中,我們使用了Proxy對象監(jiān)聽了dep對象的訪問和修改。每當訪問或修改dep對象時,Proxy對象就會攔截這些操作并通知computed函數(shù)。
由于Proxy對象是ES6提供的新特性,因此在一些不支持ES6的環(huán)境中,如IE瀏覽器,computed屬性將無法工作。但是vue團隊考慮到這點,在vue2.x版本中,對computed屬性做了兼容處理,使其能夠在不支持ES6的環(huán)境中正常工作。