MVC浅析

267 阅读3分钟

最近学些了mvc,这里简单做一下总结 MVC包括三类对象,将他们分离以提高灵活性和复用性。

模型model用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,会有一个或多个视图监听此模型。一旦模型的数据发生变化,模型将通知有关的视图。

视图view是它在屏幕上的表示,描绘的是model的当前状态。当模型的数据发生变化,视图相应地得到刷新自己的机会。

控制器controller定义用户界面对用户输入的响应方式,起到不同层面间的组织作用,用于控制应用程序的流程,它处理用户的行为和数据model上的改变。

M数据 获取数据n;对数据暴露出增删改查四个API,用于后期操作数据。

const m = {
  data: {
    n: parseInt(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: `//生成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)
  },//初始化容器
  render(n) {
    if (v.el.children.length !== 0) v.el.empty()
    $(v.html.replace('{{n}}', n))
      .appendTo(v.el)
  }//通过if else判断容器的后代是否存在进行增删,最后渲染到页面
}

C控制器 C里面主要是放一些事件的操作,如:click、on等等;这里面又设计到EventBus、表驱动编程等等。

const c = {
//初始化容器
  init(container) {
    v.init(container)
    v.render(m.data.n) // view = render(data)
    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})
  },
  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)
    }
  }
}

export default c

上面就是我们把index.html、css、js通过MVC进行改写,让代码由面条式变成了万金油(也就是模块化);下面我们来说说C里面涉及到EventBus、表驱动编程。

EventBus 一种设计模式或框架,主要用于组件/对象间通信的优化简化。

二. eventBus (一)API

on off emit (trigger) (二)使用方法

1.绑定事件 eventBus.on()

eventBus.on("eventName",callback)

//参数依次为 事件名,回调函数名

2.触发事件 eventBus.emit()

eventBus.emit("eventName",[...args])
//参数依次为 事件名 参数数组

3.解绑事件 eventBus.off()

eventBus.off("eventName",callback)
//参数依次为 事件名,回调函数名

三. 表驱动编程 (一)定义:

表驱动法是一种编程模式(scheme)——从表里面查找信息而不使用逻辑语句(if和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越发杂,查表法也就愈发显得更具吸引力。

(二)表编程的优点

提高了程序的可读性。一个消息如何处理,只要看一下驱动表就知道,非常明显。 减少了重复代码。 降低了复杂度。 程序有一个明显的主干。 降低了复杂度。

四、什么是模块化 什么是模块化? 模块化就是为了减少系统耦合度,提高高内聚,减少资源循环依赖,增强系统框架设计。 让开发者便于维护,同时也让逻辑相同的部分可复用 模块化开发:针对js、css,以功能或业务为单元组织代码。js方面解决独立作用域、依赖管理、 api暴露、按需加载与执行、安全合并等问题,css方面解决依赖管理、组件内部样式管理等问题。