当前位置:首页 > 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如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 funct…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…