当前位置:首页 > JavaScript

js mvc 实现

2026-02-28 23:41:08JavaScript

MVC 模式简介

MVC(Model-View-Controller)是一种软件架构模式,将应用程序分为三个核心组件:模型(Model)负责数据逻辑,视图(View)负责展示,控制器(Controller)处理用户输入和协调模型与视图。

JavaScript 实现 MVC 的核心组件

模型(Model)

模型负责管理数据、业务逻辑和规则。通常包含数据获取、存储和验证方法。

js mvc 实现

class Model {
  constructor(data) {
    this.data = data;
  }
  update(data) {
    this.data = { ...this.data, ...data };
    // 触发数据变更通知
  }
  getData() {
    return this.data;
  }
}

视图(View)

视图负责渲染用户界面,监听用户交互,但不处理业务逻辑。

class View {
  constructor(templateId) {
    this.template = document.getElementById(templateId).innerHTML;
  }
  render(data) {
    const compiled = this.template.replace(/{{(\w+)}}/g, (_, key) => data[key]);
    document.getElementById('app').innerHTML = compiled;
  }
}

控制器(Controller)

控制器作为中介,接收用户输入并更新模型或视图。

js mvc 实现

class Controller {
  constructor(model, view) {
    this.model = model;
    this.view = view;
    // 绑定模型变更监听
    this.model.onUpdate(() => this.view.render(this.model.getData()));
  }
  handleUserAction(input) {
    this.model.update(input); // 触发模型更新
  }
}

完整实现示例

以下是一个简单的待办事项列表(Todo List)实现:

模型定义

class TodoModel {
  constructor() {
    this.todos = [];
    this.listeners = [];
  }
  addTodo(text) {
    this.todos.push({ text, completed: false });
    this.notify();
  }
  onUpdate(callback) {
    this.listeners.push(callback);
  }
  notify() {
    this.listeners.forEach(cb => cb(this.todos));
  }
}

视图定义

class TodoView {
  constructor() {
    this.form = document.getElementById('todo-form');
    this.list = document.getElementById('todo-list');
  }
  render(todos) {
    this.list.innerHTML = todos.map(todo => `
      <li class="${todo.completed ? 'completed' : ''}">
        ${todo.text}
      </li>
    `).join('');
  }
  bindAddTodo(handler) {
    this.form.addEventListener('submit', event => {
      event.preventDefault();
      const input = this.form.querySelector('input');
      handler(input.value);
      input.value = '';
    });
  }
}

控制器连接

class TodoController {
  constructor(model, view) {
    this.model = model;
    this.view = view;
    this.view.bindAddTodo(this.handleAddTodo.bind(this));
    this.model.onUpdate(todos => this.view.render(todos));
  }
  handleAddTodo(text) {
    if (text.trim()) {
      this.model.addTodo(text);
    }
  }
}

初始化应用

const app = new TodoController(
  new TodoModel(),
  new TodoView()
);

关键注意事项

  • 单向数据流:确保数据流动方向为 View → Controller → Model → View
  • 事件解耦:使用观察者模式或发布订阅模式实现模型与视图的通信
  • 职责分离:避免在视图中包含业务逻辑或在模型中操作DOM
  • 现代框架对比:React/Vue等框架虽受MVC启发,但采用更高效的虚拟DOM等机制

扩展方案

对于复杂应用,可考虑以下改进:

  • 使用模块化组织代码(ES Modules)
  • 引入状态管理库(如Redux)处理跨组件数据
  • 实现路由控制器管理不同视图
  • 添加中间件机制处理控制器逻辑

以上实现展示了MVC模式在纯JavaScript中的核心思想,实际项目中可根据需求调整架构细节。

标签: jsmvc
分享给朋友:

相关文章

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

php实现mvc

php实现mvc

PHP 实现 MVC 架构 MVC(Model-View-Controller)是一种常用的软件设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller…

js类实现

js类实现

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

利用js实现

利用js实现

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

js实现投球

js实现投球

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

mvc elementui

mvc elementui

MVC 与 Element UI 的关系 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心部分:模型(数据逻辑)、视图(用户界面)和控制器(业务逻辑)。E…