当前位置:首页 > JavaScript

js 实现mvc

2026-04-03 23:11:08JavaScript

实现 MVC 模式的 JavaScript 示例

MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的数据、用户界面和控制逻辑。以下是 JavaScript 实现 MVC 的核心方法:

模型(Model)部分

模型负责管理数据和业务逻辑。通常包含数据操作和事件通知机制。

class Model {
  constructor() {
    this.data = {};
    this.listeners = [];
  }

  setData(key, value) {
    this.data[key] = value;
    this.notify(key);
  }

  getData(key) {
    return this.data[key];
  }

  addListener(listener) {
    this.listeners.push(listener);
  }

  notify(key) {
    this.listeners.forEach(listener => listener.update(key));
  }
}

视图(View)部分

视图负责显示数据和接收用户输入。它订阅模型的变化并更新显示。

js 实现mvc

class View {
  constructor(model, controller) {
    this.model = model;
    this.controller = controller;
    this.element = document.getElementById('app');
    this.model.addListener(this);
  }

  render() {
    const data = this.model.getData('message');
    this.element.innerHTML = `<div>${data || ''}</div>
      <button id="changeBtn">Change Message</button>`;
    this.element.querySelector('#changeBtn')
      .addEventListener('click', () => this.controller.handleClick());
  }

  update(key) {
    if (key === 'message') {
      this.render();
    }
  }
}

控制器(Controller)部分

控制器处理用户输入并更新模型。

class Controller {
  constructor(model) {
    this.model = model;
  }

  handleClick() {
    this.model.setData('message', 'New Message at ' + new Date().toLocaleTimeString());
  }
}

初始化应用

将各组件连接起来创建完整应用:

js 实现mvc

const model = new Model();
const controller = new Controller(model);
const view = new View(model, controller);

view.render();

替代实现方案

使用观察者模式简化模型和视图的通信:

// 简化版模型
class SimpleModel {
  constructor() {
    this._data = {};
    this._callbacks = {};
  }

  on(event, callback) {
    this._callbacks[event] = callback;
  }

  set(key, value) {
    this._data[key] = value;
    if (this._callbacks[key]) {
      this._callbacks[key](value);
    }
  }
}

// 使用示例
const simpleModel = new SimpleModel();
simpleModel.on('text', value => {
  document.getElementById('output').textContent = value;
});

document.getElementById('input').addEventListener('input', (e) => {
  simpleModel.set('text', e.target.value);
});

使用现代框架的MVC

现代前端框架如React/Vue/Angular已经内置了MVC-like结构:

  • React: 组件作为视图,状态作为模型,事件处理作为控制器
  • Vue: 数据绑定自动处理模型-视图同步,方法作为控制器
  • Angular: 明确的组件(视图)、服务(模型)和组件类(控制器)分离

这些实现展示了如何在纯JavaScript中构建MVC架构,从基础实现到优化版本,以及与现代框架的对比。核心思想始终是分离关注点,使数据管理、用户界面和业务逻辑保持独立。

标签: jsmvc
分享给朋友:

相关文章

js实现跑马灯

js实现跑马灯

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

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js 实现文件上传

js 实现文件上传

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。以下是一个基础示例: <input ty…

js实现筛选

js实现筛选

JavaScript 实现数据筛选的方法 使用 Array.filter() 方法 Array.filter() 是 JavaScript 中最常用的筛选方法,它会创建一个新数组,包含通过回调函数测试…

js sort 实现

js sort 实现

数组排序基础方法 JavaScript 数组的 sort() 方法默认按照字符串 Unicode 码点顺序排序。直接调用时会将元素转为字符串再比较: const arr = [10, 2, 5, 1…

js实现vue弹窗

js实现vue弹窗

实现 Vue 弹窗的基本方法 使用 Vue.js 实现弹窗功能可以通过组件化方式完成。以下是一个简单的弹窗实现示例,包含显示/隐藏控制、内容插槽和基础样式。 弹窗组件代码 创建 Modal.vue…