MVC 三个对象
- M-Model(数据模型),负责操作所有数据
- V-View(视图),负责所有UI界面
- C-Controller(控制器)负责其他
const m = {
data:{}//程序数据
create(){}//增
update(){}//改
get(){}//查
delete(){}//删
}
const v= {
el:页面元素
html:{}//页面的显示内容
init:()//初始化元素
render(){}//渲染
}
const c= {
init:()//初始化
BindEventss(){}//绑定事件
}
EventBus
eventBus 的作用主要是用来实现对象之间的通信,例如可以通过 eventBus 来实现 m、v、c 三个对象之间的通信。
EventBus的常用api:
on用于监听对象
const eventBus=$(window)
eventBus.on("监听事件",()=>{})
trigger用于触发对象
const eventBus=$(window)
eventBus.trigger("事件")
off用于取消对象监听
const eventBus=$(window)
eventBus.off("监听事件")
例如在MVC 中可以采用 eventBus来实现v对象随着m对象的数据的变化自动触发渲染
const eventBus = $(window) // 获取eventBus 对象
const m = {
data: {
...
},
update(data){
...
eventBus.trigger('m:updated') //触发事件
....
},
}
const v = {
...
render(n) {
}//渲染数据
}
const c = {
init(container) {
...
eventBus.on('m:updated',()=>{
v.render(m.data.n)
})//监听后渲染
}
}
表驱动编程
表驱动编程是一种编程模式,是从哈希表里查找信息而不是使用逻辑语句if…else…,原因是当逻辑简单时,用逻辑语句简单,且代码简短,但逻辑复杂时,逻辑语句就很麻烦,代码很长,这时候就应该使用表驱动编程
const c = {
init(container) {
v.init(container)
v.render(m.data.n)
c.autoBindEvents()
eventBus.on('m:updated',()=>{
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})
},
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) //view里面的v.el
}
}
}
模块化
模块化的本质其实就是帮助我们优化代码而产生的,像是一种归纳的方法,将原本零散的节点,结构分成不同模块,这些模块不仅相互独立、互不影响,又可以重复使用。借此来降低代码耦合度,减少重复代码,让代码结构更加清晰整洁,便于维护
JavaScript 主要通过 import 与 export 来进行模块化操作(详见MDN文档),如:
// 文件名name.js
const name = 'Jacky'
export {
name
}
// index.js
import { name } from './name.js'
console.log(name) // "jacky"