浅析 MVC

106 阅读1分钟

MVC 三个对象分别做什么,给出伪代码示例

  • M:数据模型(Model)
const m={
    data:{},//数据源
    create:{},
    delete:{},
    update(data){
        Object.assign(m.data,data)//用新数据替换旧数据
        eventBus.trigger('m:update')//eventBus触发事件
    },
    get:{}
}
  • V:视图(View)
const v={
    el:null,
    html:``
    init(container){
        v.el:$(container)
    },
    render(){//刷新页面
    }
}
  • C:控制器(Controller)
const c={
    init(){
        v.init()//初始化View
        v.render()
        c.autoBindEvents()
        eventBus.on('m:update',()=>{v.render()}//
    },
    events:{},
    method(){},
    autoBindEvents(){}
}

EventBus 有哪些 API,是做什么用的,给出伪代码示例

EventBus.on()//监听事件
EventBus.trigger()//触发事件
EventBus.off()//取消监听

用于模块间的通讯, view组件层面,父子组件、兄弟组件通信都可以使EventBus处理

class EventBus {
    constructor() {
        this._eventBus = $(window)
    }
    on(eventName, fn) {
        return this._eventBus.on(eventName, fn)
    }
    trigger(eventName, data) {
        return this._trigger.trigger(eventName, data)
    }
    off(eventName, fn) {
        return this._eventBus.off(eventName, fn)
    }
}
export default EventBus

表驱动编程是做什么的(可以自己查查资料)

表驱动法是一种编程模式(scheme)——从表里面查找信息而不使用逻辑语句(if和case)。
可以减少重复代码,如以下代码重复率高:

bindEvents(){
  v.el.on('click', '#add1', () => {
    m.data.n += 1
    v.render(m.data.n)
  })
  v.el.on('click', '#minus1', () => {
    m.data.n -= 1
    v.render(m.data.n)
  })
  v.el.on('click', '#mul2', () => {
    m.data.n *= 2
    v.render(m.data.n)
  })
  v.el.on('click', '#divide2', () => {
    m.data.n /= 2
    v.render(m.data.n)
  })
}

我们可以改写为:

events: {
  'click #add1' : 'add',
  'click #minus1' : 'minus',
  'click #mul2' : 'mul',
  'click #divide2' : 'div'
},
add() {
  m.update( data: {n: m.data.n +1})
},
minus() {
  m.update( data: {n: m.data.n -1})
},
mul() {
  m.update( data: {n: m.data.n *2})
},
div() {
  m.update( data: {n: m.data.n /2})
}

我是如何理解模块化的

我理解的模块化是每个模块都是是独立的文件,例如完成一个简易的计算器功能,我们可以分成好几个部分分别进行操作,这个程序文件内部的所有变量,使用export default xxx输出就可以让其他文件获取。这样做的好处就是不会使代码过于冗杂,重复多次的代码也可以总结起来放在一起,这种分模块管理,也更加便于修改和优化。