当前位置:首页 > 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等机制

扩展方案

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

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

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

js mvc 实现

标签: jsmvc
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swip…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="my…