vue3框架的響應式依賴追蹤機制

當存在一個響應式變量于視圖中發生改變時會更新當前組件的所以視圖顯示,但是沒有視圖中不寫這個響應式變量就就算修改該變量也不會修改視圖,這是為什么?我們能否可以理解寬泛的理解為vue組件的更新就是視圖的更新,單當視圖中不存在響應式變量時,就算組件數據更新,視圖也不會更新,確實,我們發現在Vue3中,組件的更新與視圖更新的關系需要結合響應式依賴追蹤機制來理解。我們的觀察是正確的:當響應式變量未被組件渲染邏輯依賴時,即使變量被修改,視圖也不會更新。以下是具體原因和機制分析:


核心原理:依賴追蹤與渲染觸發

  1. 響應式系統的觸發條件
    Vue3通過Proxy代理數據,當組件渲染時(如模板解析、計算屬性計算等),會自動進行依賴收集。只有被訪問過的響應式變量才會被記錄為依賴。
    ? 示例:若模板中使用了{{ count }}count會被標記為依賴;若未使用,則不會被追蹤。

  2. 視圖更新的觸發邏輯
    當響應式變量被修改時,Vue會檢查該變量是否仍有活躍的依賴(即是否被當前組件或子組件使用)。若無依賴,則不會觸發視圖更新。
    ? 示例:若父組件修改了傳遞給子組件的非響應式數據,但子組件未使用該數據,子組件視圖不會更新。


具體場景分析

場景1:響應式變量在模板中被使用
<template><div>{{ count }}</div> <!-- count被訪問,觸發依賴收集 -->
</template>
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>

? 修改count:Vue檢測到count被訪問過,觸發依賴更新,視圖重新渲染。

場景2:響應式變量未被模板使用
<script setup>
import { ref } from 'vue';
const count = ref(0);
// 僅在JavaScript邏輯中修改,未在模板中使用
count.value = 1;
</script>

? 修改count:由于count未被渲染邏輯依賴,Vue不會觸發視圖更新。

示例:

<!-- 父組件A -->
<template><div class="wrapper">A</div>{{ list }}<hr><B :list="list"></B>
</template><script setup>
import { ref } from 'vue';
import B from './B.vue';
let list = [1,2,3,4,5,6,7,8,9,10];
let count = ref(0);
setTimeout(()=>{list = [1,2,3,4,5,6,7,8,9,10].reverse();console.log("func",list);count.value = 1;
},2000)
</script><!-- 子組件B -->
<template><div class="wrapper">B</div>{{ props.list }}<hr>
</template><script setup>
import { onBeforeMount ,defineProps} from 'vue';
let props = defineProps(['list','count']);
setTimeout(() => {console.log("三秒后",props.list)console.log(props.count);
}, 3000);
</script>

關鍵結論

  1. 組件更新 ≠ 視圖更新
    組件內部數據變化屬于組件更新,但只有當數據被渲染邏輯依賴時,才會觸發視圖更新。

  2. 單向數據流與顯式依賴
    Vue遵循單向數據流原則,視圖更新必須通過響應式依賴顯式觸發。若需強制更新視圖,可使用$forceUpdate(),但應盡量避免。


最佳實踐

  1. 始終通過模板或計算屬性使用響應式數據,確保依賴關系清晰。
  2. 避免直接修改非響應式數據,需通過事件或v-model同步更新。
  3. 使用watchcomputed處理復雜邏輯,確保數據變化被正確追蹤。

總結

Vue的視圖更新嚴格依賴響應式依賴追蹤,而非組件內部數據變化的簡單同步。理解這一機制有助于避免常見更新問題,提升開發效率。

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

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

相關文章

C#核心(22)string

前言 我們在之前的學習中已經學習過了很多數字類型的數據結構,但一直沒有講解除了char以外的字符串相關的知識點,這也是我們繼繼承,封裝,重載這些知識點之后要補充講解的核心知識點。 你也發現了,其實在密封函數之后我們就已經開始進入更底層的方面為你講解知識點了,這…

Spring Boot 本地緩存工具類設計與實現

在 Spring Boot 應用中&#xff0c;緩存是提升性能的重要手段之一。為了更方便地使用緩存&#xff0c;我們可以設計一套通用的本地緩存工具類&#xff0c;封裝常見的緩存操作&#xff0c;簡化開發流程。本文將詳細介紹如何設計并實現一套 Spring Boot 本地緩存工具類&#xff0…

引領變革!北京愛悅詩科技有限公司榮獲“GAS消費電子科創獎-產品創新獎”!

在2025年“GAS消費電子科創獎”評選中&#xff0c;北京愛悅詩科技有限公司提交的“aigo愛國者GS06”&#xff0c;在技術創新性、設計創新性、工藝創新性、智能化創新性及原創性五大維度均獲得評委的高度認可&#xff0c;榮獲“產品創新獎”。 這一獎項不僅是對愛悅詩在消費電子…

考研英語語法全攻略:從基礎到長難句剖析?

引言 在考研英語的備考之旅中,語法猶如一座燈塔,為我們在浩瀚的英語知識海洋中指引方向。無論是閱讀理解中復雜長難句的解讀,還是寫作時準確流暢表達的需求,扎實的語法基礎都起著至關重要的作用。本文將結合有道考研語法基礎入門課的相關內容,為大家全面梳理考研英語語法…

構建自己的AI客服【根據用戶輸入生成EL表達式】

要實現一個基于對話形式的AI客服系統&#xff0c;該系統能夠提示用戶輸入必要的信息&#xff0c;并根據用戶的輸入生成相應的EL&#xff08;Expression Language&#xff09;表達式編排規則&#xff0c;您可以按照以下步驟進行設計和開發。本文將涵蓋系統架構設計、關鍵技術選型…

【JavaWeb12】數據交換與異步請求:JSON與Ajax的絕妙搭配是否塑造了Web的交互革命?

文章目錄 &#x1f30d;一. 數據交換--JSON??1. JSON介紹??2. JSON 快速入門??3. JSON 對象和字符串對象轉換??4. JSON 在 java 中使用??5. 代碼演示 &#x1f30d;二. 異步請求--Ajax??1. 基本介紹??2. JavaScript 原生 Ajax 請求??3. JQuery 的 Ajax 請求 &a…

解決CentOS 8.5被惡意掃描的問題

CentOS 8 官方倉庫已停止維護(EOL),導致一些常用依賴包如fail2ban 無法正常安裝。 完整解決方案: 一、問題根源 CentOS 8 官方倉庫已停更:2021 年底 CentOS 8 停止維護,默認倉庫的包可能無法滿足依賴關系。EPEL 倉庫兼容性:EPEL 倉庫可能未適配 CentOS 8.5 的舊版本依賴…

使用格式工廠提取視頻中的音頻

選擇輸出格式&#xff1a;在格式工廠的左側功能欄中&#xff0c;點擊 “音頻” 選項&#xff0c;會展開多種音頻格式&#xff0c;根據自己的需求選擇如 “MP3”“WAV”“WMA” 等作為輸出格式。添加視頻文件&#xff1a;點擊 “添加文件” 按鈕&#xff0c;在彈出的文件瀏覽器中…

前端雜的學習筆記

什么是nginx Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器 Nginx是一款輕量級的Web 服務器/反向代理服務器&#xff0c;處理高并發能力是十分強大的&#xff0c;并且支持熱部署&#xff0c;啟動簡單&#xff0c;可以做到7*24不間斷運行 正代和反代 學習nginx&a…

玩轉ChatGPT:GPT 深入研究功能

一、寫在前面 民間總結&#xff1a; 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么&#xff0c;ChatGPT呢&#xff1f; 看Deep Research&#xff08;深入研究&#xff09;功能。 對于科研狗來說&#xff0c;在這個文章爆炸的時代&#xff0c;如何利用AI準確、高效地收…

RabbitMQ 2025/3/5

高性能異步通信組件。 同步調用 以支付為例&#xff1a; 可見容易發生雪崩。 異步調用 以支付為例&#xff1a; 支付服務當甩手掌柜了&#xff0c;不管后面的幾個服務的結果。只管庫庫發&#xff0c;后面那幾個服務想取的時候就取&#xff0c;因為消息代理里可以一直裝&#x…

Win10 訪問 Ubuntu 18 硬盤

目錄 方案一&#xff1a;使用Samba共享服務Ubuntu 18 端配置Windows 10 端訪問 方案二&#xff1a;使用 SSHFS&#xff08;需在 Windows 上安裝 SSH 客戶端&#xff09;Ubuntu 18 端配置Windows 10 端配置 方案三&#xff1a;使用 FTP 服務Ubuntu 18 端配置Windows 10 端訪問 方…

Android15使用FFmpeg解碼并播放MP4視頻完整示例

效果: 1.編譯FFmpeg庫: 下載FFmpeg-kit的源碼并編譯生成安裝平臺庫 2.復制生成的FFmpeg庫so文件與包含目錄到自己的Android下 如果沒有prebuiltLibs目錄,創建一個,然后復制 包含目錄只復制arm64-v8a下

Hadoop、Hive、Spark的關系

Part1&#xff1a;Hadoop、Hive、Spark關系概覽 1、MapReduce on Hadoop 和spark都是數據計算框架&#xff0c;一般認為spark的速度比MR快2-3倍。 2、mapreduce是數據計算的過程&#xff0c;map將一個任務分成多個小任務&#xff0c;reduce的部分將結果匯總之后返回。 3、HIv…

計算機網絡篇:基礎知識總結與基于長期主義的內容更新

基礎知識總結 和 MySQL 類似&#xff0c;我同樣花了一周左右的時間根據 csview 對計算機網絡部分的八股文進行了整理&#xff0c;主要的內容包括&#xff1a;概述、TCP 與 UDP、IP、HTTP&#xff0c;其中我個人認為最重要的是 TCP 這部分的內容。 在此做一篇目錄索引&#xf…

[密碼學實戰]Java實現國密TLSv1.3單向認證

一、代碼運行結果 1.1 運行環境 1.2 運行結果 1.3 項目架構 二、TLS 協議基礎與國密背景 2.1 TLS 協議的核心作用 TLS(Transport Layer Security) 是保障網絡通信安全的加密協議,位于 TCP/IP 協議棧的應用層和傳輸層之間,提供: ? 數據機密性:通過對稱加密算法(如 AE…

09 HarmonyOS NEXT 仿uv-ui Tag組件開發教程系列(三)

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 文章目錄 Tag組件實戰應用與最佳實踐1. 復雜場景應用1.1 標簽篩選系統 2. 性能優化實踐2.1 狀態管理優化2.2 渲染性能優化 3. 實用功能擴展3.1 拖拽…

clickhouse查詢效率低

《關于ClickHouse查詢效率低的探討》 在數據處理的世界里&#xff0c;數據庫扮演著至關重要的角色。ClickHouse是一款專為在線分析處理&#xff08;OLAP&#xff09;設計的列式存儲數據庫管理系統。它因其快速的數據寫入和查詢速度而聞名&#xff0c;尤其適合處理海量數據。如…

Linux系統基于ARM平臺的LVGL移植

軟硬件介紹&#xff1a;Ubuntu 20.04 ARM 和&#xff08;Cortex-A53架構&#xff09;開發板 基本原理 LVGL圖形庫是支持使用Linux系統的Framebuffer幀緩沖設備實現的&#xff0c;如果想要實現在ARM開發板上運行LVGL圖形庫&#xff0c;那么就需要把LVGL圖形庫提供的關于幀緩沖設…

【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用

【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用 1.使用openai調用高德地圖API概述2. 高德接口調用申請3.實現代碼(多個function調用,多輪對話)4.執行結果1.使用openai調用高德地圖API概述 任務描述:使用openai調用高德地圖API,實現用戶問地理有關的…