浅析MVC

96 阅读3分钟

mvc 设计模式

2022.2.28 zgn

  • 导航
  • 模块化编程
  • mvc 三个对象
  • 表驱动编程
  • eventBus
  • 其他补充内容

一、模块化编程

通常我们在刚刚初学前端的时候,会学到在HTML中利用 link 标签和 script 标签 引用css 和 js 文件 但是随着我们的代码越写越长,单个文件中的代码往往会杂乱不堪,出了bug无法快速定位,维护很困难,因此 我们要学习模块化编程的思想

1.index.html :<script src="main.js"> </script> 
//在HTML中只导入一个 main.js文件
2.main.js: import app1.js
           import app1.js
           import 全局.css
 //将代码按照不同功能写入到单个文件中,通过import导入到main.js中,
 3. app1.js:import app1.css
    app2.js:import app2.css
 //将各个模块的css引入到对应的js文件中
 
 /*在这里main相当一个过渡层,把各个功能不同的模块隔绝,互不影响,而且可以快速定位,后期无论是
 修改或者是删除都只需要在main文件中修改是否导入即可,不会影响到其他代码*/

二、MVC的三个对象

从最简单的字面意义上来看,MVC是对代码的进一步细化封装,我们将已经写好的代码封装在三个对象中

import $ from 'jquery'
const m={ data } //m 即 model 在这个对象中储存我们代码中需要使用的数据和操作数据的api

const v={  this.render=function() {}} // view 视图  将获取到的数据渲染到页面中,这部分实现我们在页面中能看到的东西

const c={  if (m.data>5){v.render()} } // controller 控制器   负责具体操作的实现  连接v和m

封装到对象中的代码互相不受影响,只通过内部定义的api调用,且分工明确 但是即使优化到这一步,我们任然会发现会有很多重复出现的代码,那就需要我们去更加细化封装代码,这就需要用到表驱动编程和everntBus

三、表驱动编程


function translate(term) {
    let terms = {
        '1': '一',
        '2': '二',
        '3': '三'
    }
    return terms[term];
}

// 如果想添加一个新的名词翻译,只需要在terms中添加一个新的表项,不需要修改整个逻辑
function translate(term) {
    let terms = {
        '1': '一',
        '2': '二',
        '3': '三'
        '4': '四'   // 添加一个新的名词翻译
    }
    return terms[term];
}

//避免出现
if(item===1){console.log('一'}
if(item===2){console.log('二'}
if(item===3){console.log('三'}

四、everBus

这块其实我理解的很差,但是我觉得,由于M V C 三个对象之间并没有什么联系(作用域),所以使用v来操作m会比较麻烦,尤其涉及到监控数据变化给出相应变化的函数等

eventBus是一种适用于对象直接通信的方式,从字面意思上看,用到了事件:

  1. 声明一个全局的对象,它包含on ,trigger等属性
  2. 利用on为m中的数据添加事件,监控数据是否发生变化,一但变化就调用在c中的teigger 回应一个相应的操作

五、其他

  • mvc并没有固定的概念,每个人的理解并不相同,有很多的演化版本
  • 当代码中的某个属性重复出现可以声明一个全局可用的类,然后利用继承来使用它
  • 如果代码中用到的某个库等,对全体代码都有影响,而且未来可能维护或更换,一定要设置一个过渡层,避免 直接作用到全体代码中,后面维护时,只需要修改过渡层就可以。