浅析MVC

85 阅读3分钟

MVC的三个对象

MVC是一种架构模式,它包含3个对象,分别是M,V,C,如下:

  • M-Model(数据模型): 负责操作所有数据

  • V-View (视图): 负责所以的IU界面

  • C-Controller (控制器): 负责其他

M-Model

  • 获取数据,对数据进行增删改查,用于后期操作数据。
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-View

  • 视图主要是渲染到页面上
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);
  }, //初始化
  render(n) {
    if (v.el.children.length !== 0) v.el.empty();
    $(v.html.replace("{{n}}", n)).appendTo(v.el);
  }, //渲染 
通过if else判断容器的后代是否存在进行增删,最后渲染到页面
};

C-Controller

  • 控制器里面主要放些事件的操作,负责处理 View 的事件,并更新Model,也负责监听 Model 的变化,并更新 View , Controller 控制其他所有流程
const c = {
  //初始化
  init(container) {
    v.init(container);
    v.render(m.data.n); //第一次渲染页面
    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);
    }
  },
};
 

EventBus

  • EventBus主要用于对象间通信,EventBus是事件总线的意思,它是Google Guava库的一个工具,基于观察者模式可以做到进程内的代码解耦作用。

优势

  • 简化了组件间的通讯。

  • 分离了事件的发送者和接受者。

  • 在Activity、Fragment和线程中表现良好。

  • 避免了复杂的和易错的依赖关系和生命周期问题。

  • 使得代码更简洁,性能更好。

  • 更快,更小(约50k的jar包)。

EventBus 有哪些API?

  • on: 监听事件

  • trigger: 触发事件

  • off:取消事件

代码示例

import $ from 'jquery'

class EventBus {
  constructor() {
    this._eventBus = $(window)
  }

  on(eventName, fn) {
    return this._eventBus.on(eventName, fn)
  }

  trigger(eventName, data) {
    return this._eventBus.trigger(eventName, data)
  }

  off(eventName, fn) {
    return this._eventBus.off(eventName, fn)
  }
}

export default EventBus

表驱动编程

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

  • 表驱动编程的意义在于逻辑与数据的分离。( 类似于事件委托
const c = {......

events: {
    "click #add1": "add",
    "click #minus1": "minus",
    "click #mul2": "mul",
    "click #divide2": "div",
  },  //页面上excel表格
  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);
    }
  },
};

我是如何理解模块化?

  • 模块化就是根据不同节点、结构分成不同模块,每个模块可以重复使用,且发现有错误时便于修改,降低了代码耦合度,减少重复代码,使得项目结构更加清晰,便于使用。

efe.baidu.com/blog/mvc-de…