国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Vue源碼之關于vm.$delete()/Vue.use()內部原理詳解

2024-05-06 15:39:57
字體:
來源:轉載
供稿:網友

vm.$delete()

vm.$delete用法見官網。

為什么需要Vue.delete()?

在ES6之前, JS沒有提供方法來偵測到一個屬性被刪除了, 因此如果我們通過delete刪除一個屬性, Vue是偵測不到的, 因此不會觸發數據響應式。

見下面的demo。

<!DOCTYPE html><html lang="en"> <head>  <meta charset="UTF-8" />  <meta name="viewport" content="width=device-width, initial-scale=1.0" />  <meta http-equiv="X-UA-Compatible" content="ie=edge" />  <title>Vue Demo</title>  <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body>  <div id="app">   名字: {{ user.name }} 年紀: {{ user.age }}   <button @click="addUserAgeField">刪除一個年紀字段</button>  </div>  <script>   const app = new Vue({    el: "#app",    data: {     user: {      name: "test",      age: 10     }    },    mounted() {},    methods: {     addUserAgeField() {      // delete this.user.age; // 這樣是不起作用, 不會觸發數據響應式更新      this.$delete(this.user, 'age') // 應該使用     }    }   });  </script> </body></html>

源碼分析內部實現

源碼位置vue/src/core/instance/state.js的stateMixin方法

export function stateMixin (Vue: Class<Component>) {  ...    Vue.prototype.$set = set  Vue.prototype.$delete = del    ...}

然后查看del函數位置, vue/src/core/observer/index.js。

/** * Delete a property and trigger change if necessary. * target: 將被刪除屬性的目標對象, 可以是對象/數組 * key: 刪除屬性 */export function del (target: Array<any> | Object, key: any) { // 非生產環境下, 不允許刪除一個原始數據類型, 或者undefined, null if (process.env.NODE_ENV !== 'production' &&  (isUndef(target) || isPrimitive(target)) ) {  warn(`Cannot delete reactive property on undefined, null, or primitive value: ${(target: any)}`) } // 如果target是數組, 并且key是一個合法索引,通過數組的splcie方法刪除值, 并且還能觸發數據的響應(數組攔截器截取到變化到元素, 通知依賴更新數據) if (Array.isArray(target) && isValidArrayIndex(key)) {  target.splice(key, 1)  return } // 獲取ob const ob = (target: any).__ob__ // target._isVue: 不允許刪除Vue實例對象上的屬性 // (ob && ob.vmCount): 不允許刪除根數據對象的屬性,觸發不了響應 if (target._isVue || (ob && ob.vmCount)) {  process.env.NODE_ENV !== 'production' && warn(   'Avoid deleting properties on a Vue instance or its root $data ' +   '- just set it to null.'  )  return } // 如果屬性壓根不在對象上, 什么都不做處理 if (!hasOwn(target, key)) {  return } // 走到這一步說明, target是對象, 并且key在target上, 直接使用delete刪除 delete target[key] // 如果ob不存在, 說明target本身不是響應式數據, if (!ob) {  return } // 存在ob, 通過ob里面存儲的Dep實例的notify方法通知依賴更新 ob.dep.notify()}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 丹巴县| 察哈| 大兴区| 贺州市| 寿光市| 金沙县| 上栗县| 法库县| 宁强县| 和林格尔县| 香格里拉县| 吐鲁番市| 平利县| 休宁县| 彭州市| 大冶市| 淮南市| 来宾市| 镇赉县| 通许县| 涞源县| 房山区| 通河县| 大悟县| 南康市| 资溪县| 新乐市| 竹溪县| 盐源县| 宜良县| 全州县| 白沙| 梁山县| 长沙市| 韶山市| 南川市| 花莲市| 江永县| 诏安县| 新竹市| 马边|