当前位置:首页 > VUE

vue计算属性的实现

2026-01-22 19:51:24VUE

Vue 计算属性的实现原理

Vue 的计算属性(Computed Properties)是基于响应式依赖进行缓存的特性,其核心实现依赖于 Watcher 和依赖收集机制。

计算属性的初始化

在 Vue 初始化阶段,会通过 initComputed 函数处理计算属性。每个计算属性会创建一个对应的 Watcher 实例,并将计算属性的 getter 函数作为 Watcher 的求值函数。

function initComputed(vm, computed) {
  const watchers = vm._computedWatchers = Object.create(null);
  for (const key in computed) {
    const getter = computed[key];
    watchers[key] = new Watcher(
      vm,
      getter || function() {},
      noop,
      { lazy: true } // 标记为计算属性 Watcher
    );
    defineComputed(vm, key, getter);
  }
}

计算属性的缓存机制

计算属性通过 dirty 标志位实现缓存。当依赖的响应式数据未变化时,直接返回缓存值;当依赖变化时,标记 dirty 为 true,下次访问时重新计算。

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

function update() {
  this.dirty = true;
}

依赖收集过程

计算属性在首次访问时会执行 getter 函数,触发依赖收集:

  1. 计算属性 Watcher 将自身设置为 Dep.target
  2. 执行 getter 函数时访问响应式数据,触发数据的 getter
  3. 响应式数据的 dep 会收集计算属性 Watcher 作为依赖
function createComputedGetter(key) {
  return function computedGetter() {
    const watcher = this._computedWatchers[key];
    if (watcher.dirty) {
      watcher.evaluate();
    }
    if (Dep.target) {
      watcher.depend();
    }
    return watcher.value;
  }
}

与普通属性的区别

  1. 延迟计算:只有被访问时才会计算
  2. 缓存机制:依赖未变化时返回缓存值
  3. 依赖追踪:自动追踪所有响应式依赖

实现示例代码

以下是简化版的计算属性实现:

vue计算属性的实现

class ComputedRef {
  constructor(getter) {
    this._dirty = true;
    this._value = undefined;
    this._getter = getter;
    effect(() => this._getter(), {
      scheduler: () => {
        if (!this._dirty) {
          this._dirty = true;
          trigger(this, "value");
        }
      }
    });
  }

  get value() {
    if (this._dirty) {
      this._value = this._getter();
      this._dirty = false;
      track(this, "value");
    }
    return this._value;
  }
}

计算属性的这种实现方式确保了高效的数据更新和渲染性能,是 Vue 响应式系统的重要组成部分。

标签: 属性vue
分享给朋友:

相关文章

vue实现cs

vue实现cs

Vue 实现 CS(Client-Side)渲染的常见方法 Vue.js 是一个用于构建用户界面的渐进式框架,默认采用客户端渲染(CSR)。以下是几种常见的实现方式: 使用 Vue CLI 创建项目…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现京东

vue实现京东

Vue 实现京东电商网站的关键步骤 项目搭建与基础配置 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理路由,Vuex/Pinia 管理状态。配置基础 UI 框架如 E…

vue实现投票

vue实现投票

Vue实现投票功能 数据准备 在Vue组件的data中定义投票相关数据,包括选项列表和当前选中状态: data() { return { options: [ { id: 1…

vue怎么实现直播

vue怎么实现直播

Vue实现直播的方法 使用Vue实现直播功能通常需要结合第三方直播服务或WebRTC技术。以下是几种常见的实现方式: 使用第三方直播服务 集成如腾讯云、阿里云或七牛云等提供的直播SDK,通过他们的A…

vue实现购物平台

vue实现购物平台

实现购物平台的基本架构 使用Vue.js构建购物平台需要结合前端框架、状态管理、路由和后端接口。以下是一个基本实现方案: 项目初始化与依赖安装 通过Vue CLI创建项目并安装必要依赖: vue…