Vue是一個流行的前端框架,提供了很多實用的API方法幫助我們解決開發中遇到的問題。其中,$set方法就是一個非常常用的方法,它被用來改變Vue實例的響應式數據,讓我們來看一下它的原理吧。
$set方法的調用方式是:Vue.set(obj, key, value)或者vm.$set(obj, key, value),其中obj是要操作的對象,key是要修改的屬性名,value是要設置的值。這個方法的作用是將一個屬性添加到響應式數據中,在該屬性不存在時,會將它添加到對象中,并使其成為響應式的。
// 示例代碼 let vm = new Vue({ data: { obj: {}, }, }); vm.$set(vm.obj, 'key', 'value'); console.log(vm.obj.key); // value
在上面的代碼中,我們使用了$set方法將一個新屬性添加到了obj對象中,這個屬性名為key,值為value。使用$set方法的好處是,它會觸發響應式數據的更新,從而讓我們可以實時觀察到數據的變化。
那么$set方法是如何實現的呢?其實它是通過vm.$set方法來實現的,vm.$set方法實際上是調用了Observer類的set方法。下面是Observer類的set方法的簡化版本:
set(target, key, value) { let ob = target.__ob__ if (!ob) { return } ob.dep.notify() }
這個方法接收三個參數,target是要操作的對象,key是要修改的屬性名,value是要設置的值。在方法中,首先獲取到target對象的Observer實例,然后通過ob.dep.notify()方法來觸發響應式數據的更新。
這里的ob.dep是一個Dep類的實例,它是一個依賴管理器。在Vue中,每個響應式數據都有對應的Dep實例,當數據發生變化時,就會通知依賴這個數據的觀察者對象進行更新。
在$set方法中,我們會為新增的屬性添加一個新的Dep實例,這個實例會被加入到它所屬對象的depMap中,從而實現了這個屬性的響應式更新。
總結一下,$set方法是Vue中一個常用的API,它能幫助我們實現響應式數據的增刪改查操作。其背后的原理是通過調用Observer類的set方法,在對象的依賴管理器中添加一個新的Dep實例,從而實現響應式的更新。