浅析MVC

206 阅读2分钟
  • M model(数据模型) 负责操作数据
  • V view(视图) 负责视觉界面
  • C controller(控制器) 负责业务逻辑等其他操作

将网页相关的JS代码,分成以上三个部分(以对象形式储存),这样代码可以拥有较清晰的逻辑,可读性增强。

//M Model
const m = {
    data: {
        n: 
    },
    create(){},
    delete(){},
    update(){},
    get(){},
}
//V View
const v = {
    el: null,
    html: `
      <div>

      </div>
`,
    init(container) {
        v.container = $(container)                     
    },
    render: (n) => {
    }
}
//C Controller
const c = {
    init(container) {                      
        v.init(container)
        v.render(m.data.n)
    },
    add() {
        m.update({n:m.data.n +1})
    },
    min() {
        m.update({n:m.data.n -1})
    },
    mul() {
        m.update({n:m.data.n * 2})
    },
    div() {
        m.update({n:m.data.n /2})
    }
}

eventBus

有时,三个模块之间需要通信。比如当M模块的data数据发生变化时,想让C模块监听到该变化事件,方可进行相应的渲染操作。

此时便需要用到eventBus进行模块间通信,

获取一个空对象/windowsJQuery对象,

在C模块为该对象绑定一个自定义事件的监听,

然后在M模块方法data变化后,调用该对象的trigger('自定义事件')方法,

便可实现模块间的通信。

具体代码如下。

const eventBus = $({})  

const m = {
    data: {
    },
    
    update(data){
        Object.assign(m.data,data)
        eventBus.trigger('data-update')
    },
}
const c = {
    init(container) {      
        eventBus.on('data-update',()=>{
            v.render(m.data.n)
        })
    },
}

表驱动编程

所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值。

在数值不多的时候我们可以用逻辑语句(if 或case)的方法来获取值,但随着数值的增多逻辑语句就会越来越长,此时表驱动法的优势就显现出来了。

若需要给大量的对象绑定事件,一个个绑定会出现大量重复的代码,不够优雅,效率也不高。

可以将绑定对象 事件类型,方法写在一个表里,一一映射。

再对该表进行遍历处理,便可进行事件绑定。

这样的好处显而易见,由于表内元素样式的统一,需要更改事件监听时,只需要增删改查表里的数据,相比于第一种方式则需要进行大量的代码 增删,表驱动事半功倍。

 event: {
        "click #add1": `add`,
        "click #minus1": `min`,
        "click #mul2": `mul`,
        "click #divide2": `div`,
    },
    add() {
        m.update({n:m.data.n +1})
    },
    min() {
        m.update({n:m.data.n -1})
    },
    mul() {
        m.update({n:m.data.n * 2})
    },
    div() {
        m.update({n:m.data.n /2})
    },
    autoBindEvents() {
        for (let key in c.event) { 
            const spaceIndex = key.indexOf(" ")
            const event = key.slice(0, spaceIndex)
            const ele = key.slice(spaceIndex + 1)
            v.container.on(event, ele, () => {
                c[c.event[key]]()
            })
        }
    }
}

对模块化的理解

模块化(modular)编程,是强调将计算机程序(网页)的功能分离成独立的、可相互改变的“模块”(module)的软件设计技术,它使得每个模块都包含着执行预期功能的一个 唯一 方面(aspect)所必需的 所有 东西。

不进行模块化编程的代码,复用性几乎没有。

模块化可以大大提高代码的可复用性,提高了编程效率。

前端模块化即是将单独功能的数据,视觉界面,操作相关模块囊括在一个JS文件里(JS文件实现对CSS的引用),这使得别人想调用该功能时,只需要引入该JS文件,传入指定的参数,调整一下暴露的接口,便可以复用该功能。

网页功能模块化的代码复用时,在个性化方面可能有点欠缺,即完全符合自己的预期不太容易,但是可以大大提升效率。