浅析前端开发中的 MVC

874 阅读3分钟

一、MVC 、MVP、MVVM

MVC是一种编程概念,标准讲法是一种架构设计模式。它来源于后端,即前端借鉴后端的概念去组织或者设计前端的代码,导入模块化编程思想。

MVC拆解如下:

  • Model(数据模型) - 数据保存(数据相关都放到 m)
  • View(视图) - 用户界面(视图相关都放到 v-->view)
  • Controller(控制器) - 业务逻辑(其他都放到 c)

各个部分的伪代码实现:

Model

Model = {
    data:{程序需要操作的数据或信息},
    create:{增数据},
    delete:{删数据},
    update(data){
        Object.assign(m.data,data)//使用新数据替换旧数据
        eventBus.trigger("m.update")//eventBus触发"m:update"信息,通知View刷新
    },
    get:{获取数据}
}

View

View = {
    el:需要刷新的元素,
    html:`<div>显示在页面上的内容</div>`
    init(){
        v.el:需要刷新的元素
    }
    render(){渲染页面}
}

Controller

Controller = {
init(){
    v.init()//view初始化
    v.render()//第一次渲染
    c.autoBindEvent()//自动事件绑定
    eventBus.on("m:update",()=>{v.render()})//当eventBus触发"m:update"时View刷新
},
events:{事件以哈希表方式记录},
method(){
    data = 改变后的新数据
    m.update(data)
},
autoBindEvents(){自动绑定事件}
}EventBus

MVC各个部分之间的通信:M->V->C->M之间单向通信

  • view传送指令到control
  • control完成业务逻辑后,要求Model改变状态
  • Model将新的数据发送到view,用户得到反馈。

MVP

MVP模式将controller改名为presenter,同时改变了通信方向。代码大部分分布在presenter上。

moder和view之间不再通信,通过presenter进行双向通信。

  • M -> P-> V
  • M < P < V

MVVM

MVVM模式将presenter改名为viewmodel,基本上与MVP没有区别。 MVVM的特点是采用了双向绑定:View的变动,自动反映在viewmodel,反之亦然。V和M之间双向通信。 Angular和Ember都采用这种模式。

二、关于EventBus

eventBus主要用于对象间通信。它使得M和V,C互相不知道对方的细节,但是却可以调用对方的功能。即满足最小知识原则。

import $ from 'jquery'
class EventBus {
  constructor() {
    this._eventBus = $(window)//为了获取一个对象object,里面有on方法用来监听事件,获取trigger方法来触发事件,实现组件之间的通信。
  }

  on(eventName, fn) {//绑定事件
    return this._eventBus.on(eventName, fn)
  }

  trigger(eventName, data) {//trigger方法来触发事件
    return this._eventBus.trigger(eventName, data)
  }

  off(eventName, fn) {//事件解除绑定
    return this._eventBus.off(eventName, fn)
  }
}
export default EventBus

三、表驱动编程

表驱动编程,将数据部分就和代码部分分离了,尽量减少if else语句,函数主体只是去表中查找然后输出结果。 避免了代码量线性增长,保证代码结构的复杂度可控。

events: {
    "click #add1": "add", 
    "click #minus1": "minus",
    "click #mul2": "mul",
    "click #divide2": "div",
  }, //把一堆的事件绑定,变成一个Hash table

四、如何理解模块化

模块化就是代码重构,用尽可能加简洁明了的代码,实现同样的功能。

第一层:单个项目的代码分类。

把一个项目上的代码按照数据、视图、控制进行分类,分别归入M,V,C。

第二层:将通用代码模块化,便于复用于多个项目。

把M,V,C中的代码分别进行重构,把通用的代码存入M.js、V.js、C.js,用export/import导出导入功能导入相应的项目中。

例如新建Model.js

class Model{数据部分的通用代码}
export default Model;

导出

import Model from "./base/Model.js";

导入

代码模块化提高了代码的可复用性和可移植性,便于代码管理和代码的重构,提高了工作效率。