当前位置:首页 > JavaScript

js 实现mvvm

2026-03-15 09:12:58JavaScript

MVVM 模式简介

MVVM(Model-View-ViewModel)是一种前端架构模式,通过数据绑定实现视图(View)与数据模型(Model)的分离。ViewModel 作为中间层,负责处理业务逻辑和数据绑定,使开发者无需直接操作 DOM。

核心实现步骤

数据劫持(响应式数据)

通过 Object.definePropertyProxy 监听数据变化,触发更新逻辑。

function observe(data) {
  if (!data || typeof data !== 'object') return;
  return new Proxy(data, {
    get(target, key) {
      return target[key];
    },
    set(target, key, value) {
      target[key] = value;
      notifyUpdate(); // 触发视图更新
      return true;
    }
  });
}

模板编译

解析 HTML 模板中的指令(如 v-model{{}}),将数据绑定到视图。

function compile(el, vm) {
  const fragment = document.createDocumentFragment();
  let child;
  while (child = el.firstChild) {
    fragment.appendChild(child);
  }
  // 替换模板中的插值表达式
  const reg = /\{\{(.*?)\}\}/g;
  fragment.textContent = fragment.textContent.replace(reg, (match, key) => {
    return vm.data[key.trim()];
  });
  el.appendChild(fragment);
}

依赖收集与更新

实现一个简单的依赖管理器(Dep)和观察者(Watcher),在数据变化时通知视图更新。

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

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

双向绑定实现

通过 v-model 指令实现表单元素与数据的双向绑定。

function bindInput(el, vm, key) {
  el.addEventListener('input', (e) => {
    vm.data[key] = e.target.value;
  });
  new Watcher(vm, key, (value) => {
    el.value = value;
  });
}

完整示例

以下是一个极简的 MVVM 实现框架:

js 实现mvvm

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

// 使用示例
const vm = new MVVM({
  el: '#app',
  data: () => ({ message: 'Hello MVVM!' })
});

注意事项

  • 现代框架(如 Vue 3)使用 Proxy 替代 Object.defineProperty,性能更好且支持数组监听。
  • 实际项目中需处理复杂指令(如 v-for)、虚拟 DOM 等优化。
  • 可结合 Virtual DOM 库(如 Snabbdom)实现高效视图更新。

标签: jsmvvm
分享给朋友:

相关文章

vue实现mvvm

vue实现mvvm

Vue 实现 MVVM 模式 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 是其典型实现之一。MVVM 的核心是通过数据绑定和响应式系统实现视图与数据的自动同步。…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…