浅析MVC

88 阅读1分钟
  1. MVC

MVC (Model-View-Controller) 是一种软件设计模式.它强调分离软件的业务逻辑和显示. 这种“分离”提供了更好的分工和改进的维护。

Model: 模型持有所有的数据、状态和程序逻辑

View: 负责界面的布局和显示

Controller: 负责模型和界面之间的交互

   <script>
   // controller
   Animal = {
    start : function() {
     this.view.start();//从视图触发
    },
    set : function(animalName) {
        this.model.setAnimal(animalName);
        //controller 改变 model 
    }
   };
   // model
   Animal.model = {
    animalDictionary : {
     car : 'meows',
     fish : 'swims',
     bird : 'flies'
    },
    currentAnimal : null,
    setAnimal : function(name) {
     this.currentAnimal = this.animalDictionary[name] ? name : null;
     this.onchange();
    },
    onchange : function() {
        Animal.view.update();
        //model传递结果到View(个人觉得这里可以由Controller来专递,最好不要直接操作视图)
    },
    }
   };
   // view
   Animal.view = {
    start : function() {
        document.getElementById('setAnimal').onchange = this.onchange;
        //视图绑定事件
    },
    onchange : function() {
        Animal.set(document.getElementById('setAnimal').value);
        //视图执行操作,调用Controller
    },
   };
   Animal.start();//入口

 </script>
  1. EventBus EventBus又成为事件总线,专门用于通信,以使用 EventBus 来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件。

EventBus的 API最重要的两个 API是 on()监听事件,trigger()触发事件

const evensBus=$(window)   //定义
update(data){
    Object.assign(m.data,data)
    evensBus.trigger('m:updated') //触发事件
    localStorage.setItem('index',m.data.index)
  },
  
  evensBus.on('m:updated', () => { //监听事件
      v.render(m.data.index)
    })
    
  1. 表驱动编程是做什么的

表驱动编程是从大量相似的代码中抽取出本质的东西,组成哈希表,利用表进行编程,以减少重复代码。

例如我们一般写事件可能是这样写

    $button1.on("click", () => {
      let n = parseInt($number.text());
      n += 1;
      localStorage.setItem("n", n);
      $number.text(n);
    });
    $button2.on("click", () => {
      let n = parseInt($number.text());
      n -= 1;
      localStorage.setItem("n", n);
      $number.text(n);
    });
    $button3.on("click", () => {
      let n = parseInt($number.text());
      n *= 2;
      localStorage.setItem("n", n);
      $number.text(n);
    });
    $button4.on("click", () => {
      let n = parseInt($number.text());
      n /= 2;
      localStorage.setItem("n", n);
      $number.text(n);
    });

如果改用表驱动编程,提高了代码的可读性,减少了重复代码,同时也降低了复杂度。

   events:{
       'click #button1':'add',
       'click #minus1':'minus',
       'click #mul2':'mul',

     },
    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})
    },
    autoBindbindEvents(){
      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)
      }
    }
  1. 我如何理解模块化

将一些公共的代码抽成一个文件,再去引用这个文件,只需要暴露出接口让别的模块去引用就可以,而不用考虑文件内部做什么。这样做模块的独立性高,而且在需要用到对应功能引用模块,而不用多次重复代码。

参考: www.javanx.cn/20190705/vu… www.cnblogs.com/chinajava/p…