走進computed,了解computed的前世今生

computed(計算屬性)并不是vue獨創的,而是源自計算機科學和響應式編程的長期發展

計算理論的奠基:

  • 函數式編程的純函數思想:計算屬性的核心特征(無副作用、依賴輸入確定輸出)直接來源于函數式編程中的純函數概念
  • 響應式編程的衍生值:在響應式系統中,任何可以依據其他的“可觀察量”自動計算出的值都可以視為計算屬性

vue中computed的演進

vue 1.x時代:(2014-2016)
初步實現:通過 computed 選項定義計算屬性,基于依賴收集的響應式系統
特點:

  • 基于Object.defineProperty實現響應式
  • 計算屬性會被混入到Vue實例中,像普通屬性一樣訪問
  • 已具備緩存機制,依賴不變時直接返回緩存值

Vue 2.x 時代:(2016-2020)
優化改進:

  • 計算屬性的惰性求值:只在真正被訪問時才計算
  • 更精細的依賴追蹤:基于 Watcher 類的依賴收集系統
  • 支持 setter:允許通過賦值反向影響依賴項3
computed: {fullName: {get() { return this.firstName + ' ' + this.lastName },set(newValue) { /* 處理賦值邏輯 */ }}
}

Vue 3.x 時代(2020至今)
組合式 API 重構:

  • 引入 computed() 函數,可在 setup() 或 在 < script setup > 中使用
  • 基于 Proxy 的響應式系統,解決 Vue 2 的檢測限制
  • 與 Reactivity System 深度集成,性能顯著提升
import { computed } from 'vue'
const count = ref(1)
const double = computed(() => count.value * 2)

computed設計核心原理:

1、響應式依賴追蹤

  • 自動收集依賴:執行計算屬性時候,訪問的每個屬性都會被記錄依賴
  • 更新觸發:當任何屬性變化時候,標記計算屬性為“臟”dirty, 下次訪問時候再重新計算

2、緩存機制的實現

// 簡化的 computed 實現原理
function computed(getter) {let valuelet dirty = trueconst runner = effect(getter, {lazy: true,scheduler: () => {dirty = true // 依賴變化時標記為需要重新計算trigger(obj, 'value') // 觸發依賴此計算屬性的副作用}})const obj = {get value() {if (dirty) {value = runner() // 執行 getter 計算新值dirty = false}return value}}return obj
}

在vue中 同步派生狀態指的是基于現有響應式數據立即計算得出的新狀態,這種計算是同步完成的,具有即時性和準確性,這是computed計算屬性的核心設計理念

同步派生狀態的核心特征
1、即時計算:當依賴變化時候,派生值同步(立即)重新計算

const count = ref(1);
const double = computed(() => count.value * 2); // 同步計算
console.log(double.value); // 2
count.value = 3; 
console.log(double.value); // 6 (立即更新)

2、純函數特性:派生過程不允許修改外部狀態,僅依賴輸入:

// 純派生:結果僅取決于 count.value
const triple = computed(() => count.value * 3); 

3、與異步派生對比

特性同步派生 (computed)異步派生 (如 watch + 狀態)
執行時機立即完成延遲完成(需等待 Promise)
模板引用可直接使用需要處理加載中/錯誤狀態
響應式追蹤自動追蹤依賴需手動管理依賴
返回值必須返回無返回值(通過修改狀態輸出)

需要每次執行的邏輯

1、模板渲染的即時性需求:vue模板渲染需要同步獲取值進行渲染,異步派生會導致渲染中斷或需要額外的處理加載狀態
2、響應式系統的設計基礎:vue的響應式依賴追蹤依賴同步訪問
3、緩存優化前提:同步計算使得緩存機制能精準判斷是否需要重新計算

同步派生使用場景:

// 數據格式化
const price = ref(100);
const formattedPrice = computed(() => `¥${price.value.toFixed(2)}`);// 過濾/篩選列表
const todos = ref([/*...*/]);
const activeTodos = computed(() => todos.value.filter(todo => !todo.completed)
);// 多狀態組合
const width = ref(10);
const height = ref(20);
const area = computed(() => width.value * height.value);

同步派生的優勢:

  • 性能高效:基于依賴追蹤的精準緩存
  • 心智模型簡單:輸入輸出關系明確
  • 調試友好:無隱藏的異步時序問題
  • 組合方便:可安全地被其他計算屬性引用

vue中的“同步派生狀態”是通過computed來實現的即時性、確定性的數據轉換,它是vue響應式系統的核心支柱,這種設計確保了:

  • 模版渲染的即時性、可靠性
  • 狀態變化的可預測性
  • 派生邏輯的高效性

computed為什么會有緩存機制:

vue中的computed采用緩存機制主要是為了優化性能和保證一致性:當計算屬性依賴性沒有變化時,vue會直接返回上一次的計算結果,而不會重新計算

緩存優勢:

1、性能優化:

  • 避免重復計算:模版中多次引用同一個計算屬性時,依賴未變化就不需要重新計算;如果沒有緩存,expensiveCalc 則會在每次渲染時候都需要計算
<template><div>{{ expensiveCalc }}</div> <!-- 計算一次 --><div>{{ expensiveCalc }}</div> <!-- 直接讀緩存 -->
</template>
  • 減少渲染開銷: vue的渲染更新是批量的,緩存機制可以避免同一輪更新中多次觸發相同的計算

2、保證一致性

  • 同步派生狀態的確定性:在同一個事件循環中,無論訪問多少次計算屬性,其結果都是相同
  • 避免副作用污染:計算屬性時純函數,緩存機制強調開發者遵守這一原則, 無法在計算屬性中執行副作用

3、與響應式系統的協同

  • 精準依賴追蹤:緩存機制依賴vue的響應式系統,只有當確定的依賴項變化時候才需要重新計算

緩存實現的關鍵技術

1、惰性計算:只有在真正訪問屬性時才會計算,如果依賴性沒有變化則直接讀取緩存值
2、標記-清除機制:“臟”(dirty)狀態標記:當依賴性發生變化時,標記屬性為“dirty”. 下次訪問時候再重新計算

// 偽代碼示意Vue內部邏輯
class ComputedRef {constructor(getter) {this._dirty = true; // 初始標記為需要計算this._value = undefined;}get value() {if (this._dirty) {this._value = getter(); // 重新計算this._dirty = false;}return this._value;}
}

3、依賴收集的精準性

  • 計算屬性執行時會自動追蹤所有被訪問的響應式變量
  • 只有這些被追蹤的變量變化時才會觸發重新計算

何時會打破緩存:

  • 依賴項發生變化(主動觸發):
const a = ref(1);
const b = computed(() => a.value * 2);
a.value = 2; // 修改依賴,下次訪問b時重新計算
  • 手動強制刷新(特殊情況)
// 部分場景可通過賦值觸發(不推薦)
b.value = 5; // 如果計算屬性可寫(setter)

與方法的對比:

特性computed (帶緩存)方法 (無緩存)
執行時機依賴變化時每次調用都執行
性能高效(緩存結果)可能重復計算
模板使用自動優化需自行優化(如 v-once)
適用場景純計算、派生狀態需要每次執行的邏輯

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

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

相關文章

Java 23 新特性解析與代碼示例

Java 23 新特性解析與代碼示例 文章目錄Java 23 新特性解析與代碼示例1. 引言2. 正式特性2.1. Markdown文檔注釋 (JEP 467)2.2. 廢棄sun.misc.Unsafe的內存訪問方法以移除 (JEP 471)2.3. ZGC&#xff1a;默認啟用代際模式 (JEP 474)3. 預覽特性3.1. 原始類型在模式、instanceof…

spring boot + mybatis + mysql 只有一個實體類的demo

使用MyBatis進行數據庫操作&#xff0c;配置簡單。主要演示了mybatis可以不用只使用方法名來對應mapper.java和mapper.xml。 目錄結構 pom.xml src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── springbootjdbcweb/ │ │ └── …

iRemovalPro完美繞iCloud插卡打電話,A12+支持iOS 18.1.1

iRemovalPro 專業工具全解析與操作指南 &#xff08;支持iOS 14.0 - 16.6.1&#xff0c;A7-A15芯片設備&#xff09; &#x1f449;下載地址見文末 iRemoval Pro iRemoval 專業版是一款來自外國安全研究員的工具&#xff0c;用來幫助一些人因為忘記自己的ID或者密碼&#xff0c…

安卓SELinux策略語法

目錄前言一、 通用AV規則語法1.1 allow source target:class permissions;1.2 neverallow source target:class permissions;二、type三、attribute四、typeattribute五、alias六、typealias七、init_daemon_domain7.1 init_daemon_domain 宏概述7.2 宏展開與實現7.2.1 展開后規…

vscode cursor配置php的debug,docker里面debug

VSCode PHP調試配置指南 概述 本文介紹如何在VSCode中配置PHP調試環境&#xff0c;包括本地和Docker環境。 前置要求 VSCodePHP 7.0Xdebug擴展PHP Debug VSCode擴展 本地調試配置 1. 安裝Xdebug # Ubuntu/Debian sudo apt-get install php-xdebug# MacOS brew install p…

elk部署加日志收集

清華大學鏡像源地址&#xff1a;Index of /elasticstack/8.x/yum/8.13.2/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 一、elasticsearch 1.安裝 rpm -ivh elastic-agent-8.13.2-x86_64.rpm 2.修改配置 vim /etc/elasticsearch/elasticsearch.yml 修改如下&…

dify 升級1.7.1 插件無法下載依賴

dify 升級1.7.1 插件無法下載依賴 1. 安裝通義千問插件&#xff0c;各種報錯&#xff1b; 使用下面命令查看docker 鏡像日志 docker logs -f --tail100 docker-plugin_daemon-1 2025/08/01 07:42:21 full_duplex.go:59: [INFO]init environment for plugin langgenius/tongyi…

linux中簡易云盤系統項目實戰:基于 TCP協議的 Socket 通信、json數據交換、MD5文件區別與多用戶文件管理實現

&#x1f4cb; 項目介紹 本項目是一個基于Linux環境的簡易云盤系統&#xff0c;采用C/S&#xff08;客戶端/服務器&#xff09;架構&#xff0c;實現了類似百度網盤的基本功能。系統通過TCP Socket進行網絡通信&#xff0c;使用JSON格式進行數據交換&#xff0c;利用SQLite3數據…

linux中posix消息隊列的使用記錄

在linux中使用posix中的消息隊列時遇到了一個問題&#xff0c;就是在發送消息時&#xff0c;如果隊列滿了&#xff0c;mq_send接口會一直阻塞&#xff0c;經過查找資料后才發現&#xff0c;該接口默認是阻塞的&#xff0c;也就是說&#xff0c;當隊列滿了以后&#xff0c;接口會…

01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集及數據集的劃分、特征工程(特征提取與無量綱化、特征降維)

文章目錄機械學習機械學習分類1. 監督學習2. 半監督學習3. 無監督學習4. 強化學習機械學習的項目開發步驟scikit-learn1 scikit-learn安裝2 sklearn數據集1. sklearn 玩具數據集鳶尾花數據集糖尿病數據集葡萄酒數據集2. sklearn現實世界數據集20 新聞組數據集3. 數據集的劃分特…

n8n】n8n的基礎概念

以下是為初學者整理的 n8n 基本概念總結&#xff0c;幫助快速理解核心功能和使用邏輯&#xff1a;1. 工作流&#xff08;Workflow&#xff09;核心單元&#xff1a;n8n的一切操作基于工作流&#xff0c;代表一個自動化流程。組成&#xff1a;由多個節點&#xff08;Nodes&#…

機器學習基礎-matplotlib

一、相關知識點二、plotfrom pylab import mpl # 設置顯示中文字體 mpl.rcParams["font.sans-serif"] ["SimHei"] # 設置正常顯示符號 mpl.rcParams["axes.unicode_minus"] False #%%#%% import matplotlib.pyplot as plt import random# 畫出…

spring-ai-alibaba 學習(十九)——graph之條件邊、并行節點、子圖節點

前面了解了基礎的概念及流程&#xff0c;以及一些參數類下面了解一些特殊的邊和節點條件邊常見的流程圖可能長這個樣子&#xff1a;其中菱形的為條件節點&#xff08;或者叫判定節點&#xff09;&#xff0c;但是在spring-ai-alibaba-graph中&#xff0c;并沒有條件節點在sprin…

深入淺出設計模式——創建型模式之原型模式 Prototype

文章目錄原型模式簡介原型模式結構關于克隆方法&#xff1a;淺拷貝/深拷貝原型模式代碼實例定義原型類和克隆方法客戶端使用代碼示例示例一&#xff1a;淺拷貝示例二&#xff1a;深拷貝原型模式總結開閉原則代碼倉庫原型模式&#xff1a;用原型實例指定創建對象的種類&#xff…

.NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能

.NET 10 預覽版 6 中的 .NET MAUI.NET 10 預覽版 5 中的.NET MAUI.NET 10 預覽版 4 中的 .NET MAUI.NET 10 預覽版 3 中的 .NET MAUI.NET 10 預覽版 2 中的 .NET MAUI.NET 10 預覽版 1 中的 .NET MAUI 一、MediaPicker 增強功能&#xff08;預覽版6&#xff09; .NET 10 預覽…

MT Photos圖庫部署詳解:Docker搭建+貝銳蒲公英異地組網遠程訪問

如今&#xff0c;私有化部署輕量級圖床/圖庫系統&#xff0c;已經成為越來越多用戶的高頻需求。而MT Photos&#xff0c;正是一款非常適合在Docker環境下運行的自托管圖床/圖庫系統。MT Photos基于Node.js與Vue構建&#xff0c;界面簡潔美觀&#xff0c;支持多用戶權限管理、多…

解決dbeaver連接不上oceanbase數據庫的問題

解決dbeaver連接不上oceanbase數據庫的問題 問題&#xff1a; 使用dbeaver連接oceanbase數據庫報錯如下&#xff1a; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘dat…

Kafka——請求是怎么被處理的?

引言在分布式消息系統中&#xff0c;請求處理機制是連接客戶端與服務端的"神經中樞"。無論是生產者發送消息、消費者拉取數據&#xff0c;還是集群內部的元數據同步&#xff0c;都依賴于高效的請求處理流程。Apache Kafka作為高性能消息隊列的代表&#xff0c;其請求…

區塊鏈技術如何確保智能合約的安全性和可靠性?

智能合約作為區塊鏈上自動執行的可編程協議&#xff0c;其安全性和可靠性直接決定了區塊鏈應用的信任基礎。區塊鏈通過底層技術架構、密碼學工具和機制設計的多重保障&#xff0c;構建了智能合約的安全防線。以下從技術原理、核心機制和實踐保障三個維度展開分析&#xff1a;一…

2020 年 NOI 最后一題題解

問題描述2020 年 NOI 最后一題是一道結合圖論、動態規劃與狀態壓縮的綜合性算法題&#xff0c;題目圍繞 "疫情期間的物資配送" 展開&#xff0c;具體要求如下&#xff1a;給定一個有向圖 G (V, E)&#xff0c;其中節點代表城市&#xff0c;邊代表連接城市的道路。每個…