当前位置: 首页 > news >正文

Vue中的methods 和 computed

methodscomputed 都用于处理数据逻辑,核心差异体现在执行时机和缓存机制上。

一、对比

维度methods(方法)computed(计算属性)
本质普通函数,需要主动调用依赖数据计算出的“衍生值”,自动更新
调用方式在模板中用 {{ 方法名() }},必须加括号在模板中用 {{ 计算属性名 }},不加括号
缓存机制无缓存:每次调用都会重新执行函数有缓存:依赖数据不变时,多次访问返回缓存结果
触发时机手动调用时执行(如点击事件、模板渲染)依赖的数据变化时自动重新计算
返回值可返回任意值,也可无返回值必须有返回值(用于模板渲染或其他逻辑)
适用场景处理交互逻辑(如点击事件)、一次性计算处理依赖数据的衍生值(如筛选、拼接、计算)

二、示例

1. methods:处理交互或主动计算
export default {data() {return {numbers: [1, 2, 3, 4]};},methods: {// 计算总和的方法(无缓存)getSum() {console.log("methods 执行了");return this.numbers.reduce((total, num) => total + num, 0);}}
};

模板中调用:

<!-- 每次渲染都会执行 getSum() -->
<p>{{ getSum() }}</p>
<button @click="getSum()">点击计算</button>
  • 每次模板重新渲染(如其他数据变化),getSum() 都会被重新调用
  • 点击按钮时也会主动触发执行
2. computed:依赖数据的衍生值
export default {data() {return {numbers: [1, 2, 3, 4]};},computed: {// 计算总和的计算属性(有缓存)sum() {console.log("computed 执行了");return this.numbers.reduce((total, num) => total + num, 0);}}
};

模板中使用:

<!-- 首次访问执行,依赖不变时直接用缓存 -->
<p>{{ sum }}</p>
<p>{{ sum }}</p> <!-- 不会重新执行,用缓存结果 -->
  • 首次渲染时执行一次,之后只要 numbers 不变,无论模板中引用多少次,都不会重新计算(直接返回缓存)。
  • numbers 变化时,会自动重新计算并更新缓存

三、使用场景

  1. methods 当你需要:

    • 处理用户交互(如点击、输入事件):
      <button @click="handleClick">点击事件</button>
      
    • 执行一次性操作(如提交表单、重置数据):
      methods: {submitForm() { /* 提交逻辑 */ }
      }
      
    • 函数需要接收参数时(computed 不能传参):
      methods: {filterItems(type) { /* 根据参数筛选数据 */ }
      }
      
  2. computed 当你需要:

    • 从现有数据中衍生出新数据(如拼接字符串、计算总价):
      computed: {fullName() { return this.firstName + ' ' + this.lastName; }
      }
      
    • 筛选/转换数据(如过滤列表):
      computed: {activeItems() { return this.items.filter(item => item.active); }
      }
      
    • 减少重复计算(利用缓存提升性能):
      当一个复杂计算需要在模板中多次使用时,computed 的缓存能避免重复执行

四、性能差异

  • methods 无缓存,每次调用都重新执行,若函数逻辑复杂且调用频繁,可能影响性能
  • computed 有缓存,只在依赖变化时计算,适合复杂逻辑或频繁访问的场景(性能更优)

总结

  • methods 是“主动执行的工具”:需要手动调用,适合处理交互和一次性操作,无缓存
  • computed 是“自动更新的衍生值”:依赖数据变化自动更新,适合数据计算,有缓存

记住简单判断:如果需要“结果”,用 computed;如果需要“动作”,用 methods

http://www.dtcms.com/a/345085.html

相关文章:

  • Linux-Makefile
  • 网络编程6(JVM)
  • 【Redis】哨兵模式和集群模式
  • 红帽认证升级华为openEuler证书活动!
  • 【学习记录】c完整线程池实现
  • 未来已来?AI 预测技术在气象、金融领域的应用现状与风险警示
  • MySQL视图详解:从基础概念到实战案例
  • 人工智能-python-深度学习-软件安装阶段
  • 第2章 cmd命令基础:执行动态链接库(rundll32)
  • 大视协作码垛机器人:定制圆形吸盘破解桶型码垛难题
  • HEVC(H.265)与HVC1的关系及区别
  • 【C初阶】数据在内存中的存储
  • 【LeetCode 热题 100】139. 单词拆分——(解法一)记忆化搜索
  • Vue 插槽(Slots)全解析1
  • 所做过的笔试真题
  • 阿里云RDS MySQL数据归档全攻略:方案选择指南
  • (LeetCode 面试经典 150 题) 124. 二叉树中的最大路径和 (深度优先搜索dfs)
  • 大麦盒子DM4036刷包推荐
  • 停车场道闸的常见形式
  • 【会议跟踪】Model-Based Systems Engineering (MBSE) in Practice 2025
  • 场景题:内存溢出 和 内存泄漏 有啥区别?
  • Python-UV
  • Android夜间模式切换及自定义夜间模式切换按钮实现快速适配夜间模式
  • LeetCode Hot 100 第一天
  • 《器件在EMC中的应用》---TVS在EMC中的应用
  • 中国大学MOOC--C语言第十一周结构类型
  • 开源版CRM客户关系管理系统源码包+搭建部署教程
  • 3D打印小批量低成本打印玩具工艺品模型-中科米堆CASAIM
  • MTK Linux DRM分析(十三)- Mediatek KMS实现mtk_drm_drv.c(Part.1)
  • 深入解析TCP/UDP协议与网络编程