MVC是一种设计模式
使用MVC进行代码优化,将代码分为三个模块
分别为 M(负责数据):Model 数据模型,提供要展示的数据
V(负责识图):View 负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西
C(负责其他事情):Controller 接收用户请求,委托给模型进行处理,处理完毕后把返回的模型数据返回给视图,由视图负责展示。
M: 对数据进行增删改查
const m = {data: {n : localStorage.getItem('n')},create() {},//增delete() {},//删update(data) {Object.assign(m.data, data)eventBus.trigger('m:updated')localStorage.setItem('n', m.data.n)},//改get() {}, //查}
V: 进行页面渲染
const v = {el : null ,//创建一个空的容器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)}, //初始化容器rander() // 执行渲染}
C: 放一些事件的操作,如:click、on等等;
const c = {init(container){ // 初始化容器v.init(container)v.rander()c.autoBindEvents() //事件绑定eventBus.on('m:updated', () => {console.log('here')v.render(m.data.n)} // 监听,然后重新渲染},// 从这里起 就是表驱动编程events: { //通过哈希表来列出事件'click #add1': 'add','click #minus1': 'minus','click #mul2': 'mul','click #divide2': 'div'},// 事件操作函数add() {m.update({n: m.data.n + 1})},minus() {m.update({n: m.data.n - 1})},mul() {m.update({n: m.data.n * 2})},div() {m.update({n: m.data.n / 2})},// endautoBindEvents() {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,这是一个空对象const eventBus = $(window)eventBus.on('m',()=>{})
常用的API 有 on(监听事件)、trigger(触发事件)、off(取消监听)
表驱动编程
发现代码重复后,可以将事件以及事件触发函数进行简化,通过使用哈希表将代码抽离出使其一一对应这就是表驱动编程(见C中的注释)
模块化
在我认为,前端的模块化就是讲代码进行抽离,通过接口与其他模块进行通信。使每个模块能够进行独立且互不影响,在需要用的时候进行代码代码调用。使用模块化可以避免命名冲突,需要什么模块加载什么模块。需要优化代码时,只需对该模块进行优化修改,不会使其他模块受到影响
