Vue 3 中將 ref 創建的響應式對象數據轉換為普通(非響應式)的數據

Vue 3 中使用?ref?創建的響應式對象數據轉換為普通(非響應式)的數據,有以下幾種方法:

1. 訪問?.value?屬性:

這是最直接、最常見的方法。 由于?ref?對象的值存儲在其?.value?屬性中,直接訪問該屬性即可獲得普通數據。

<script setup>import { ref } from 'vue';
const myRef = ref({ name: 'John', age: 30 });// 獲取普通對象
const plainObject = myRef.value;console.log(plainObject); // { name: 'John', age: 30 }
console.log(typeof plainObject); // object// 修改 plainObject 不會影響 myRef
plainObject.name = 'Jane';console.log(myRef.value.name); // "John" (myRef 仍然是響應式的,沒有被修改)
console.log(plainObject.name); // "Jane"</script>
  • 優點:?簡單直接,易于理解。
  • 缺點:?如果你需要的是深拷貝,此方法只進行淺拷貝,修改?plainObject?的嵌套對象屬性仍然會影響?myRef

2. 使用展開運算符 (...) 進行淺拷貝:

如果你需要的是一個新的對象,并且避免修改原始的?ref?對象,可以使用展開運算符創建一個淺拷貝。

<script setup>import { ref } from 'vue';const myRef = ref({ name: 'John', age: 30, address: { city: 'New York' } });// 使用展開運算符進行淺拷貝const plainObject = { ...myRef.value };console.log(plainObject); // { name: 'John', age: 30, address: { city: 'New York' } }// 修改淺拷貝對象的屬性
plainObject.name = 'Jane';
console.log(myRef.value.name); // "John"
console.log(plainObject.name); // "Jane"// 修改嵌套對象屬性會影響 myRef,因為是淺拷貝
plainObject.address.city = 'Los Angeles';
console.log(myRef.value.address.city); // "Los Angeles" (仍然會影響 ref 對象)
console.log(plainObject.address.city); // "Los Angeles"</script>
  • 優點:?創建了一個新的對象,修改拷貝后的對象不會直接影響原始的?ref?對象。
  • 缺點:?仍然是淺拷貝。如果?ref?對象包含嵌套的對象或數組,修改拷貝后的對象的嵌套屬性仍然會影響原始的?ref?對象。

3. 使用?JSON.parse(JSON.stringify(obj))?進行深拷貝 (不推薦用于包含函數或 Symbol 的對象):

這是一種常用的創建深拷貝的方法,但不適用于包含函數、Symbol、循環引用的對象

<script setup>import { ref } from 'vue';const myRef = ref({ name: 'John', age: 30, address: { city: 'New York' } });// 使用 JSON.parse(JSON.stringify()) 進行深拷貝const plainObject = JSON.parse(JSON.stringify(myRef.value));console.log(plainObject); // { name: 'John', age: 30, address: { city: 'New York' } }// 修改深拷貝對象的屬性plainObject.name = 'Jane';plainObject.address.city = 'Los Angeles';console.log(myRef.value.name); // "John"
console.log(plainObject.name); // "Jane"
console.log(myRef.value.address.city); // "New York"
console.log(plainObject.address.city); // "Los Angeles"</script>
  • 優點:?可以創建深拷貝,完全隔離原始?ref?對象和拷貝對象。
  • 缺點:
    • 效率相對較低。
    • 無法復制函數、Symbol、undefined?和循環引用的對象。?函數會被忽略,Symbol 會丟失,undefined 會變成 null, 循環引用會報錯。
    • Date對象會被轉換成字符串。

4. 使用?lodash?的?_.cloneDeep()?函數 (推薦):

lodash?是一個流行的 JavaScript 工具庫,提供了很多實用的函數,包括深拷貝。

<script setup>
import { ref } from 'vue';
import _ from 'lodash'; // 需要安裝 lodash: npm install lodashconst myRef = ref({ name: 'John', age: 30, address: { city: 'New York' }, func: () => {} });// 使用 lodash 的 _.cloneDeep() 函數進行深拷貝const plainObject = _.cloneDeep(myRef.value);console.log(plainObject); // { name: 'John', age: 30, address: { city: 'New York' }, func: () => {} }// 修改深拷貝對象的屬性plainObject.name = 'Jane';plainObject.address.city = 'Los Angeles';plainObject.func = () => { console.log('new func') }; // 修改函數console.log(myRef.value.name); // "John"
console.log(plainObject.name); // "Jane"
console.log(myRef.value.address.city); // "New York"
console.log(plainObject.address.city); // "Los Angeles"
</script>
  • 優點:
    • 可以創建真正的深拷貝,包括函數和 Symbol (取決于 lodash 版本)。
    • 能夠處理循環引用。
    • 經過優化,性能通常比?JSON.parse(JSON.stringify())?更好。
  • 缺點:?需要安裝額外的庫 (lodash)。

5. 使用?structuredClone()?(現代瀏覽器):

structuredClone()?是一個現代瀏覽器提供的全局函數,用于創建深拷貝。

<script setup>import { ref } from 'vue';const myRef = ref({ name: 'John', age: 30, address: { city: 'New York' }, func: () => {} });// 使用 structuredClone() 進行深拷貝
const plainObject = structuredClone(myRef.value);console.log(plainObject);
// 修改深拷貝對象的屬性plainObject.name = 'Jane';
plainObject.address.city = 'Los Angeles';console.log(myRef.value.name); // "John"
console.log(plainObject.name); // "Jane"
console.log(myRef.value.address.city); // "New York"
console.log(plainObject.address.city); // "Los Angeles"</script>
  • 優點:

    • 內置于瀏覽器,無需安裝額外的庫。
    • 可以處理循環引用。
    • 支持多種數據類型,包括?DateRegExpMapSet?等。
  • 缺點:

    • 瀏覽器兼容性:不是所有瀏覽器都支持?structuredClone()?(舊版本的瀏覽器可能不支持). 需要 polyfill 。
    • 性能可能不如?lodash?的?_.cloneDeep(),具體取決于數據結構和瀏覽器實現。
    • 無法拷貝函數。?如果對象包含函數,函數屬性將會被設置為?null

總結:

  • 如果只需要訪問?ref?對象的值,直接使用?.value?即可。
  • 如果需要創建一個新的對象,并且不需要深拷貝,可以使用展開運算符 (...)。
  • 如果需要深拷貝,且對象不包含函數、Symbol、循環引用,可以使用?JSON.parse(JSON.stringify())?(但通常不推薦)。
  • 最推薦使用?lodash?的?_.cloneDeep()?函數進行深拷貝。?它功能強大,能夠處理多種情況,性能也不錯。
  • 如果你的目標環境都是現代瀏覽器,并且不需要拷貝函數,可以考慮使用?structuredClone()

選擇哪種方法取決于你的具體需求:

  • 是否需要創建一個新的對象?
  • 是否需要深拷貝?
  • 對象是否包含函數、Symbol、循環引用?
  • 性能要求如何?
  • 是否可以引入額外的庫?
  • 目標瀏覽器環境是什么?

根據這些因素,選擇最適合你的方法。 在大多數情況下,使用?lodash?的?_.cloneDeep()?是一個安全可靠的選擇。

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

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

相關文章

四月下旬系列

CUHKSZ 校賽 期中考試 DAY -1。 省流&#xff1a;前 1h 切 6 題&#xff0c;后 3h 過 1 題&#xff0c;讀錯一個本來很【】的題&#xff0c;被大模擬構造創【】了。 本地除了 VSCode 沒有 Extensions&#xff0c;別的和省選差不多。使用 DEVC。 前 6 題難度 < 綠&#x…

下采樣(Downsampling)

目錄 1. 下采樣的定義與作用?? ??2. 常見下采樣方法?? ??(1) 池化&#xff08;Pooling&#xff09;?? ??(2) 跨步卷積&#xff08;Strided Convolution&#xff09;?? ??(3) 空間金字塔池化&#xff08;SPP&#xff09;?? ??3. PyTorch 實現示例?? …

lottie深入玩法

A、json文件和圖片資源分開 delete 是json資源名字 /res/lottie/delete_anim_images是圖片資源文件夾路徑 JSON 中引用的圖片名&#xff0c;必須與實際圖片文件名一致 B、json文件和圖片資源分開&#xff0c;并且圖片加載不固定 比如我有7張圖片&#xff0c;分別命名1~7&…

高精度算法(加、減、乘、除、階乘和)?

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 唯有主動付出&#xff0c;才有豐富的果…

探索大語言模型(LLM):馬爾可夫鏈——從詩歌分析到人工智能的數學工具

提出背景與靈感起源 馬爾可夫鏈由俄國數學家安德雷馬爾可夫于1906年提出&#xff0c;最初是為了挑戰當時概率論中“獨立性假設”的局限性。他希望通過研究相依變量序列&#xff0c;證明即使隨機變量之間存在依賴關系&#xff0c;大數定律和中心極限定理仍然成立。 靈感來源&am…

【web服務_負載均衡Nginx】三、Nginx 實踐應用與高級配置技巧

一、Nginx 在 Web 服務器場景中的深度應用? 1.1 靜態網站部署與優化? 在 CentOS 7 系統中&#xff0c;使用 Nginx 部署靜態網站是最基礎也最常見的應用場景。首先&#xff0c;準備網站文件&#xff0c;在/var/www/html目錄下創建index.html文件&#xff1a; sudo mkdir -p…

C語言格式化輸入輸出總結 (printf和scanf)

一、printf格式化輸出 1. 整數格式化 (%d, %i, %u, %o, %x) c復制代碼 int num 42; // 以下為不同格式輸出示例 printf("%d", num); // 42 (十進制) printf("%i", num); // 42 (同%d) printf("%u", num); // 42 (無符號十進制…

哈夫曼編碼和哈夫曼樹

哈夫曼編碼&#xff08;Huffman Coding&#xff09; 是一種基于字符出現頻率的無損數據壓縮算法&#xff0c;通過構建哈夫曼樹&#xff08;Huffman Tree&#xff09; 來生成最優前綴編碼&#xff0c;使得高頻字符用短編碼&#xff0c;低頻字符用長編碼&#xff0c;從而實現高效…

Jetson Orin NX 部署YOLOv12筆記

步驟一.創建虛擬環境 conda create -n yolov12 python3.8.20 注意&#xff1a;YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 環境通用 步驟二.激活虛擬環境 conda activate yolov12 #激活環境 步驟三.查詢Jetpack出廠版本 Jetson系列平臺各型號支持的最高Jetp…

Linux指令篇 (2)

指令篇&#xff08;2&#xff09; Linux基本指令&#xff08;2&#xff09;(1) mkdir指令&#xff08;重要&#xff09;&#xff08;2&#xff09;rmdir指令&&rm指令(重要)&#xff08;3&#xff09;man指令(重要)&#xff08;4&#xff09;cp指令&#xff08;重要&…

致遠OA——自定義開發rest接口

文章目錄 :apple: 業務流程 &#x1f34e; 業務流程 代碼案例&#xff1a; https://pan.quark.cn/s/57fa808c823f 官方文檔&#xff1a; https://open.seeyoncloud.com/seeyonapi/781/https://open.seeyoncloud.com/v5devCTP/39/783.html 登錄系統 —— 后臺管理 —— 切換系…

區塊鏈如何成為智能城市的底層引擎?從數據透明到自動化治理

區塊鏈如何成為智能城市的底層引擎&#xff1f;從數據透明到自動化治理 引言&#xff1a;智能城市真的智能嗎&#xff1f; 在數字化時代&#xff0c;智能城市&#xff08;Smart City&#xff09;逐步成為各國推動城市創新的重要方向。城市管理者希望借助物聯網&#xff08;IoT…

洛谷P1177【模板】排序:十種排序算法全解(1)

扯談 之前我已經把十大排序算法全講了一遍&#xff08;具體詳見專欄C排序算法&#xff09;,今天我們來用一道簡單的題目總結實戰一下。 算法實現 一、桶排序&#xff08;Bucket Sort&#xff09; ?適用場景?&#xff1a;數據范圍已知且較小&#xff08;需根據測試數據調整…

SuperMap iClient3D for WebGL 如何加載WMTS服務

在 SuperMap iClient3D for WebGL 中加載WMTS服務時&#xff0c;參數配置很關鍵&#xff01;下面我們詳細介紹如何正確填寫參數&#xff0c;確保影像服務完美加載。 一、數據制作 對于上述視頻中的地圖制作&#xff0c;此處不做講述&#xff0c;如有需要可訪問&#xff1a;Onl…

再讀bert(Bidirectional Encoder Representations from Transformers)

再讀 BERT&#xff0c;仿佛在數字叢林中邂逅一位古老而智慧的先知。初次相見時&#xff0c;驚嘆于它以 Transformer 架構為羅盤&#xff0c;在預訓練與微調的星河中精準導航&#xff0c;打破 NLP 領域長久以來的迷霧。而如今&#xff0c;書頁間躍動的不再僅是 Attention 機制精…

從零開始 保姆級教程 Ubuntu20.04系統安裝MySQL8、服務器配置MySQL主從復制、本地navicat遠程連接服務器數據庫

從零開始&#xff1a;Ubuntu 20.04 系統安裝 MySQL 8、服務器配置 MySQL 主從復制、本地 Navicat 遠程連接服務器數據庫 初始化服務器1. 更新本地軟件包列表2. 安裝 MySQL 服務器3. 查看 MySQL 安裝版本4. 登錄 MySQL 管理終端5. 設置 root 用戶密碼&#xff08;推薦使用 nativ…

java怎么完善注冊,如果郵箱中途更換,能否判斷

解析在下面 附贈代碼 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存儲驗證碼&#xff08;郵箱 -> 驗證碼信息&#xff09;(保證線程安全) 以免中途更改郵箱pri…

n8n 中文系列教程_01. 簡單易懂的現代AI魔法,n8n的快速了解與概念科普(文末有彩蛋)

1. 教程簡介 歡迎來到“無代碼工具探索”課程&#xff0c;這是專為非技術人員設計的指南&#xff08;當然&#xff0c;技術人員也可以從中受益&#xff09;。我們的目標是通過無代碼工具來提升工作效率&#xff0c;尤其是利用像 n8n 這樣的靈活數據庫平臺。這些工具被譽為“現…

解碼 Web Service:從技術原理到應用場景的深度剖析

Web Service 是一種基于網絡的、分布式的計算技術&#xff0c;它允許不同的應用程序之間通過網絡進行通信和交互。以下是關于 Web Service 的詳細介紹&#xff1a; 一、定義與概念 Web Service 是一種可以通過 Web 協議&#xff08;如 HTTP&#xff09;進行訪問的軟件組件&am…

Nacos啟動報錯

Nacos啟動是在單機模式下&#xff0c;不是集群模式 點擊startup.cmd啟動會報錯 打開bin目錄 rem是注釋的意思&#xff0c;在nacos1.3.2之后&#xff0c;nacos默認的都是集群模式&#xff0c;我們這里單機測試就是用單機模式。 也可以修改MODE&#xff0c;如果選擇不修改&…