当前位置:首页 > JavaScript

js mvvm 实现

2026-04-04 04:33:46JavaScript

MVVM 模式简介

MVVM(Model-View-ViewModel)是一种前端架构模式,核心思想是通过数据绑定实现视图(View)与数据模型(Model)的自动同步。ViewModel 作为中间层,负责处理业务逻辑和数据转换。

实现 MVVM 的关键技术

数据劫持(响应式核心)

通过 Object.definePropertyProxy 监听数据变化:

// 使用 Proxy 实现数据劫持
function observe(data) {
  return new Proxy(data, {
    get(target, key) {
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      updateView(); // 触发视图更新
      return true;
    }
  });
}

模板编译

解析 DOM 模板中的指令(如 v-model)并建立绑定:

function compile(el, vm) {
  el.querySelectorAll('[v-model]').forEach(node => {
    const key = node.getAttribute('v-model');
    node.value = vm.data[key];
    node.addEventListener('input', (e) => {
      vm.data[key] = e.target.value;
    });
  });
}

依赖收集

实现 Watcher 类跟踪依赖关系:

js mvvm 实现

class Watcher {
  constructor(vm, key, updateFn) {
    this.vm = vm;
    this.key = key;
    this.updateFn = updateFn;
    Dep.target = this;
    this.vm[this.key]; // 触发getter收集依赖
    Dep.target = null;
  }
  update() {
    this.updateFn.call(this.vm, this.vm[this.key]);
  }
}

完整实现示例

class MVVM {
  constructor(options) {
    this.$el = document.querySelector(options.el);
    this._data = options.data;
    this.data = observe(this._data);
    this.compile(this.$el);
  }

  compile(el) {
    el.querySelectorAll('[v-model]').forEach(node => {
      const key = node.getAttribute('v-model');
      node.value = this.data[key];
      new Watcher(this, key, value => {
        node.value = value;
      });
      node.addEventListener('input', e => {
        this.data[key] = e.target.value;
      });
    });
  }
}

实现注意事项

  • 性能优化:避免频繁 DOM 操作,可使用虚拟 DOM 或差异化更新
  • 指令扩展:支持 v-forv-if 等复杂指令
  • 内存管理:及时清除无用的事件监听和 Watcher

现代框架对比

  • Vue 2.x 使用 Object.defineProperty
  • Vue 3.x 改用 Proxy
  • React 虽然非 MVVM 但理念相似(单向数据流)
  • Angular 采用更完整的 MVVM 实现

以上实现展示了 MVVM 的核心原理,实际项目中建议直接使用成熟框架。理解这些底层机制有助于更好地使用框架和解决复杂问题。

标签: jsmvvm
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…