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})
},
// end
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,这是一个空对象
const eventBus = $(window)
eventBus.on('m',()=>{})
常用的API 有 on(监听事件)、trigger(触发事件)、off(取消监听)
表驱动编程
发现代码重复后,可以将事件以及事件触发函数进行简化,通过使用哈希表将代码抽离出使其一一对应这就是表驱动编程(见C中的注释)
模块化
在我认为,前端的模块化就是讲代码进行抽离,通过接口与其他模块进行通信。使每个模块能够进行独立且互不影响,在需要用的时候进行代码代码调用。使用模块化可以避免命名冲突,需要什么模块加载什么模块。需要优化代码时,只需对该模块进行优化修改,不会使其他模块受到影响