当前位置:首页 > VUE

vue实现mvvm思路

2026-02-19 14:34:43VUE

Vue 实现 MVVM 的思路

Vue 的 MVVM(Model-View-ViewModel)实现主要通过数据绑定和响应式系统完成。以下是核心实现思路:

数据劫持(响应式系统)

通过 Object.definePropertyProxy 拦截数据的读取和修改。当数据变化时,通知依赖的视图更新。

// 简化版数据劫持
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('get', key);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log('set', key);
        val = newVal;
        // 触发更新
      }
    }
  });
}

依赖收集

每个响应式数据维护一个依赖列表(Dep),在 getter 中收集依赖(Watcher),在 setter 中通知依赖更新。

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

class Watcher {
  update() {
    // 更新视图
  }
}

模板编译

将模板解析为 AST(抽象语法树),遍历 AST 生成渲染函数。过程中识别指令(如 v-model)和插值表达式({{}}),并为其创建对应的 Watcher。

// 简化的模板编译
function compile(template) {
  // 解析模板为 AST
  const ast = parse(template);
  // 生成渲染函数
  const code = generate(ast);
  return new Function(code);
}

虚拟 DOM 与 Diff 算法

通过虚拟 DOM 减少直接操作真实 DOM 的开销。当数据变化时,生成新的虚拟 DOM,通过 Diff 算法对比新旧虚拟 DOM,高效更新真实 DOM。

// 简化的虚拟 DOM 结构
{
  tag: 'div',
  attrs: { id: 'app' },
  children: [
    { tag: 'span', children: 'Hello' }
  ]
}

双向绑定实现

v-model 是语法糖,通过绑定 value 属性和 input 事件实现双向绑定。

// 简化的 v-model 实现
function bindModel(el, vm, exp) {
  el.value = vm[exp];
  el.addEventListener('input', e => {
    vm[exp] = e.target.value;
  });
}

生命周期管理

组件在不同阶段(创建、挂载、更新、销毁)触发对应的生命周期钩子,便于开发者介入控制流程。

vue实现mvvm思路

Vue 的 MVVM 实现通过以上机制,实现了数据驱动视图的自动化更新,开发者只需关注数据状态,无需手动操作 DOM。

标签: 思路vue
分享给朋友:

相关文章

实现 vue ssr

实现 vue ssr

Vue SSR 实现方法 Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法: 基础配置 安装必要依赖…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue多选实现

vue多选实现

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

vue实现换页

vue实现换页

Vue实现页面切换的方法 在Vue中实现页面切换通常可以通过Vue Router来完成。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的实现方式:…

vue滑块实现

vue滑块实现

Vue滑块实现方法 使用原生HTML5 range input Vue中可以绑定原生HTML5的range类型input元素实现基础滑块功能: <template> <div&…