当前位置:首页 > VUE

vue computed 实现原理

2026-02-17 11:56:09VUE

Vue computed 实现原理

响应式依赖收集

Vue的computed属性基于响应式系统实现。当组件初始化时,computed属性会创建一个计算watcher,这个watcher会在getter被调用时收集依赖的响应式数据。每个computed属性都有自己的watcher实例,其中包含一个dirty标志位用于缓存控制。

惰性求值与缓存

计算属性具有惰性求值特性,只有当依赖的响应式数据变化时才会重新计算。计算watcher的getter会在首次访问时执行一次,并将结果缓存。当依赖数据未变化时,直接返回缓存值而不重新计算。

依赖触发更新流程

当computed依赖的响应式数据发生变化时,会触发setter通知,使得计算watcher的dirty标志变为true。下次访问该computed属性时,由于dirty为true,会重新执行getter计算新值并更新缓存。

与渲染watcher的关联

计算属性通常被模板引用,因此计算watcher会作为渲染watcher的依赖存在。当计算属性重新计算后,会触发渲染watcher的更新,从而驱动视图重新渲染。

实现核心代码逻辑

// 简化版实现原理
class Watcher {
  constructor(vm, fn, options) {
    this.vm = vm
    this.dirty = options.lazy
    this.getter = fn
    this.value = this.lazy ? undefined : this.get()
  }

  get() {
    pushTarget(this)
    const value = this.getter.call(this.vm)
    popTarget()
    return value
  }

  update() {
    this.dirty = true
  }

  evaluate() {
    this.value = this.get()
    this.dirty = false
  }
}

function defineComputed(target, key, userDef) {
  const watcher = new Watcher(target, userDef.get, { lazy: true })

  Object.defineProperty(target, key, {
    get() {
      if (watcher.dirty) {
        watcher.evaluate()
      }
      return watcher.value
    }
  })
}

与method的区别

计算属性基于依赖缓存,只有相关依赖发生改变才会重新计算。而method每次调用都会执行函数体。计算属性适用于派生状态,而method更适合事件处理等需要主动触发的场景。

vue computed 实现原理

与watch的区别

计算属性是声明式的值计算,自动追踪依赖。watch需要显式指定监听目标,更适合执行副作用操作。计算属性必须有返回值,而watch不需要。

标签: 原理vue
分享给朋友:

相关文章

vue实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的Ca…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定,…