摘要:提問深度與非深度的區別對象與數組與的區別的一個特點是,最初綁定的時候是不會執行的,要等到改變時才執行監聽計算。為一個對象,鍵是需要觀察的表達式,值是對應回調函數。值也可以是方法名,或者包含選項的對象適用場景一個數據影響多個數據。
提問
1.深度watch與非深度watch的區別;
2.watch對象與數組;
3.watch與computed的區別;
new Vue({ el: "#root", data: { firstName: "Dawei", lastName: "Lou", fullName: "" }, watch: { firstName(newName, oldName) { this.fullName = newName + " " + this.lastName; } } })FullName: {{fullName}}
FirstName:
watch 的一個特點是,最初綁定的時候是不會執行的,要等到 firstName 改變時才執行監聽計算。那我們想要一開始就讓他最初綁定的時候就執行改怎么辦呢?我們需要修改一下我們的 watch 寫法,修改過后的 watch 代碼如下:
watch: { firstName: { handler(newName, oldName) { this.fullName = newName + " " + this.lastName; }, // 代表在wacth里聲明了firstName這個方法之后立即先去執行handler方法 immediate: true } }
注意到handler了嗎,我們給 firstName 綁定了一個handler方法,之前我們寫的 watch 方法其實默認寫的就是這個handler,Vue.js會去處理這個邏輯,最終編譯出來其實就是這個handler。而immediate:true代表如果在 wacth 里聲明了 firstName 之后,就會立即先去執行里面的handler方法,如果為 false就跟我們以前的效果一樣,不會在綁定的時候就執行。
deep默認情況下 handler 只監聽obj這個屬性它的引用的變化,我們只有給obj賦值的時候它才會監聽到,比如我們在 mounted事件鉤子函數中對obj進行重新賦值,當需要監聽一個對象的改變時,普通的watch方法無法監聽到對象內部屬性的改變,此時就需要deep屬性對對象進行深度監聽。
watch: { obj: { handler(newName, oldName) { console.log("obj.a changed"); }, immediate: true, deep: true }
deep的意思就是深入觀察,監聽器會一層層的往下遍歷,給對象的所有屬性都加上這個監聽器,但是這樣性能開銷就會非常大了,任何修改obj里面任何一個屬性都會觸發這個監聽器里的 handler。
優化,我們可以是使用字符串形式監聽:
watch: { "obj.a": { handler(newName, oldName) { console.log("obj.a changed"); }, immediate: true, // deep: true } }注銷watch
為什么要注銷 watch?因為我們的組件是經常要被銷毀的,比如我們跳一個路由,從一個頁面跳到另外一個頁面,那么原來的頁面的 watch 其實就沒用了,這時候我們應該注銷掉原來頁面的 watch 的,不然的話可能會導致內置溢出。好在我們平時 watch 都是寫在組件的選項中的,他會隨著組件的銷毀而銷毀。
但是,如果我們使用下面這樣的方式寫 watch,那么就要手動注銷了,這種注銷其實也很簡單:
const unWatch = app.$watch("text", (newVal, oldVal) => { console.log(`${newVal} : ${oldVal}`); }) unWatch(); // 手動注銷watch
app.$watch調用后會返回一個值,就是unWatch方法,你要注銷 watch 只要調用unWatch方法就可以了。
watch與computed的區別computed:當頁面中有某些數據依賴其他數據進行變動的時候,可以使用計算屬性,需要注意的是,就算在data中沒有直接聲明出要計算的變量,也可以直接在computed中寫入。
computed: { fullName: function () { return this.firstName + " " + this.lastName } }
計算屬性默認只有getter,可以在需要的時候自己設定setter:
computed: { fullName: { // getter get: function () { return this.firstName + " " + this.lastName }, // setter set: function (newValue) { var names = newValue.split(" ") this.firstName = names[0] this.lastName = names[names.length - 1] } } }
這個時候在控制臺直接運行vm.fullName = ‘bibi wang’,相應的firstName和lastName也會改變。
適用場景:一個數據受多個數據影響。
watch:watch用于觀察和監聽頁面上的vue實例,當然在大部分情況下我們都會使用computed,但如果要在數據變化的同時進行異步操作或者是比較大的開銷,那么watch為最佳選擇。watch為一個對象,鍵是需要觀察的表達式,值是對應回調函數。值也可以是方法名,或者包含選項的對象
watch: { firstName: function (val) { this.fullName = val + " " + this.lastName }, lastName: function (val) { this.fullName = this.firstName + " " + val } }
適用場景:一個數據影響多個數據。
需要注意的是,computed是具有緩存的,這就意味著只要計算屬性的依賴沒有進行相應的數據更新,那么computed會直接從緩存中獲取值,多次訪問都會返回之前的計算結果。
版本號:V2.8.3
更新日期:2018-07-09
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104647.html
摘要:前言最近在學習計算屬性的源碼,發現和普通的響應式變量內部的實現還有一些不同,特地寫了這篇博客,記錄下自己學習的成果文中的源碼截圖只保留核心邏輯完整源碼地址可能需要了解一些響應式的原理版本計算屬性的概念一般的計算屬性值是一個函數,這個函數showImg(https://user-gold-cdn.xitu.io/2019/5/6/16a8b98f1361f6f6); 前言 最近在學習Vue計...
摘要:接下來要看看這個訂閱者的具體實現了實現訂閱者作為和之間通信的橋梁,主要做的事情是在自身實例化時往屬性訂閱器里面添加自己自身必須有一個方法待屬性變動通知時,能調用自身的方法,并觸發中綁定的回調,則功成身退。 本文能幫你做什么?1、了解vue的雙向數據綁定原理以及核心代碼模塊2、緩解好奇心的同時了解如何實現雙向綁定為了便于說明原理與實現,本文相關代碼主要摘自vue源碼, 并進行了簡化改造,...
摘要:插件開發前端掘金作者原文地址譯者插件是為應用添加全局功能的一種強大而且簡單的方式。提供了與使用掌控異步前端掘金教你使用在行代碼內優雅的實現文件分片斷點續傳。 Vue.js 插件開發 - 前端 - 掘金作者:Joshua Bemenderfer原文地址: creating-custom-plugins譯者:jeneser Vue.js插件是為應用添加全局功能的一種強大而且簡單的方式。插....
閱讀 855·2021-11-25 09:43
閱讀 3687·2021-11-19 09:40
閱讀 889·2021-09-29 09:34
閱讀 1799·2021-09-26 10:21
閱讀 880·2021-09-22 15:24
閱讀 4200·2021-09-22 15:08
閱讀 3278·2021-09-07 09:58
閱讀 2686·2019-08-30 15:55