MVC是什么
-
MVC(Model-View-Controller)模式是软件工程中的是一种架构设计模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。MVC这一理念来源于后端的框架构建思想,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到同一个部件里面,在改进和个性化定制界面及用户交互的同时,无需再重新编写业务逻辑。
-
Model-数据模型:负责操作所有数据,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。
// Model层 let Model = { data:{ }; // 需要用到的数据 create:{ }; // 增数据 delete:{ }; // 删数据 update:{ }; // 更新数据 get:{}; // 获取数据 } -
View-视图:负责所有UI界面的布局和显示,用于处理控制器里的HTML资料并且将它们插入DOM中,能够实现数据有目的的显示以及访问它监视的数据模型。
// View层 let View = { el:null, html:`......` // 视图模板 init(){ }, // 初始化页面 render(){ } // 刷新页面 } -
Controller-控制器:负责连接视图和模型,用于处理业务逻辑操作&处理事件并做出响应。
// Controller层 let Controller = { init() { v.init() // 初始化View v.render() // 第一次渲染页面 c.autoBindEvents() // 自动的事件绑定 eventBus.on('m:update', () => { v.render() } // 当EventsBus触发'm:update'时,View刷新 } events: { }, // 事件以哈希表的方式记录存储 method() { data = // 改变后的新数据 m.update(data) } autoBindEvents() { }; // 自动绑定事件 }
EventBus是什么
-
EventBus即事件总线,可以简化组件之间的监听和通信。当 Model 模块中的数据更新,触发了 EventBus 上的某个事件,而 Controller 恰好在监听这个事件,na那么这个事件触发时,Controller 就知道 Model 中的数据发生了更新了,从而做出相应反应。
-
Eventbus的API
-
EventBus.on()监听事件:当m:updated触发时,执行一些内容EventBus.on(eventName,callback) // 参数1-事件名,参数2-事件函数 const eventList = {}; EventBus.on = (eventName,callback)=>{ if(!eventList[eventName]){ eventList[eventName] = [] } eventList[eventName].push(callback) // 判断事件名存在与否,若不存在则创建一个key值为事件名 } -
EventBus.trigger()触发事件:当一个事件执行,eventBus 触发m:updatedEventBus.trigger(eventName,[params]) // 参数1-事件名称 参数2-[需要传递的参数] const eventList = {}; EventBus.trigger = (eventName,params)=>{ if(eventList[eventName]){ let arr = eventList[eventName]; arr.map((cb)=>{ cb(params) }) } // 判断当前事件的名称是否存在,如果存在则遍历数组,得到所有的函数,并执行,然后将params当做实参传递到函数中去 } -
EventBus.off()解绑事件:取消监听EventBus.off(eventName,[callback]) // 参数1-事件名称,参数2-[事件函数] const eventList = {}; EventBus.off = (eventName,callback)=>{ if(eventList[eventName]){ if(callback){ let index = eventList[eventName].indexOf(callback); eventList[eventName].splice(index,1) } }else{ eventList[eventName].length = 0; // 如果不存在则将整个数组清空 } //判断当前事件名称是否存在,如果存在继续判断第二个参数是否存在,如果存在则找到相对应的下标,然后将函数在数组中移除 }
-
表驱动编程
-
一种编程模式,从表里面查找信息而不使用逻辑语句(if 和case)。凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。
-
使用方式:
- 直接访问:将数据作为键值直接访问表
- 索引访问:先用一个基本数据类型的数据从一张索引表中查出一个键值,然后再用这一键值查出你需要的主数据。
- 当表的数据与键值不一致时,可以:(1)复制表的数据使其与键值一一对应,变成直接访问;(2)创建一个索引,与表数据对应,查询时将键值转换成索引,变成索引访问。
-
举个例子
// 设置日期 const day = new Date().getDay() let day_zh; if (day === 0) { day_zh = '1号' }else if (day === 1) { day_zh = '2号' } ... else { day_zh = '31号' }; case 0: day_zh = '1号' break; case 1: day_zh = '2号' break;... } // 把这些数据存到一张表里面,简单方便。 const mouth = ['1号', '2号',..., '31号'] const day = new Date().getDay() const day_zh = mouth[day]
模块化
- 模块化是将一个复杂的程序依据一定的规范封装成几个块/文件并进行组合。模块内部数据的实现是私有的,只是向外部暴露一些接口从而可以跟外部其他模块通信。将代码模块化就是将代码分门别类归纳好,同种功能的代码放在一起归置好,待到要使用时再引入这段代码,就不需要重复写相同逻辑的代码了。
- 三个模块之间不会相互影响;多个View能共享一个Model,提高代码的可重用性;Controller 是自包含的对象,与 Model 和 View 保持相对独立,可以方便的改变应用程序的数据层和业务规则,从而提高了应用程序的灵活性和可配置性。