当前位置:首页 > VUE

实现vue vm

2026-03-07 16:27:28VUE

Vue VM 实现原理

Vue VM(ViewModel)是 Vue.js 的核心部分,负责数据绑定和视图更新。以下是实现 Vue VM 的关键步骤:

数据劫持(响应式系统)

通过 Object.defineProperty 或 ES6 Proxy 拦截数据的读写操作。当数据被修改时,通知依赖的视图更新。

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        val = newVal;
        // 触发更新
      }
    }
  });
}

依赖收集

每个响应式属性都有一个依赖收集器(Dep),用于存储所有依赖该属性的 Watcher 实例。

实现vue vm

class Dep {
  constructor() {
    this.subscribers = [];
  }
  depend() {
    if (target && !this.subscribers.includes(target)) {
      this.subscribers.push(target);
    }
  }
  notify() {
    this.subscribers.forEach(sub => sub());
  }
}

观察者(Watcher)

Watcher 实例代表一个依赖,当数据变化时执行回调函数(如更新视图)。

let target = null;
class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm;
    this.getter = parsePath(exp);
    this.cb = cb;
    this.value = this.get();
  }
  get() {
    target = this;
    const value = this.getter(this.vm);
    target = null;
    return value;
  }
  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.cb.call(this.vm, this.value, oldValue);
  }
}

模板编译

将模板转换为渲染函数,解析指令和插值表达式,建立数据与视图的绑定关系。

实现vue vm

function compile(template) {
  // 解析模板生成AST
  const ast = parse(template);
  // 优化AST
  optimize(ast);
  // 生成渲染函数
  const code = generate(ast);
  return new Function(`with(this){return ${code}}`);
}

虚拟DOM与Diff算法

通过虚拟DOM减少直接操作真实DOM的开销,使用Diff算法高效更新视图。

function patch(oldVnode, vnode) {
  if (sameVnode(oldVnode, vnode)) {
    patchVnode(oldVnode, vnode);
  } else {
    const parentElm = oldVnode.elm.parentNode;
    parentElm.insertBefore(createElm(vnode), oldVnode.elm);
    parentElm.removeChild(oldVnode.elm);
  }
  return vnode.elm;
}

生命周期管理

实现组件生命周期钩子,在适当的时间点触发创建、更新、销毁等操作。

function callHook(vm, hook) {
  const handlers = vm.$options[hook];
  if (handlers) {
    handlers.call(vm);
  }
}

以上步骤构成了 Vue VM 的基本实现框架。实际 Vue.js 源码更为复杂,包含更多优化和边界情况处理。

标签: vuevm
分享给朋友:

相关文章

vue如何实现到期提醒

vue如何实现到期提醒

实现 Vue 到期提醒功能 使用计算属性计算剩余时间 在 Vue 组件中定义一个计算属性,计算目标日期与当前日期的差值。通过 Date 对象获取时间戳并计算剩余天数或小时数。 computed: {…

vue   实现单选

vue 实现单选

Vue 实现单选功能 在 Vue 中实现单选功能可以通过多种方式,以下是几种常见的方法: 使用原生 <input type="radio"> 绑定 v-model 通过 v-model…

vue 实现直播

vue 实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能,通常需要结合WebRTC、RTMP或HLS等技术。以下是几种常见的实现方式: 使用WebRTC实现实时直播 WebRTC适合低延迟的实时直播场景,…

vue路由实现

vue路由实现

Vue 路由实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的基本实现步骤和核心功能。 安装 Vue Router 通过…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue 实现赋值

vue 实现赋值

Vue 实现赋值的方法 在 Vue 中,赋值操作通常涉及数据绑定和响应式更新。以下是几种常见的赋值方式: 直接赋值给 data 属性 在 Vue 实例的 data 对象中定义的属性可以直接通过 th…