Vue 中 computed 和 watch 的差异

简介: Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
  1. 定义与基本功能
    • computed(计算属性)
      • 定义:计算属性是基于Vue实例的响应式数据(如data中的属性)进行计算得到的值。它会根据依赖的数据自动缓存计算结果,只有当依赖的数据发生变化时,才会重新计算。
      • 示例:假设我们有一个商品列表,每个商品有价格和数量,我们想计算总价。可以在Vue组件中这样定义计算属性:
          export default {
                 
              data() {
                 
                  return {
                 
                      products: [
                          {
                 price: 10, quantity: 2},
                          {
                 price: 20, quantity: 3}
                      ]
                  };
              },
              computed: {
                 
                  totalPrice() {
                 
                      return this.products.reduce((total, product) => {
                 
                          return total + (product.price * product.quantity);
                      }, 0);
                  }
              }
          }
        
    • watch(侦听器)
      • 定义:侦听器主要用于观察和响应Vue实例中数据的变化。当被观察的数据发生变化时,会执行相应的回调函数。它更侧重于数据变化后的异步操作或副作用。
      • 示例:如果我们想在用户输入的搜索关键词变化时,发送一个API请求获取相关商品列表,可以这样使用侦听器:
          export default {
                 
              data() {
                 
                  return {
                 
                      searchTerm: '',
                      productList: []
                  };
              },
              watch: {
                 
                  searchTerm(newValue, oldValue) {
                 
                      // 发送API请求获取相关商品列表
                      this.fetchProducts(newValue);
                  }
              },
              methods: {
                 
                  fetchProducts(term) {
                 
                      // 模拟API请求
                      axios.get(`/api/products?search=${
                   term}`).then(response => {
                 
                          this.productList = response.data;
                      });
                  }
              }
          }
        
  2. 依赖追踪与更新机制
    • computed
      • 依赖追踪:计算属性会自动追踪其内部使用的响应式数据作为依赖。在上述总价计算的例子中,totalPrice计算属性依赖于products数组中的每个product对象的pricequantity属性。Vue会自动检测这些依赖,当其中任何一个依赖发生变化时,就会重新计算totalPrice
      • 缓存机制:计算属性具有缓存特性。如果多次访问计算属性,只要其依赖的数据没有变化,就会直接返回缓存的结果,而不会重新计算。这在性能上是很有优势的,特别是当计算过程比较复杂时。例如,计算属性totalPrice在组件首次渲染时计算一次,只要products数据没有变化,后续对totalPrice的访问都会使用缓存的结果。
    • watch
      • 手动观察特定数据:与计算属性不同,watch需要手动指定要观察的数据。在watch选项中定义的每个属性,就是要观察的数据。当这些数据发生变化时,对应的回调函数就会被执行。例如,在搜索关键词的例子中,我们明确地告诉Vue要观察searchTerm数据的变化。
      • 每次变化都执行回调:只要被观察的数据发生变化,watch中的回调函数就会执行。它不会像计算属性那样缓存结果,每次变化都会触发相应的操作。这使得watch更适合用于处理数据变化后的异步操作,如发送网络请求、更新外部存储等。
  3. 使用场景与最佳实践
    • computed
      • 适用于数据的派生计算:当需要根据已有的响应式数据计算出一个新的值,并且这个值在模板中需要频繁使用时,计算属性是很好的选择。例如,格式化日期、拼接字符串、计算复杂的数学公式等场景。除了前面提到的总价计算,还可以用于将用户输入的姓名和姓氏拼接成完整姓名等操作。
      • 保持计算逻辑的纯净性:计算属性应该只用于计算,不应该产生副作用。它的计算结果应该只依赖于响应式数据,并且不应该修改这些数据。这样可以保证计算属性的行为是可预测的,便于调试和维护。
    • watch
      • 响应数据变化后的异步操作:当需要在数据变化后执行异步操作,如与后端API交互、操作DOM(虽然在Vue中尽量避免直接操作DOM)等,watch是合适的工具。例如,在用户修改表单数据后,实时验证数据并向用户反馈验证结果;或者在地图组件中,当用户缩放级别变化时,重新加载地图数据。
      • 深度观察复杂数据结构:对于复杂的数据结构(如嵌套对象或数组),可以通过设置deep选项来深度观察数据的变化。不过,深度观察可能会导致性能问题,因为它会递归地检查数据的每一个子属性。所以在使用时要谨慎考虑,只有当确实需要对复杂数据结构的所有变化做出响应时才使用。
相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
350 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
320 137
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
830 0
|
5月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
469 1
|
5月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
295 0
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
8月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1067 4
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
7月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
936 77
|
8月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍