学习MVC有感

118 阅读1分钟

MVC是什么?

MVC(Model View Controller)是一种架构设计模式

M : model,即数据层(数据模型),负责操作所有的数据。

V :view,即视图层,负责所有UI界面,是提供给用户的操作界面,是程序的外壳。

C :Controller,即控制层,负责根据用户从“视图层”输入指令,选取“数据层中的数据”,对其进行相应操作(绑定事件等),产生最终结果。

Model 数据层

操作数据
const m = {
    data: {
    // 获取数据
    },
    create() {},
    delete() {},
    change(data) {},// 传入数据,并触发数据渲染事件来更新事件
    get() {},
}


View 视图层

渲染页面
const v = {
    el: null,
    html:'页面模板的字符串',
    init(container) {
        v.el = $(container) //  获取需要添加元素的地址
    },
    render(index) {
       //    渲染
    },
}

Controller 控制层

初始化 负责绑定事件
const c = {
    init(container) { // 初始化程序
        v.init(container)
        v.render(m.data.localIndex) // 第一次渲染 view= ranDer(data)
        c.autoBindEvent()
        eventBus.on('n:change',()=>{
            v.render(m.data.localIndex)
            localStorage.setItem('tab-index', m.data.localIndex)
        })
    },
    events: { // 需要绑定事件的元素
        'click .tab-bar li': 'x',
    },
    x(e){  // 事件执行内容
        const index= parseInt(e.currentTarget.dataset.index);
        m.change({localIndex:index})
    },
    autoBindEvent(){ // 自动绑定事件
        for (let key in c.events){
        const spaceIndex = key.indexOf(' ')
        // console.log( c[c.events[key]]);
        v.el.on(key.slice(0,spaceIndex),key.slice(spaceIndex+1),(e)=>{
            c[c.events[key]](e)
        })
        }
    },
    
}

EventBus

EventBus主要作用是负责获取到数据发生改变时,进行数据更新。所以它及其重要的api是绑定事件EventBus.on,触发事件EventBus.trigger()。

比如说通过按键进行加减的功能,首先是通过点击按键触发写在数据层的change函数,chang函数传入改变的数值,并触发 先前通过EventBus.trigger()设置的名为n:change的函数。EventBus.on()监听名为n:change的事件,一旦触发执行页面渲染程序,完成数据的更新。

表驱动编程

在《代码大全》对表驱动编程的描述:

表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句(if 或 case)来把他们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富于吸引力了。

我对表驱动的理解是一般用于雷同性高的代码,将雷同的代码去除,提取出重要的数据形成哈希表。再将其重组形成简洁又不重复的代码。

bindEvents(){
    c.ui.button1.on('click', () => {
        m.data.n += 1
        v.render()
        localStorage.setItem("number",  m.data.n)
    })
    c.ui.button2.on('click', () => {
        let result = parseInt($('#result').text())
        result = result - 1
        $('#result').text(result)
        localStorage.setItem("number", result)
    })
    c.ui.button3.on('click', () => {
        let result = parseInt($('#result').text())
        result = result * 2
        $('#result').text(result)
        localStorage.setItem("number", result)
    })
    c.ui.button4.on('click', () => {
        let result = parseInt($('#result').text())
        result = result / 2
        $('#result').text(result)
        localStorage.setItem("number", result)
    })
}



// 简化为

 events: {
        'click .add1': 'add',
        'click .minus1': 'minus',
        'click .mul2': 'mul',
        'click .divide2': 'div',
    },
    add() {
        m.change(m.data.n+1)
    },
    minus() {
        m.change(m.data.n-1)
    },
    mul() {
        m.change(m.data.n*2)
    },
    div() {
        m.change(m.data.n/2)
    },
    autoBindEvent(){
        for (let key in c.events){
        const spaceIndex = key.indexOf(' ')
        // console.log( c[c.events[key]]);
        v.el.on(key.slice(0,spaceIndex),key.slice(spaceIndex+1),()=>{
            c[c.events[key]]()
        })
        }
    },

如何理解模块化

一个页面最基础的需要index.html,main.js,style.css 三个文件。编写简单的页面时,不会太复杂,但是在编写页面上功能模块较多时,过了一段时间自己都看不懂写的是什么,很难进行修改维护。那么可以通过模块化思想,首先是将页面的各个部分进行模块化,分出来一个个小功能模块,在继续将小功能模块进行细分,分为数据层,视图层和控制层。虽然模块化在应用于简单页面时,复杂程度比直接写会多一些固定的步骤,但是其复杂度是恒定的,在应用于负载页面时,能够很好的区分代码和管理代码,方便日后维护。