浅析MVC

83 阅读1分钟

MVC用于解决代码过于重复问题,优化代码结构。

一、MVC三个对象分别做什么?

  • M:Model(数据类型)负责操作数据
//和数据相关的都放到m
const m={
    //初始化数据
    data:{
        n:parseInt(localStorage.getItem('n'))
    },
    //数据的增删改查方法
    create(){},
    delete(){},
    update(data){
        Object.assign(m.data,data)
        eventBus.trigger('m:updated')
        localStorage.setItem('n',m.data.n)
    },
    get(){},
}
  • V:View(视图)负责所有UI界面
//和视图相关的都放到v
const v={
    el:null,
    //初始化html
    html:`
    <div>
        <div class="output">
            <span id="number">{{n}}</span>
        </div>
        <div class="actions">
            <button id="add1">+1</button>
            <button id="minus1">-1</button>
            <button id="mul2">*2</button>
            <button id="divide2">÷2</button>
        </div>
    </div>
    `,
    init(container){
        v.el=$(container)
        v.render()
    },
    render(n){
        if(v.el.children.length===0){
        }else{
            v.el.empty()
        }
        $(v.html.replace("{{n}}", n))
        .appendTo($(v.el))
    }
}
  • C:Controller(控制器)负责其他内容
//其他放在c
const c={
    init(container){
        //第一次渲染html
        v.init(container)
        v.render(m.data.n) //view=render(data)
        c.autoBindEvents()
        eventBus.on('m:updated',()=>{
            v.render(m.data.n)
        })
    },
    events:{
        'click #add1':'add',
        'click #minus1':'minus',
        'click #mul2':'mul',
        'click #divide2':'divide'
    },
    //实现加减乘除的方法
    add(){
        m.update({n:m.data.n+1})
    },
    minus(){
        m.update({n:m.data.n-1})
    },
    mul(){
        m.update({n:m.data.n*2})
    },
    divide(){
        m.update({n:m.data.n/2})
    },   
    autoBindEvents(){
        for(let key in c.events){
            const value=c[c.events[key]]
            const spaceIndex=key.indexOf(' ')
            const part1=key.slice(0,spaceIndex)
            const part2=key.slice(spaceIndex+1)
            v.el.on(part1,part2,value)
        }
    },
}

二、关于EventBus

  • EventBus是一个发布-订阅模式的事件总线,它优化了各组件间的通信
  • 主要有三个重要API,分别是on、trigger、off
import $ from 'jquery'

class EventBus{
    constructor(){
        this._eventBus=$(window)
    }
    //注册一个事件监听器,当指定事件被触发时,fn将执行
    on(eventName,fn){
        return this._eventBus.on(eventName,fn)
    }
    //触发一个事件,并且可以传递任意数量的参数给监听器函数
    trigger(eventName,data){
        return this._eventBus.trigger(eventName,data)
    }
    //移除一个事件监听器
    Off(eventName,fn){
        return this._eventBus.off(eventName,fn)
    }
}

export default EventBus

三、表驱动编程

  • 有大批类似但不重复的代码,只看重要数据,把重要数据做成哈希表
  • 即可以在表中查找信息,不必用逻辑语句(if/case)来查找
  • 表驱动编程的重要意义在于,逻辑与数据的分离

四、如何理解模块化

  • 简言之,模块化就是把相对独立、功能唯一且清晰的的代码,从冗杂的代码里抽取成一个个短小精悍的模块
  • 这些模块互不干扰,你我并不互知,仅提供接口供使用,方便管理和维护
  • 模块化是一种最小知识原则的抽象思维,即知道的内容越少越好,各司其职