MVC 是一种架构设计模式,通过关注点分离鼓励改进应用程序组织。由于前端开发的环境特性,在 MVC 模式上引申出了许多 MV* 模式。这些模式都是为了对重复代码的重构和类似页面的代码封装。
MVC 是什么
- 模型 model ,用于封装与应用程序的业务逻辑相关的数据以及数据的处理方法,会有一个或多个视图监听这个模型。一旦模型的数据发生变化,模型将通知有关的视图。
const model = {data: null,get() {data: 获取的数据},set(data) {更新 data 数据触发数据响应事件 eventBus.trigger()}}
- 视图 view,负责所有的 UI 界面,描绘 model 当前状态。
const view = {el: null,html: `UI界面html`,init() {初始化 elrender(model.data)},render(data) {刷新页面html}}
- 控制器 controller ,处理用户的行为和数据 model 的改变。
const controller = {init(container) {初始化视图绑定数据响应 eventBus.on()},events: {设置事件和函数绑定},// 实现每个事件函数autoBindEvents() {for (let key in c.events){对每个键进行动态绑定事件}}}
EventBus
eventBus 通常是一个 jquery 全局对象,通过 const eventBus = $(window) 实现一个 eventBus ,常用的 api 有 on() 、 trigger() 、 off() 。
eventBus.on(eventName, fn) // 绑定一个函数事件eventBus.trigger(eventName, data) // 响应对应绑定函数事件名的函数eventBus.off(eventName,fn) // 注销对应绑定函数事件名的函数
表驱动编程
表驱动编程,实际就是对大量类似且重复的代码,其重要的数据做成哈希表的编程方式。例如:数据-逻辑分离。
// model 的数据操作封装constructor(options) {const keys = ['data', 'create', 'update', 'delete', 'get']keys.forEach(key => this[key] = options[keys])}
模块化
Javascript 程序本来很小——在早期,它们大多被用来执行独立的脚本任务,在你的 web 页面需要的地方提供一定交互,所以一般不需要多大的脚本。过了几年,我们现在有了运行大量 Javascript 脚本的复杂程序,还有一些被用在其他环境(例如 Node.js)。
从业务角度来看,一个项目就是由各个模块组合而成的。从技术上去实现功能的复用,Node.js 已经提供这个能力很长时间了,对前端而言,目前的方案是前端模块化:将功能打包为模块,发布至内部中央仓库,使用方通过自己的方式导入模块包使用。
