最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 浅析 MVC

    正文概述 掘金(马达加斯加算法)   2021-05-03   572

    MVC 三个对象分别做什么?

    MVC是一种设计模式,所有的页面都可以使用 MVC来优化代码结构,MVC包括三类对象,将他们分离以提高灵活性和复用性。

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

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

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

    伪代码

    const m ={
      data:数据
      update(){
      数据的更新
      }
    }
    const v = {
       html:页面加载
       init() {初始化数据}
       render(){
       数据发生变化后刷新视图
       }
    }
    
    const c = {
    绑定事件,响应用户操作
    }
    
    

    代码

    import $ from 'jquery'
    
    const eventBus = $(window)
    // 数据相关都放到m
    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: `
      <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)
      }
    }
    // 其他都放在c
    const c = {
      init(container) {
        v.init(container)
        v.render(m.data.n) // view = render(data)
        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)
        }
      }
    }
    
    

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

    EventBus 主要用于对象间的通信,EventBus基本的API有on(监听事件),trigger(触发事件), off(取消监听)方法。

    //伪代码
    eventBus.trigger('xxx') //触发事件xxx
    eventBus.on('xxx', function())  //监听到xxx 执行function()
    eventBus.off('xxx')  //取消监听xxx
    

    表驱动编程是做什么的?

    所谓表驱动法(Table-Driven Approach),是指用直接查表的方法获取值,而不通过(if else) 逻辑判断,实现逻辑和数据的分离。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。

    //代码示例如下
    bindEvents(){
      const pause = () => {}
      const play = () => {}
      const slow = () => {}
      const normal = () => {}
      const fast = () => {}
      document.querySelector('#btnPause').onclick = pause
      document.querySelector('#btnPlay').onclick = play
      document.querySelector('#btnSlow').onclick = slow
      document.querySelector('#btnNormal').onclick = normal
      document.querySelector('#btnFast').onclick = fast
    }
    
    // 用表驱动法简化代码,易于扩展和重用,只需更改表数据即可
      events:{
        '#btnPause':'pause',
        '#btnPlay':'play',
        '#btnSlow':'slow',
        '#btnNormal':'normal',
        '#btnFast':'fast'
      },
      bindEvents: () => {
        for(let key in player.events){
          if(player.events.hasOwnProperty(key)){
            document.querySelector(key).onclick = player[player.events[key]]
          }
        }
      }
    

    如何理解模块化?

    模块化就是把功能较多的整体划分成多个更细小的功能模块,每个模块间都是独立的,相互不影响,这样的代码维护起来更方便,不需要知道整体怎样,只需要知道这个模块的知识即可,复用性也更强。


    起源地下载网 » 浅析 MVC

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元