浅析MVC

180 阅读3分钟

1. MVC三个对象分别做什么?

M:模型(Model):数据保存
V:视图(View):用户界面
C:控制器(Controller):业务逻辑
各部分的伪代码实现:

Model

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

View

View = {
    el:需要刷新的元素,
    html:`<h1>MVC</h1>...显示在页面上的内容`
    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

2. EventBus 有哪些 API,它们有哪些功能

DOM的事件机制就是发布订阅模式最常见的实现,这大概是前端最常用的编程模型了,监听某事件,当该事件发生时,监听该事件的监听函数被调用。eventBus就是实现发布订阅模式的一种方法。
其实jQuery和Vue构造出来的对象都有监听事件的方法,我们只需要构造一个对象,然后调用他的on和trriger方法实现组件之间的通信。
下面介绍几个Vue常用的事件api及其内部实现。

  • $on事件的订阅
$on(eventName,callback)
//参数1:事件名称   参数2:事件函数
//判断当前事件名称是否存在,如果不存在创造一个key值为事件名称
//value为一个数组 将callback push到数组中

const eventList = {};
const $on = (eventName, callback) =>{
    if(!eventList[eventName]){
        eventList[evenName] = [];
    }
    eventList[eventName].push(callback)
}
  • $off事件的解绑
$off(eventName,[callback])
//参数1:事件名称    参数2:[事件函数]
//判断当前事件名称是否存在,如果存在继续判断第二个参数是否存在,如果存在则找打相对应的下标,然后将函数在数组中移除
//如果不存在则将整个数组清空

const eventList = {};
const $off = (eventName,callback)=>{
    if(eventList[eventName]){
        if(callback){
            let index = eventList[eventName].indexOf(callback);
            eventList[eventName].splice(index,1)
        }
    }else{
        eventList[eventName].length = 0;
    }
}

export default = {
    $on,
    $emit,
    $off
}
  • $emit事件的触发
$emit(evnetName,[params])
//参数1:事件名称    参数2:[需要传递的参数]
//判断当前事件的名称是否存在,如果存在则遍历数组,得到所有的函数并执行。
//然后将params当作实参传递到函数中去

const eventList = [];
cosnt $emit = (eventName,params) => {
    if(eventList[eventName]){
        let arr = eventList[eventName];
        arr.map((cb)=>{
            cb(params)
        })
    }
}

3.表驱动编程

首先从以下简单的例子感受表驱动编程

function age(name){
    if(name==="小明"){
        console.log("年龄是"+10)
    }else if(name==="小白"){
        console.log("年龄是"+14)
    }else if(){
    
    }
    //...等等
}

假如我们写一个查询年龄的函数,如果用if else语句写,那么有多少人就得写多少个if else语句,这样我们的代码量是线性增长的,如果我们用一个哈希表来记录这些映射关系会怎样?

const list ={
    "小明":10,
    "小白"14//等等...
}
function age(name){
    if(name in list){
        console.log(name+"的年龄是"+list[name])
    }else{
        console.log("查无此人")
    }
}

这样,我们的数据就和代码部分分离了。函数主体只是去表中查找然后输出结果,这就是表驱动编程的基本思想。

4. 如何理解模块化

为了实现代码的可复用性,便于管理及可移植性,以及防止作用域冲突等,模块化是历史的必然。因为人们厌倦重复,所以衍生出了MVC,把一个页面上的不同部分的功能分离,把一个页面上的不同部分的功能分离,把一个功能的数据,视图,控制分离。