当前位置:首页 > JavaScript

js mvc 实现

2026-02-28 23:41:08JavaScript

MVC 模式简介

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

JavaScript 实现 MVC 的核心组件

模型(Model)

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

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)

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

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等机制

扩展方案

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

js mvc 实现

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

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

标签: jsmvc
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…