浅析 MVC

103 阅读3分钟

1. MVC 三个对象分别做什么

MVC模式(Model–view–controller)是一种设计模式(或者软件架构),把系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

1.Model 数据管理,主要负责和服务器进行交互。将请求到的数据传给Controller。

2.View 负责用户界面,HTML 渲染。

3.Controller 负责监听并处理View 的事件,更新和调用 Model;也负责监听 Model的变化(Model从服务器获得数据),并更新 View。Controller 控制其他所有流程。

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() {}
}

const v = {
  el: null,
  html: `
  <div>
    <div class="output">
      <span id="number">{{n}}</span>
    </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)
  }
}

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: {
  },
  add() {
  },
  minus() {
  },
  mul() {
  },
  div() {
  },
  autoBindEvents() {
  
  }
}

2. EventBus 有哪些 API,是做什么用的

EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。
有三个API\

  1. eventBus 提供了 on、off 和 trigger 等 API,on 用于监听事件,trigger 用域触发事件\
  2. eventBus 主要用于对象间通信\
  3. 使用 eventBus 可以满足最小知识原则,m 和 v 互相不知道对方的细节,但是却可以调用对方的功能
    on:监听函数
    trigger:触发函数
    off:取消监听函数
    const e= new EventBus; e.on(); e.trigger() e.off();

表驱动编程是做什么的

表驱动编程的意义在于逻辑与数据的分离。( 类似于事件委托 代码大全中是这样解释的:

表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句(if 或 case)来把他们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,表就变得越来越富于吸引力了。

function translate(term) {
    if (term === '1') {
        return '一'
    } else if (term === '2') {
        return '二'
    } else if (term === '3') {
        return '三'
    } else if (term === '4') {   
        // 此处添加了一个新的名词翻译
        return '四'
    } else {
        return '???'  
    }
}

// 表驱动
function translate(term) {
    let terms = {
        '1': '一',
        '2': '二',
        '3': '三'
        '4': '四'   // 添加一个新的名词翻译
    }
    return terms[term];
}

1. 我是如何理解模块化的

函数封装

其实简单理解一个函数可以理解成一个单独的模块, 每个函数有自己的独立的功能互补影响 比如说

  • a(){return 'name'} 方法是一个获取 名称的方法
  • b(){return 'money'} 方法获取钱的
  • c(){return 'time'} 方法获取时间的 这三个方法可以暂时理解成一个单独的模块, 与其他函数没有关联 , 谁需要就可以自己去使用, 或者借用 , 模块化就是把一个功能拆分成不同的小功能, 然后功能去实现和划分, 需要用到什么功能再去引入, 相同的功能只需要写一次就好了