Vue 2 的響應式 API 和 Vue 3 的組合式 API 的詳細對比,從核心機制、使用方式、代碼示例及優缺點展開

以下是 Vue 2 的響應式 API 和 Vue 3 的組合式 API 的詳細對比,從核心機制、使用方式、代碼示例及優缺點展開:
在這里插入圖片描述


1. Vue 2 的響應式 API

核心機制
  • 基于 Object.defineProperty
    • 通過劫持對象的 gettersetter 實現數據變化追蹤。
    • 限制:無法檢測屬性的添加/刪除,且不支持數組的某些變異操作(如直接修改索引 arr[0] = ...)。
主要 API
功能實現方式示例
聲明響應式數據data 對象或 Vue.set/this.$set 添加屬性```javascript

data() { return { count: 0 }; }
```
              |

| 計算屬性 | computed 對象 | javascript <br>computed: { fullName() { return this.firstName + this.lastName; } }<br>
|
| 偵聽器 | watch 對象或 this.$watch 方法 | javascript <br>watch: {<br> count: (newVal) => console.log(newVal)<br>}<br>
|
| 方法 | methods 對象 | javascript <br>methods: { increment() { this.count++; } }<br>
|

生命周期鉤子
  • 分散在 Options 中:如 created, mounted, beforeDestroy 等。

2. Vue 3 的組合式 API

核心機制
  • 基于 Proxy
    • 全局響應式追蹤,支持檢測屬性的增刪改,且無需 Vue.set
    • 優勢:更高效、更靈活,支持 for...in 遍歷和數組變異操作。
核心函數
函數用途示例
reactive將對象轉為響應式(返回 Proxy)```javascript

const state = reactive({ count: 0 });
```
          |

| ref | 將基本類型轉為響應式(返回一個 .value 對象) | javascript <br>const count = ref(0);<br>
|
| computed | 聲明計算屬性(返回響應式引用) | javascript <br>const fullName = computed(() => state.firstName + state.lastName);<br>
|
| watch | 監聽數據變化(支持更靈活的選項) | javascript <br>watch(count, (newVal) => console.log(newVal));<br>
|
| onMounted | 生命周期鉤子(組合式 API 形式) | javascript <br>onMounted(() => console.log('Mounted'));<br>
|

核心函數對比
功能Vue 2Vue 3說明
響應式數據data 對象reactive/refVue 3 需顯式聲明響應式,支持更靈活的類型(對象/基本類型)。
計算屬性computed 對象computed() 函數Vue 3 需通過函數聲明,返回值需手動返回到模板。
偵聽器watch 對象watch() 函數Vue 3 支持更靈活的選項(如 deep, immediate)。
方法methods 對象setup() 返回函數Vue 3 在 setup() 中定義方法并返回,無需 this

3. 組合式 API 核心特性

(1) setup() 函數
  • 入口點:所有邏輯集中在此函數中,替代 Options API 的分散選項。
  • 執行時機:在 beforeCreatecreated 之前執行。
  • 返回值:需返回一個對象,暴露給模板或子組件。
(2) ref vs reactive
函數適用場景示例
ref基本類型(如數字、字符串)或需要直接訪問值的場景```javascript

const count = ref(0);
console.log(count.value);
```
reactive復雜對象(如對象、數組)或需要直接操作屬性的場景```javascript

const state = reactive({ count: 0 });
console.log(state.count);
```
(3) 生命周期鉤子
  • 組合式形式:通過 onXXX 前綴的函數聲明(如 onMounted, onBeforeUnmount)。
  • 無需 this:直接在 setup() 中調用,無需通過 this 訪問。

4. 代碼示例對比

(1) 聲明響應式數據
// Vue 2(Options API)
export default {data() {return { count: 0 };}
};// Vue 3(組合式 API)
import { ref } from 'vue';export default {setup() {const count = ref(0);return { count };}
};
(2) 計算屬性
// Vue 2
export default {computed: {fullName() {return this.firstName + ' ' + this.lastName;}}
};// Vue 3
import { computed } from 'vue';export default {setup() {const state = reactive({firstName: 'John',lastName: 'Doe'});const fullName = computed(() => state.firstName + ' ' + state.lastName);return { fullName };}
};
(3) 生命周期
// Vue 2
export default {mounted() {console.log('Mounted');}
};// Vue 3
import { onMounted } from 'vue';export default {setup() {onMounted(() => console.log('Mounted'));return {};}
};

5. 對比總結表格

特性Vue 2Vue 3(組合式 API)優勢/差異
響應式核心Object.definePropertyProxyVue 3 支持屬性增刪和更靈活的數組操作。
數據聲明data 對象reactive/ref 顯式聲明Vue 3 需顯式聲明響應式,避免隱式問題。
計算屬性computed 對象computed() 函數Vue 3 更靈活,支持返回函數或對象。
偵聽器watch 對象watch() 函數Vue 3 支持更細粒度的選項(如 deep, flush)。
方法methods 對象setup() 返回函數Vue 3 邏輯集中,減少 Options 耦合。
生命周期鉤子分散在 Options 中onXXX 函數集中聲明Vue 3 鉤子名更規范(如 onMounted),無需 this
代碼復用Mixins(易沖突)自定義組合函數(無污染)組合式 API 更易復用且避免命名沖突。
模板綁定this.countcount(通過 ref)或 state.count(通過 reactiveVue 3 需通過 ref.valuereactive 對象訪問值。

6. 遷移建議

  1. 逐步遷移:在 Vue 2 項目中可通過 @vue/composition-api 漸進式引入組合式 API。
  2. 優先使用組合式 API:在新項目中推薦使用組合式 API,因其更靈活、可維護。
  3. 注意 refreactive 的區別:根據數據類型選擇合適的方式聲明響應式。
  4. 生命周期鉤子替換:Vue 3 的 setup() 會提前執行,需調整初始化邏輯順序。

如需更詳細示例,可參考 Vue 3 官方文檔。

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

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

相關文章

“八股訓練營”學習總結

在參加為期 40 天的八股訓練營的這段時間里&#xff0c;我收獲滿滿&#xff0c;不僅在知識技能上得到了提升&#xff0c;更在學習習慣和自我認知方面有了很大的進步。 在知識層面&#xff0c;訓練營涵蓋了網絡、數據庫、緩存以及python測試開發等多方面的知識點。 網絡方面&a…

Python對比兩張CAD圖并標記差異的解決方案

以下是使用Python對比兩張CAD圖并標記差異的解決方案&#xff0c;結合圖像處理和CAD結構分析&#xff1a; 一、環境準備與庫選擇 圖像處理庫&#xff1a;使用OpenCV進行圖像差異檢測、顏色空間轉換和輪廓分析。CAD解析庫&#xff1a;若為DXF格式&#xff0c;使用ezdxf解析實體…

記錄學習記錄學習《手動學習深度學習》這本書的筆記(九)

馬不停蹄地來到了第十二章&#xff1a;計算性能…… 感覺應該是講并行計算方面的&#xff0c;比如GPU、CPU、CUDA那些。 第十二章&#xff1a;計算性能 12.1 編譯器和解釋器 這里先提出了命令式編程和符號式編程的概念。 命令式編程VS符號式編程 目前為止&#xff0c;本書…

模板引擎語法-過濾器

模板引擎語法-過濾器 文章目錄 模板引擎語法-過濾器[toc]1.default過濾器2.default_if_none過濾器3.length過濾器4.addslashes過濾器5.capfirst過濾器6.cut過濾器7.date過濾器8.dictsort過濾器 1.default過濾器 default過濾器用于設置默認值。default過濾器對于變量的作用&…

make學習三:書寫規則

系列文章目錄 Make學習一&#xff1a;make初探 Make學習二&#xff1a;makefile組成要素 文章目錄 系列文章目錄前言默認目標規則語法order-only prerequisites文件名中的通配符偽目標 Phony Targets沒有 Prerequisites 和 recipe內建特殊目標名一個目標多條規則或多個目標共…

網絡安全技能大賽B模塊賽題解析Server12環境

已知靶機存在?站系統&#xff0c;使?Nmap?具掃描靶機端?&#xff0c;并將?站服務的端?號作為Flag &#xff08;形式&#xff1a;Flag字符串&#xff09;值提交 使用nmap掃描目標靶機網站服務的端口號為8089 Falg&#xff1a;8089 訪問?站/admin/pinglun.asp??&#…

1、Linux操作系統下,ubuntu22.04版本切換中英文界面

切換中英文界面的方法很多&#xff0c;我也是按照一個能用的方法弄過來并且記錄&#xff0c; 1.如果剛開始使用Ubuntu環境&#xff0c;桌面的語言環境為英文&#xff0c;需要安裝中文簡體的字體包 打開桌面終端&#xff0c;輸入 sudo apt install language-pack-zh-hans lan…

SmolVLM2: The Smollest Video Model Ever(六)

繼續微調 微調視頻的代碼如下&#xff1a; # 此Python文件用于對SmolVLM2進行視頻字幕任務的微調 # 導入所需的庫 import os os.environ["CUDA_VISIBLE_DEVICES"] "1" import torch from peft import LoraConfig, prepare_model_for_kbit_training, get…

Spring Boot安裝指南

&#x1f516; Spring Boot安裝指南 &#x1f331; Spring Boot支持兩種使用方式&#xff1a; 1?? 可作為常規Java開發工具使用 2?? 可作為命令行工具安裝 ?? 安裝前提&#xff1a; &#x1f4cc; 系統需安裝 Java SDK 17 或更高版本 &#x1f50d; 建議先運行檢查命令…

數據結構(七)---鏈式棧

#### 鏈式棧實現 ##### linkstack.h #ifndef _LINKSTACK_H #define _LINKSTACK_H // 引入相關的庫文件 #include <stdio.h> #include <stdlib.h> #include <string.h> // 定義元素類型的別名 typedef int DATA; //定義鏈式棧節點 typedef struct node { …

【Spring Boot】Maven中引入 springboot 相關依賴的方式

文章目錄 Maven中引入 springboot 相關依賴的方式1. 不使用版本管理&#xff08;不推薦&#xff09;2、使用版本管理&#xff08;推薦&#xff09;2.1 繼承 spring-boot-starter-parent2.2 使用 spring-boot-dependencies 自定義父工程2.3引入 spring-framework-bom Maven中引…

DataStreamAPI實踐原理——快速上手

引入 通過編程模型&#xff0c;我們知道Flink的編程模型提供了多層級的抽象&#xff0c;越上層的API&#xff0c;其描述性和可閱讀性越強&#xff0c;越下層API&#xff0c;其靈活度高、表達力越強&#xff0c;多數時候上層API能做到的事情&#xff0c;下層API也能做到&#x…

WPF 圖片文本按鈕 自定義按鈕

效果 上面圖片,下面文本 樣式 <!-- 圖片文本按鈕樣式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

驅動開發硬核特訓 · Day 22(上篇): 電源管理體系完整梳理:I2C、Regulator、PMIC與Power-Domain框架

&#x1f4d8; 一、電源子系統總覽 在現代Linux內核中&#xff0c;電源管理不僅是系統穩定性的保障&#xff0c;也是實現高效能與低功耗運行的核心機制。 系統中涉及電源管理的關鍵子系統包括&#xff1a; I2C子系統&#xff1a;硬件通信基礎Regulator子系統&#xff1a;電源…

設計模式全解析:23種經典設計模式及其應用

創建型模式 1. 單例模式&#xff08;Singleton Pattern&#xff09; 核心思想&#xff1a;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。適用場景&#xff1a;需要共享資源的場景&#xff0c;如配置管理、日志記錄等。 public class Singleton {// 靜態變量保存…

力扣熱題100題解(c++)—矩陣

73.矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 int m matrix.size(); // 行數int n matrix[0].size(); // 列數bool firstRowZero false; // 標記第一行是否包含 0bool f…

本地部署DeepSeek-R1(Dify升級最新版本、新增插件功能、過濾推理思考過程)

下載最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升級DIfy 下載最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我這里下載到老版本同一個目錄并解壓 拷貝老數據 需先停用老版本Dify PS D:\D…

PostSwigger Web 安全學習:CSRF漏洞3

CSRF 漏洞學習網站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服務端生成的唯一、隨機且不可預測的字符串&#xff0c;用于驗證客戶端合法校驗。 作用&#xff1a;防止攻擊…

用 Nodemon 解決 npm run serve 頻繁重啟服務

Nodemon 是一個基于 Node.js 構建的開發工具&#xff0c;專為幫助開發者自動監控項目文件的更改而設計。每當文件發生變更時&#xff0c;Nodemon 會自動重啟 Node.js 服務器&#xff0c;無需手動停止并重啟。這對于提升開發速度、減少人工操作非常有幫助&#xff0c;尤其適用于…

django admin 中更新表數據 之后再將數據返回管理界面

在Django中&#xff0c;更新數據庫中的數據并將其重新顯示在Django Admin界面上通常涉及到幾個步驟。這里我將詳細說明如何在Django Admin中更新表數據&#xff0c;并確保更新后的數據能夠立即在管理界面上顯示。 定義模型 首先&#xff0c;確保你的模型&#xff08;Model&…