1. 程式人生 > 其它 >Vue 響應式原理

Vue 響應式原理

vue的響應式原理? 什麼是響應式,“響應式”,是指當資料改變後,Vue 會通知到使用該資料的程式碼。例如,檢視渲染中使用了資料,資料改變後,檢視也會自動更新。 Vue 的響應式原理是核心是通過 ES5 的保護物件的 Object.defindeProperty 中的訪問器屬性中的 get 和 set 方法,data 中宣告的屬性都被添加了訪問器屬性,當讀取 data 中的資料時自動呼叫 get 方法,當修改 data 中的資料時,自動呼叫 set 方法,檢測到資料的變化,會通知觀察者 Wacher,觀察者 Wacher自動觸發重新render 當前元件(子元件不會重新渲染),生成新的虛擬 DOM 樹,Vue 框架會遍歷並對比新虛擬 DOM 樹和舊虛擬 DOM 樹中每個節點的差別,並記錄下來,最後,載入操作,將所有記錄的不同點,區域性修改到真實 DOM 樹上。

 

Object.defineProperty怎麼用, 三個引數?,有什麼作用啊? Object.defineProperty() 方法會直接在一個物件上定義一個新屬性,或者修改一個物件的現有屬性,並返回此物件。 Object.defineProperty(obj, prop, {}) obj:需要定義屬性的物件 prop:需要定義的屬性 {}:要定義或修改的屬性描述符。 value: "18", // 設定預設值得 enumerable: true, //這一句控制屬性可以列舉 enumerable 改為true 就可以參與遍歷了 預設值false writable: true, // 控制屬性可以被修改 預設值false configurable: true, // 控制屬性可以被刪除 預設值false get // 當有人讀取 prop 的時候 get函式就會呼叫,並且返回就是 sss 的值 set // 當有人修改 prop 的時候 set函式就會呼叫, 有個引數這個引數就是修改後的值

Object.defineProperty 能定義symbol型別嗎? 在ES6中,由於 Symbol型別的特殊性,用Symbol型別的值來做物件的key與常規的定義或修改不同,而Object.defineProperty 是定 義key為Symbol的屬性的方法之一。

vue2和vue3的響應式原理都有什麼區別呢? vue2 用的是 Object.defindProperty 但是vue3用的是Proxy Object.defindProperty雖然能夠實現雙向綁定了,但是還是有缺點,只能對物件的屬性進行資料劫持,所以會深度遍歷整個物件,不管層級有多深,只要陣列中巢狀有物件,就能監聽到物件的資料變化無法監聽到陣列的變化,Proxy就沒有這個問題,可以監聽整個物件的資料變化,所以用vue3.0會用Proxy代替definedProperty。

上面就是一個典型的例子,當我們點選按鈕想要根據陣列 arr 的下標改變其元素的時候,你會發現 data 中的資料改變了,但是頁面中的資料並沒有改變。 我會用 this.$set( target, key, value ) 來解決 引數: {Object | Array} target {string | number} propertyName/index {any} value 第一引數時指定要修改的資料 (target) 第二個引數就是你要設定資料的下標或者是屬性名 第三個引數就是現在要修改的資料 (重新賦的值) 改變/新增 物件屬性的時候:this.$set(data 例項,"屬性名(新增的屬性名)","屬性值(新增的屬性值)") 改變/新增 陣列屬性的時候:this.$set(data 例項,陣列下標,"改變後的元素(新增的元素)")

原因 : vue在建立例項的時候把data深度遍歷所有屬性,並使用 Object.defineProperty 把這些屬性全部轉為 getter/setter。讓 Vue 追蹤依賴,在屬性被訪問和修改時通知變化。所以屬性必須在 data 物件上存在才能讓 Vue 轉換它,這樣才能讓它是響應的。

為什麼要用 this.$set 呢? this.$set是幹什麼的? 當你發現你給物件加了一個屬性,在控制檯能打印出來,但是卻沒有更新到檢視上時,也許這個時候就需要用到this.$set()這個方法了,簡單來說this.$set的功能就是解決這個問題的啦。官方解釋:向響應式物件中新增一個屬性,並確保這個新屬性同樣是響應式的,且觸發檢視更新。它必須用於向響應式物件上新增新屬性,因為 Vue 無法探測普通的新增屬性 (比如 this.myObject.newProperty = 'hi'),你會發現vue官網是vue.set,vue.set的用法

那 Vue.set 和 this.$set 有什麼區別 ? Vue.set( ) 是將 set 函式繫結在 Vue 建構函式上,this.$set() 是將 set 函式繫結在 Vue原型上。