zoukankan      html  css  js  c++  java
  • vue-mvvm

    对于mvvm的理解

    1. 框架

      1. 框架是大智慧,用来对软件设计进行分工;
      2. 设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。
      3. 常见框架:
        1. Spring后端框架、vue前端框架
    2. 框架模式

      1. MVC、MVP、MVVM等等
    3. 设计模式

      1. 发布订阅模式、观察者模式等等
    4. mvvm:

      1. 它是一种基于前端开发的架构模式
      2. MVVM 是 Model-View-ViewModel 的缩写。即模型-视图-视图模型
      3. Model代表数据模型,【模型】指的是后端传递的数据
      4. View 代表UI视图,【视图】指的是所看到的页面
      5. ViewModel ,【视图模型】mvvm模式的核心,监听Model中数据的改变和控制View层的展现
      6. 在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互通信,【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据响应式,【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。
      7. ViewModel通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定
    5. 为什么会出现 MVVM 呢?

      1. MVC 即 Model-View-Controller 的缩写,就是 模型—视图—控制器,也就是说一个标准的Web 应用程式是由这三部分组成的:

          View :用来把数据以某种方式呈现给用户

          Model :其实就是数据

          Controller :接收并处理来自用户的请求,并将 Model 返回给用户

      2. 在HTML5 还未火起来的那些年,MVC 作为Web 应用的最佳实践是OK 的,这是因为 Web 应用的View 层相对来说比较简单,前端所需要的数据在后端基本上都可以处理好,View 层主要是做一下展示,那时候提倡的是 Controller 来处理复杂的业务逻辑,所以View 层相对来说比较轻量,就是所谓的瘦客户端思想

      3. 相对 HTML4,HTML5 最大的亮点是它为移动设备提供了一些非常有用的功能,使得 HTML5 具备了开发App的能力, HTML5开发App 最大的好处就是跨平台、快速迭代和上线,节省人力成本和提高效率,因此很多企业开始对传统的App进行改造,逐渐用H5代替Native,到2015年的时候,市面上大多数App 或多或少嵌入都了H5 的页面。既然要用H5 来构建 App, 那View 层所做的事,就不仅仅是简单的数据展示了,它不仅要管理复杂的数据状态,还要处理移动设备上各种操作行为等等。因此,前端也需要工程化,也需要一个类似于MVC 的框架来管理这些复杂的逻辑,使开发更加高效。 但这里的 MVC 又稍微发了点变化:

          View :UI布局,展示数据

          Model :管理数据

          Controller :响应用户操作,并将 Model 更新到 View 上

      4. 这种 MVC 架构模式对于简单的应用来看是OK 的,也符合软件架构的分层思想。 但实际上,随着H5 的不断发展,人们更希望使用H5 开发的应用能和Native 媲美,或者接近于原生App 的体验效果,于是前端应用的复杂程度已不同往日,今非昔比。这时前端开发就暴露出了三个痛点问题:

        1. 开发者在代码中大量调用相同的 DOM API,处理繁琐 ,操作冗余,使得代码难以维护。

        2. 大量的DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。

        3. 当 Model 频繁发生变化,开发者需要主动更新到View ;当用户的操作导致 Model 发生变化,开发者同样需要将变化的数据同步到Model 中,这样的工作不仅繁琐,而且很难维护复杂多变的数据状态。

          其实,早期jquery 的出现就是为了前端能更简洁的操作DOM 而设计的,但它只解决了第一个问题,另外两个问题始终伴随着前端一直存在。

      5. MVVM 的出现,完美解决了以上三个问题。

        1. MVVM 由 Model、View、ViewModel 三部分构成,Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。

          在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。

      6. Vue.js 的细节

        1. Vue.js 可以说是MVVM 架构的最佳实践,专注于 MVVM 中的 ViewModel,不仅做到了数据双向绑定,而且也是一款相对来比较轻量级的JS 库,API 简洁,很容易上手。Vue的基础知识网上有现成的教程,此处不再赘述, 下面简单了解一下 Vue.js 关于双向绑定的一些实现细节:

            Vue.js 是采用 Object.defineProperty 的 getter 和 setter,并结合观察者模式来实现数据绑定的当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

        2.   Observer :数据监听器,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者,内部采用Object.defineProperty的getter和setter来实现
            Compile :指令解析器,它的作用对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
            Watcher :订阅者,作为连接 Observer 和 Compile 的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数
            Dep :消息订阅器,内部维护了一个数组,用来收集订阅者(Watcher),数据变动触发notify 函数,再调用订阅者的 update 方法


          从图中可以看出,当执行 new Vue() 时,Vue 就进入了初始化阶段,一方面Vue 会遍历 data 选项中的属性,并用 Object.defineProperty 将它们转为 getter/setter,实现数据变化监听功能;另一方面,Vue 的指令编译器Compile 对元素节点的指令进行扫描和解析,初始化视图,并订阅 Watcher 来更新视图, 此时Wather 会将自己添加到消息订阅器中(Dep),初始化完毕。
          当数据发生变化时,Observer 中的 setter 方法被触发,setter 会立即调用Dep.notify(),Dep 开始遍历所有的订阅者,并调用订阅者的 update 方法,订阅者收到通知后对视图进行相应的更新。

    6. 与mvc的区别

    7.   1. MVC的全称是Model-View-Controller,模型-视图-控制器,**整个结构分成三层**:
        
        2. https://img-blog.csdn.net/20180317211040496
        
        3. 最上面一层,视图层(View):用户界面(UI)
        
           ● 最底层,是核心的“数据层”:保存数据
        
           ● 中间层,控制层(Controller):处理业务逻辑,负责根据用户从“视图层”输入的指令,选取“数据层”的数据,然后对其进行相应的操作,产生最终的结果
        
           各部分的通信方式如下:
        
           https://img-blog.csdn.net/20180317211308256
        
        4. A、View传送指令到Controller
        
           B、Controller完成业务逻辑后,要求Model改变状态
        
           C、Model将新的数据发送到View,用户得到反馈
        
           所有通信都是单向的。
      
    8. 数据绑定

    9. 单向数据绑定

    10. 双向数据绑定

    11. 如何实现

      1. https://segmentfault.com/a/1190000006599500
      2. https://www.cnblogs.com/chenhuichao/p/10280486.html
      3. http://www.html-js.com/article/Study-of-twoway-data-binding-JavaScript-talk-about-JavaScript-every-day
      4. https://blog.csdn.net/u013282174/article/details/51220199
      5. https://www.jianshu.com/p/b0aab1ffad93
      6. https://www.cnblogs.com/chris-oil/p/6359901.html
      7. https://blog.csdn.net/weixin_33709590/article/details/88835451
      8. https://www.cnblogs.com/goloving/p/8520030.html
      9. https://blog.csdn.net/aa67567456/article/details/113063840
  • 相关阅读:
    使用doctest单元测试方式培训讲解:Python字符串格式化(适合测试工程师的学习方法)
    树莓派Raspberry中成功安装RobotFramework+Selenium
    树莓派Raspberry实践笔记-安装使用minicom
    树莓派Raspberry实践笔记-解决官方文档打开慢问题
    window电脑蓝屏
    fastjson基本用法
    自定义注解
    curl工具
    观察者模式
    工厂模式
  • 原文地址:https://www.cnblogs.com/ycyc123/p/14312895.html
Copyright © 2011-2022 走看看