vue監聽數據時 newValue, oldValue操作處理

要只存入新更改的數據,可以在 watch 的回調函數中進行比較,篩選出有變化的屬性并將其存入新數組。以下是一個示例代碼,假設要監聽的對象為 obj:

data() {return {differenceArray: [], obj: { /* 對象的初始屬性 */ }};
},
computed:{newObj(){return JSON.parse(JSON.stringify(this.obj)); }
},
watch:{newObj:{handler(newValue, oldValue){const changedProperties = Object.entries(newValue).filter(([key, value]) => value!== oldValue[key]); this.differenceArray.push(...changedProperties.map(([key, value]) => ({ key, value }))); },deep:true}
}

在上述代碼中,使用 Object.entries() 獲取對象的所有屬性鍵值對。通過 filter() 方法篩選出在新值和舊值中不相等的屬性。然后,使用 map() 方法將這些變化的屬性轉換為包含 key(屬性名)和 value(新更改后的值)的對象,并使用擴展運算符 … 將這些對象添加到 differenceArray 數組中。
這樣,differenceArray 數組中就只會存儲實際發生更改的屬性及其新值。
如果監聽的是數組,可以類似地進行處理。例如,對于數組 arr:

data() {return {differenceArray: [], arr: [ /* 數組的初始元素 */ ]};
},
computed:{newArr(){return [...this.arr]; }
},
watch:{newArr:{handler(newValue, oldValue){const changedIndices = newValue.reduce((indices, value, index) => {if (value!== oldValue[index]) {indices.push(index); }return indices;}, []); changedIndices.forEach(index => {this.differenceArray.push({ index, value: newValue[index] }); });},deep:true}
}

在這個示例中,通過遍歷新數組和舊數組,找出值不相同的索引位置,并將這些索引存到 changedIndices 數組中。然后,遍歷 changedIndices,將對應的索引和新值作為對象添加到 differenceArray 數組中。

要解決 newVal 和 oldVal 一樣的問題,并將新更改的數據存入 differenceArray 數組,可以使用 Vue 的 watch 選項中的 deep: true 來深度監聽對象的變化。以下是修改后的代碼示例:

watch: {newEditTableVariables: {handler(newValue, oldValue) {this.differenceArray = []; // 遍歷 newValue 中的每個項目newValue.forEach(item => {// 在 oldValue 中找到對應的項目const oldItem = oldValue.find(idx => idx.value === item.value); // 如果沒有找到對應的舊項目,或者找到的舊項目與新項目不同,則將新項目添加到 differenceArray 中if (!oldItem || JSON.stringify(oldItem)!== JSON.stringify(item)) { this.differenceArray.push(item);}});console.log(this.differenceArray);},deep: true, // 深度監聽對象內部屬性的變化immediate: true // 立即執行 handler 函數}
}

在上述代碼中,使用 JSON.stringify() 來比較新舊項目是否全等。通過深度監聽,當 newEditTableVariables 對象內部的屬性發生變化時,handler 函數會被觸發。然后,通過遍歷 newValue 并與 oldValue 進行比較,將有差異的項目添加到 differenceArray 數組中。
注意,直接修改對象的屬性可能無法觸發響應式更新,導致 watch 監聽不到變化。如果 newEditTableVariables 是一個復雜的對象,確保在對象內部屬性發生變化時,使用 Vue 提供的方法(例如 Vue.set() 或數組的變異方法)來進行修改,以確保響應式系統能夠正確檢測到變化。另外,添加 immediate: true 是為了在初始化時立即執行一次 handler 函數,以便獲取初始值和后續變化的比較。
如果 newEditTableVariables 是一個數組,并且你使用了一些可能導致 Vue 無法檢測到數組變化的方式(例如直接通過索引修改數組元素),則需要使用 Vue 提供的數組變異方法,如 splice() 等,來確保變化能夠被正確監聽。例如:

this.$set(this.newEditTableVariables, index, newValue); 
// 或使用 splice 方法
this.newEditTableVariables.splice(index, 1, newValue); 
watch: {newEditTableVariables: {handler(newValue, oldValue) {this.differenceArray = []; // 遍歷 newValue 中的每個項目newValue.forEach(item => {// 在 oldValue 中找到對應的項目const oldItem = oldValue.find(idx => idx.value === item.value); // 如果沒有找到對應的舊項目,或者找到的舊項目與新項目不同,則將新項目添加到 differenceArray 中if (!oldItem || JSON.stringify(oldItem)!== JSON.stringify(item)) { this.differenceArray.push(item);}});console.log(this.differenceArray);},deep: true, // 深度監聽對象內部屬性的變化immediate: true // 立即執行 handler 函數}
} 

這段代碼是 Vue 中 watch 選項的使用示例,用于監聽 newEditTableVariables 對象的變化。
以下是對代碼的詳細解釋:
watch:Vue 提供的用于監聽數據變化的選項。
newEditTableVariables:要監聽的數據源。
handler(newValue, oldValue):當數據源發生變化時觸發的回調函數。接收兩個參數:newValue 表示變化后的新值,oldValue 表示變化前的舊值。
在回調函數內部:
this.differenceArray = []:初始化一個空數組 differenceArray,用于存儲變化的差異數據。
通過 newValue.forEach(item => {…}) 遍歷 newValue 中的每個項目。
在內部的嵌套循環中,使用 oldValue.find(idx => idx.value === item.value) 在 oldValue 中查找與當前 item 的 value 屬性相等的項目,并將其賦值給 oldItem。
通過條件判斷 if (!oldItem || JSON.stringify(oldItem)!== JSON.stringify(item)) 來檢查是否沒有找到對應的舊項目,或者找到的舊項目與新項目不相等(使用 JSON.stringify 進行序列化比較)。如果滿足條件,說明有差異,就將當前項目 item 使用 this.differenceArray.push(item) 添加到 differenceArray 數組中。
deep: true:表示進行深度監聽。當 newEditTableVariables 是一個復雜的嵌套對象時,啟用深度監聽可以確保對象內部屬性的變化也能被監聽到。
immediate: true:表示立即執行 handler 函數。即使在初始化時,newEditTableVariables 的值沒有發生變化,也會立即執行一次 handler 函數,將初始值作為 oldValue 傳入,方便進行一些初始的處理或比較。
總體來說,這段代碼的目的是在 newEditTableVariables 對象發生變化時,找出變化的差異部分并存儲在 differenceArray 數組中,以便后續使用或處理這些差異數據。通過深度監聽和立即執行的設置,能夠更全面地捕捉和處理對象的變化情況。
如果你發現這段代碼中存在“無用的數據”,可能是指在實際使用中,newEditTableVariables 對象中的某些數據或屬性并不是你真正關心的差異部分。要解決這個問題,你可以根據具體的業務需求,進一步優化差異比較的邏輯。例如,只比較特定的屬性、或者針對特定類型的數據進行特殊處理等。
例如,如果你只想比較對象中某些特定屬性的變化,可以修改比較條件:

if (!oldItem || oldItem.specificProperty!== item.specificProperty) { this.differenceArray.push(item);
}

其中 specificProperty 替換為你實際想要比較的屬性名。
或者,如果對象中的數據結構比較復雜,可能需要根據具體情況設計更復雜的差異比較算法,以準確獲取你所需的差異數據。

以上就是文章全部內容了,如果喜歡這篇文章的話,還希望三連支持一下,感謝!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39955.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39955.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java數據結構集合復習之包裝類和泛型

前言: 這是我最一年學習java的一部分的回顧總結 1.包裝類 在Java中,由于基本類型不是繼承自Object,為了在泛型代碼中可以支持基本類型,Java給每個基本類型都對應了一個包裝類型。 1.1基本數據類型和對應的包裝類 ----—基本數據類型包裝類…

ubuntu軟件源的兩種格式和環境變量

1. ubuntu的/etc是什么目錄? 在Ubuntu操作系統中,/etc/是一個特殊的目錄,它包含系統的配置文件。這些配置文件用于設置各種系統和應用程序的參數和選項。 一般來說,用戶可以在這個目錄下找到各種重要的配置文件,如網絡…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括為以下幾點,Web3 ETF仍是一項新興投資產品,其長期表現仍存在不確定性。投資者在投資Web3 ETF之前應仔細研究相關風險,并做好充分的風險評估。北京木奇移動技術有限公司,專業的軟件外包開發公司&#xf…

商務辦公優選!AOC Q27E3S2商用顯示器,打造卓越新體驗!

摘要:助辦公室一族縱橫職場,實現高效舒適辦公! 在日常商務辦公中,對于辦公室一族來說總有太多“難難難難難點”:工作任務繁瑣,熬夜加班心力交瘁、長時間伏案工作導致頸椎、眼睛等出現問題,職業…

BBA車主,千萬別去試駕問界M9

文 | AUTO芯球 作者 | 雷慢&響鈴 我勸你啊,千萬別去試駕問界M9, 不然啊,可能1個小時50萬就沒了, 不信你看這個“大冤種”, 他曾經發誓打死不買電車, 考慮了三、四年換寶馬X5, 結果談完…

GNU/Linux - 如何編譯kernel

使用 make 命令構建 Linux 內核涉及多個步驟。下面是整個過程的基本概述: 1. 獲取內核源代碼 * 從 kernel.org 或你的發行版軟件倉庫下載內核源代碼。 * 將源代碼解壓縮到一個目錄中。 2. 配置內核 * 切換到內核源代碼目錄。 * 可選擇清理源代碼樹:mak…

前端面試題5(前端常見的加密方式)

前端常見的加密方式 在前端進行數據加密主要是為了保護用戶的隱私和提升數據傳輸的安全性。前端數據加密可以采用多種方法,以下是一些常見的加密技術和方法: 1. HTTPS 雖然不是直接的前端加密技術,但HTTPS是保障前端與后端數據傳輸安全的基…

關于MCU-Cortex M7的存儲結構(flash與SRAM)

MCU并沒有DDR,所以他把代碼存儲在flash上,臨時變量和棧運行在SRAM上。之所以這么做是因為MCU的cpu頻率很低,都是幾十MHZ到一二百MHZ,flash的讀取速度能夠滿足cpu 的取指需求,但flash 的寫入速度很慢,所以引…

剛辦理的手機號被停用,你可能遇到這些問題了!

很多朋友都會遇到手機號被停用的情況,那么你知道你的手機號為什么會被停用嗎?接下來,關于手機號被停用的問題,跟著小編一塊來了解一下吧。 ?停機的兩種形態: 1、第一個是局方停機,即語音、短信和流量都不…

xmind2testcase工具將測試用例從Xmind轉為CSV導入禪道

使用xmind編寫測試用例,使用xmind2testcase工具將測試用例從Xmind轉為CSV導入禪道,便于管理。 1.工具準備 第一步:安裝python 第二步:安裝xmind2testcase工具 運行-cmd-打開命令提示符彈窗,輸入安裝命令 安裝命令&…

意圖數據集HWU、Banking預處理

當談到意圖數據集時,HWU、Banking和Clinc是三個常見的數據集。以下是關于這三個數據集的介紹: 目錄 一、數據集介紹 HWU數據集 Banking數據集 Clinc數據集 二、數據集預處理 數據處理 數據存儲 數據類別分析 句子長度統計 一、數據集介紹 HW…

嵌入式硬件電路常用設計軟件

目錄 1. Cadence Allegro 2. PADS 3. Altium Designer 4. Multisim 5. Protues 1. Cadence Allegro 功能: Cadence Allegro是Cadence公司推出的先進PCB(Printed Circuit Board,印刷電路板)設計布線工具,也是目前…

華為HCIP Datacom H12-821 卷26

1.單選題 在VRRP中,同一備份組的設備在進行VRRP報文認證時,以下哪一參數不會影響Master設備和Backup設備認證協商結果 A、認證字 B、優先級 C、認證方式 D、VRRP版本 正確答案: B 解析: 優先級只會影響誰是主誰是備&…

AI產品經理能力模型的重點素質:人文素養和靈魂境界

在AI產品經理的能力模型中,我最想提的差異化關鍵點,就是“人文素養和靈魂境界”。 1 為什么“人文素養和靈魂境界”非常重要? 一、“人文素養和靈魂境界”如何影響AI產品設計? 例1:面對一個具體的AI場景&#xff0…

25考研,數二全程跟的張宇老師請問660(做了一半)880和張宇1000題應該怎么選擇?

跟張宇老師,也可以做其他的題集,不一定非要做1000題 我當初考研復習的時候,也聽了張宇老師的課程,但是我并沒有做1000題 因為1000題對于我來說太難了。做了一章之后,就換成其他的題目了。 對于大家來說,…

【機器學習實戰】Baseline精讀筆記

比賽用到的庫 numpy:提供(多維)數組操作 pandas:提供數據結構、數據分析 catboost:用于機器學習的庫,特別是分類和回歸任務 sklearn.model_selection:包含模型選擇的多種方法,如交…

Android 監聽網絡狀態變化(無切換中間態版)

需求: 獲取當前的網絡狀態與類型(WIFI、數據流量)監聽網絡狀態真正變化監聽網絡類型發生變化 業務場景: 用戶打開 App 時、使用過程中,出現無網絡時,顯示 Toast 提示。但當 wifi、數據流量 互相切換的過…

ppt接單渠道大公開??

PPT 接單主要分兩種:PPT 模板投稿和PPT 定制接單,我們先從簡單的 PPT 模板投稿說起。 PPT 模板投稿 利用業余時間,做一些 PPT 模板上傳到平臺,只要有人下載你的模板,你就有收入。如果模板質量高,簡直就是一…

【設計模式】觀察者模式(定義 | 特點 | Demo入門講解)

文章目錄 定義結構Demo | 代碼Subject目標類Observer抽象觀察者觀察者1 | CPU監聽器觀察者2 | 內存監聽器客戶端 | Client 優點適合場景 定義 所謂觀察者模式就是你是被觀察的那個對象,你爸爸媽媽就是觀察者,一天24h盯著你,一旦你不聽話&…

【BUUCTF-PWN】7-[第五空間2019 決賽]PWN5

參考:BUU pwn [第五空間2019 決賽]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客園 (cnblogs.com) 格式化字符串漏洞原理詳解_printf 任意內存讀取-CSDN博客 32位小端排序,有棧溢出保護 運行效果: 查看main函數 存在格式化字符串漏洞 輸…