VUE3入門很簡單(2)--- 計算屬性

前言

重要提示:文章只適合初學者,不適合專家!!!

為什么需要計算屬性?

想象你在開發一個購物車功能。當用戶選擇商品時,你需要:

  1. 計算商品總價
  2. 根據折扣碼調整價格
  3. 自動更新免運費狀態
  4. 顯示稅費金額

你會怎么做?在模板中寫表達式?

<!-- 反例:模板中復雜邏輯 -->
<p>總價:¥{{ (items.reduce((sum, item) => sum + item.price * item.quantity, 0) * (1 - discountRate)) }}
</p>
<p v-if="(items.reduce((sum, item) => sum + item.price * item.quantity, 0) * (1 - discountRate)) > 100">已免運費
</p>

這種寫法存在三個嚴重問題:

  1. 重復代碼:相同邏輯在多個地方重復
  2. 難以維護:業務邏輯分散在模板中
  3. 性能浪費:每次渲染都重新計算

這就是計算屬性的用武之地!

計算屬性是什么?

計算屬性是Vue的智能數據處理器:

  • 它能根據其他響應式數據自動計算新值
  • 會緩存計算結果,避免重復計算
  • 在模板中使用像普通屬性一樣簡單
  • 代碼集中管理,易于維護

計算屬性使用五步法

第一步:從vue引入computed

// 1. 必須先從vue中引入computed
import { ref, computed } from 'vue'

第二步:定義響應式數據

// 2. 創建響應式基礎數據
const price = ref(100)  // 商品單價
const quantity = ref(2) // 購買數量

第三步:創建計算屬性

// 3. 使用computed()函數創建計算屬性
const subtotal = computed(() => {// 簡單的計算邏輯:單價 × 數量return price.value * quantity.value
})

第四步:創建更復雜的計算屬性

// 4. 可創建依賴其他計算屬性的計算屬性
const discountRate = ref(0.2) // 折扣率20%const total = computed(() => {// 打折后金額:小計 × (1 - 折扣率)return subtotal.value * (1 - discountRate.value)
})

第五步:在模板中使用

<template><div class="cart"><!-- 直接像普通數據一樣使用計算屬性 --><p>單價: ¥{{ price }}</p><p>數量: {{ quantity }}</p><p>小計: ¥{{ subtotal }}</p><p>折扣率: {{ discountRate * 100 }}%</p><!-- 使用計算結果自動更新 --><p class="total">實付: ¥{{ total }}</p></div>
</template>

使用計算屬性的改進方案

<script setup>
import { reactive, computed } from 'vue'const cart = reactive({items: [{ id: 1, name: 'Vue教程', price: 99, quantity: 2 },{ id: 2, name: 'React手冊', price: 89, quantity: 1 }],discountRate: 0.1 // 10%折扣
})// 1. 計算總價(未打折)
const subtotal = computed(() => {return cart.items.reduce((sum, item) => sum + item.price * item.quantity, 0)
})// 2. 計算最終價格(打折后)
const total = computed(() => {return subtotal.value * (1 - cart.discountRate)
})// 3. 判斷是否免運費
const freeShipping = computed(() => {return total.value > 100
})// 4. 計算稅費(復雜規則)
const tax = computed(() => {if (freeShipping.value) {return total.value * 0.08 // 免運費稅率8%}return total.value * 0.1 // 普通稅率10%
})
</script><template><div><p>商品小計:¥{{ subtotal }}</p><p>折扣后價格:¥{{ total }}</p><p v-if="freeShipping">🎉 已免運費!</p><p>稅費:¥{{ tax }}</p></div>
</template>

計算屬性的優勢

1. 自動依賴追蹤與緩存

const a = ref(10)
const b = ref(20)// 每次訪問都會執行計算
function regularSum() {console.log('函數執行')return a.value + b.value
}// 只有依賴變更時才重新計算
const computedSum = computed(() => {console.log('計算屬性執行')return a.value + b.value
})

測試結果:

console.log(computedSum.value) // "計算屬性執行" → 30
console.log(computedSum.value) // 無打印 → 從緩存返回30a.value = 15 // 更新依賴console.log(computedSum.value) // "計算屬性執行" → 35
console.log(computedSum.value) // 無打印 → 從緩存返回35

2. 復雜邏輯封裝

// 封裝復雜的產品過濾邏輯
const filteredProducts = computed(() => {return products.value.filter(p => p.stock > 0) // 過濾有庫存的.filter(p => p.price <= maxPrice.value) // 價格篩選.sort((a, b) => { // 排序if (sortBy.value === 'price') {return a.price - b.price}return a.name.localeCompare(b.name)})
})

常見問題與解決方案

問題1:計算屬性不更新

原因:依賴項沒有正確響應式

const obj = { count: 0 }// ? 錯誤 - 原始對象不是響應式
const doubled = computed(() => obj.count * 2) // ? 正確 - 使用reactive包裝
const reactiveObj = reactive({ count: 0 })
const doubled = computed(() => reactiveObj.count * 2)

問題2:何時使用計算屬性 vs 方法

場景選擇原因
依賴響應式數據的計算計算屬性自動緩存優化性能
數據轉換或格式化計算屬性更清晰的模板語法
需要參數的運算方法計算屬性不接受參數
事件處理方法與事件配合使用
一次性的復雜運算方法避免不必要的響應式依賴

總結:何時使用計算屬性?

在以下場景優先選擇計算屬性:

  1. 數據依賴計算:當需要基于其他響應式數據計算新值
  2. 模板格式化:需要格式化顯示的數據
  3. 性能優化:避免重復執行高開銷操作
  4. 代碼組織:集中管理邏輯,提高可讀性

記住計算屬性的核心價值:

“計算屬性不是普通的函數,而是具有智能緩存功能的響應式數據處理器”

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

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

相關文章

IPV6概述

1. 定義 IPv6&#xff08;Internet Protocol version 6&#xff09;是互聯網協議的第六版&#xff0c;設計用于替代現有的 IPv4 協議。IPv6 提供了更大的地址空間、增強的路由效率、更好的安全性以及自動配置功能&#xff0c;以滿足現代網絡的需求。 1.1 地址空間 IPv6 地址長…

量子機器學習:AI算力突破量子優勢臨界點?

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 以下是為您撰寫的第六篇CSDN深度技術解析文章&#xff0c;圍繞前沿命題 《量子機器學習&#xff1a;AI算力突破量子優勢臨界點&…

Kerberos 深入詳解:原理、認證流程與應用場景

目錄 什么是 KerberosKerberos 原理解析Kerberos 認證完整流程Kerberos 應用場景常見問題與最佳實踐參考資料 什么是 Kerberos Kerberos 是一種廣泛應用于計算機網絡中的身份認證協議&#xff0c;它基于對稱密鑰加密思想&#xff0c;核心目標是在不安全的網絡中實現安全的身份…

mac安裝node 實測可行

進入nodejs官網&#xff0c;選擇mac,選擇安裝方式&#xff0c;選擇版本即可獲得安裝命令 直接執行即可 具體腳本 # Download and install nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash# in lieu of restarting the shell \. "…

山石網科談平凡對話中的咒語——提示詞注入攻擊與防御

現場 2026 年 4 月 25 日上午&#xff0c;A市 初春的街道&#xff0c;陽光普照&#xff0c;鳥語花香&#xff0c;V 君中午要與一個重要的客戶見面&#xff0c; 特意預約了人氣正旺的星際咖啡館&#xff0c;他家主打未來科幻風&#xff0c;之前去過幾次&#xff0c; 服務周到、…

SpringMVC系列(五)(響應實驗以及Restful架構風格(上))

0 引言 作者正在學習SpringMVC相關內容&#xff0c;學到了一些知識&#xff0c;希望分享給需要短時間想要了解SpringMVC的讀者朋友們&#xff0c;想用通俗的語言講述其中的知識&#xff0c;希望與諸位共勉&#xff0c;共同進步&#xff01; 本系列會持續更新&#xff01;&…

Windows 環境下設置 RabbitMQ 的 consumer_timeout 參數

在 Windows 環境下設置 RabbitMQ 的 consumer_timeout 參數&#xff0c;可以通過臨時修改或永久修改兩種方式實現。以下是具體操作步驟&#xff1a; 一、臨時修改&#xff08;無需重啟服務&#xff0c;但重啟后失效&#xff09; ?通過命令行動態設置? 打開命令提示符&#xf…

Python 中切換鏡像源

在 Python 中切換鏡像源主要涉及 pip 包管理器 和 conda 環境&#xff08;如 Anaconda、Miniconda&#xff09; 的配置。國內訪問 Python 官方源&#xff08;PyPI&#xff09;可能較慢&#xff0c;因此推薦使用國內鏡像源&#xff08;如阿里云、清華大學、豆瓣等&#xff09;。…

深入解析拓撲排序算法:從原理到C++實現

一、拓撲排序概述 拓撲排序(Topological Sorting)是對有向無環圖(Directed Acyclic Graph&#xff0c;簡稱DAG)的頂點進行排序&#xff0c;得到一個線性序列&#xff0c;使得對于圖中的任意一對頂點u和v&#xff0c;若存在一條從u到v的路徑&#xff0c;則u在排序結果中出現在v…

圖像質量對比感悟

具體任務&#xff1a; 在本次任務中&#xff0c;我需要對比兩張1080p的yuv圖片的清晰度&#xff0c;那么如何判斷呢&#xff1f;主要是進行了主觀判斷和客觀psnr的判斷。 psnr解釋&#xff1a; 定義&#xff1a; PSNR 用于衡量 兩幅圖像之間的差異&#xff08;通常是原始圖像和…

機器學習(ML)-Scikit-Learn--快速入門

專欄:機器學習 個人主頁:云端筑夢獅 一.數據集讀取方法&#xff08;常用功能用熟即可不用背下來&#xff09; 以例子代表需要的知識點和方法。 1. 導入必要的庫 from sklearn.datasets import load_iris import numpy as npload_iris()&#xff1a;用于加載鳶尾花數據集的…

SQL語句四大分類詳解:DDL、DML、DQL、DCL

前言 SQL&#xff08;Structured Query Language&#xff09;是用于管理和操作關系型數據庫的標準語言。無論是開發人員還是數據庫管理員&#xff0c;掌握 SQL 是必不可少的技能。 SQL 根據功能的不同&#xff0c;通常被劃分為 四大類&#xff1a; ? DDL&#xff08;數據定義…

如何將Word里每頁的行數設置成50行

https://www.zhihu.com/question/357856175 本文來自知乎林聽晴 第一步&#xff1a;新建一個Word文檔 打開“頁面布局”&#xff0c;之后點擊圖片圈起來的小圖標&#xff0c;即可出現“頁面設置”頁面。 ? ? 路徑&#xff1a;頁面設置—文檔網絡&#xff0c;可以看到默認行…

純前端本地文件管理器(VSCode風格)(瀏覽器對本地文件增刪改查)

純前端本地文件管理器&#xff08;VSCode風格&#xff09;(瀏覽器對本地文件增刪改查) 簡介 本項目為一個純前端實現的本地文件管理器網頁&#xff08;index.html&#xff09;&#xff0c;可在 Chrome/Edge 瀏覽器中直接打開&#xff0c;具備類似 VSCode 的本地文件夾操作體驗…

windows安裝wsl、Ubuntu、docker desktop

以下是Windows安裝WSL&#xff08;Windows Subsystem for Linux&#xff09;及在Ubuntu中配置使用Docker的完整流程&#xff0c;整合了最新官方方案和常見問題解決方案&#xff1a; &#x1f527; 一、Windows安裝WSL&#xff08;推薦WSL 2&#xff09; &#x1f4cd; 安裝前提…

華為云Flexus+DeepSeek征文|云端智能加持:華為云ModelArts Studio提升Chat2DB的AI數據庫管理效能

華為云FlexusDeepSeek征文&#xff5c;云端智能加持&#xff1a;華為云ModelArts Studio提升Chat2DB的AI數據庫管理效能 前言一、華為云ModelArts Studio平臺介紹1.1 ModelArts Studio介紹1.2 ModelArts Studio主要特點1.3 ModelArts Studio使用場景1.4 ModelArts Studio產品架…

微信小程序封裝loading 修改

1. custom-loading.vue <template><view v-if"visible" class"custom-loading-mask" touchmove.stop.prevent><view class"custom-loading-container"><!-- 動態點點 --><text class"loading-text">{…

Windows環境下Docker容器化的安裝與設置指南

哈嘍&#xff0c;大家好&#xff0c;我是左手python&#xff01; 系統要求與準備工作 在開始安裝和配置 Docker 之前&#xff0c;需要確保您的 Windows 系統滿足以下要求&#xff1a; 操作系統版本&#xff1a;推薦使用 Windows 10 或更高版本&#xff0c;特別是 64 位版本。對…

0 數學習題本

零 引言 數學錯題與好題總結 一 基礎階段 1 高數部分 習題冊:武忠祥 660 1?? 函數 極限 連續 2?? 一元微分 3?? 一元積分 4?? 微分方程 5?? 多元微分 6?? 二重積分 7?? 無窮級數 8?? 空間幾何 9?? 多元積分 2 線代部分 習題冊:湯家鳳 1800 1?? 行列式…

USB服務器的5個核心價值

USB服務器&#xff08;USB Server&#xff09;是一款專為企業級環境設計的創新型硬件解決方案&#xff0c;其核心使命在于解決物理USB設備&#xff08;如U盾、加密狗、身份認證Key等&#xff09;在分布式辦公、遠程協作及復雜IT架構中面臨的接入、管理與安全難題。本文以朝天椒…