一、MVVM概述

1.1、什么是MVVM

MVVM(Model-View-ViewModel)是一种软件设计模式,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于Java Applet,简单点说就是在浏览器上运行WPF)的架构师Ken Cooper和Ted Peters开发,是一种简化用户界面的事件驱动编程方式。由John Gossman(同样也是WPF和Sliverlight的架构师)与2005年在他的博客上发表。

MVVM源自于经典的MVC(Model-View-Controller)模式。MVVM的核心是ViewModel层,负责转换Model中的数据对象来让数据变得更容易管理和使用。其作用如下:

  • 该层向上与视图层进行双向数据绑定
  • 向下与Model层通过接口请求进行数据交互

​ MVVM已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。当下流行的MVVM框架有Vue.jsAnfular JS

1.2、为什么要使用MVVM

MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处
  好处

  • 1、低耦合:视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  • 2、可复用:你可以把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。
  • 3、独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewMode),设计人员可以专注于页面设计。
  • 4、可测试:界面素来是比较难以测试的,而现在测试可以针对ViewModel来写。

View

View是视图层, 也就是用户界面。前端主要由HTHL和csS来构建, 为了更方便地展现viewmodel或者Hodel层的数据, 已经产生了各种各样的前后端模板语言, 比如FreeMarker,Thymeleaf等等, 各大MVVM框架如Vue.js.Angular JS, EJS等也都有自己用来构建用户界面的内置模板语言。

Model

Model是指数据模型, 泛指后端进行的各种业务逻辑处理和数据操控, 主要围绕数据库系统展开。这里的难点主要在于需要和前端约定统一的接口规则

ViewModel

ViewModel是由前端开发人员组织生成和维护的视图数据层。在这一层, 前端开发者对从后端获取的Model数据进行转换处理, 做二次封装, 以生成符合View层使用预期的视图数据模型。
  需要注意的是View Model所封装出来的数据模型包括视图的状态和行为两部分, 而Model层的数据模型是只包含状态的

  • 比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示)
  • 页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交互)

视图状态和行为都封装在了View Model里。这样的封装使得View Model可以完整地去描述View层。由于实现了双向绑定, View Model的内容会实时展现在View层, 这是激动人心的, 因为前端开发者再也不必低效又麻烦地通过操纵DOM去更新视图。
  MVVM框架已经把最脏最累的一块做好了, 我们开发者只需要处理和维护View Model, 更新数据视图就会自动得到相应更新,真正实现事件驱动编程
  View层展现的不是Model层的数据, 而是ViewModel的数据, 由ViewModel负责与Model层交互, 这就完全解耦了View层和Model层, 这个解耦是至关重要的, 它是前后端分离方案实施的重要一环。

二、Vue

Vue(读音/vju/, 类似于view) 是一套用于构建用户界面的渐进式框架, 发布于2014年2月。与其它大型框架不同的是, Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层, 不仅易于上手, 还便于与第三方库(如:vue-router,vue-resource,vue x) 或既有项目整合。

2.1、MVVM模式的实现者

  • Model:模型层, 在这里表示JavaScript对象
  • View:视图层, 在这里表示DOM(HTML操作的元素)
  • ViewModel:连接视图和数据的中间件, Vue.js就是MVVM中的View Model层的实现者

在MVVM架构中, 是不允许数据和视图直接通信的, 只能通过ViewModel来通信, 而View Model就是定义了一个Observer观察者

  • ViewModel能够观察到数据的变化, 并对视图对应的内容进行更新
  • ViewModel能够监听到视图的变化, 并能够通知数据发生改变

至此, 我们就明白了, Vue.js就是一个MVVM的实现者, 他的核心就是实现了DOM监听数据绑定

2.2、为什么要使用Vue.js

  • 轻量级, 体积小是一个重要指标。Vue.js压缩后有只有20多kb(Angular压缩后56kb+,React压缩后44kb+)
  • 移动优先。更适合移动端, 比如移动端的Touch事件
  • 易上手,学习曲线平稳,文档齐全
  • 吸取了Angular(模块化) 和React(虚拟DOM) 的长处, 并拥有自己独特的功能,如:计算属性
  • 开源,社区活跃度高
  • ……

三、第一个Vue程序

【说明】IDEA可以安装Vue的插件!

注意:Vue不支持IE 8及以下版本, 因为Vue使用了IE 8无法模拟的ECMAScript 5特性。但它支持所有兼容ECMAScript 5的浏览器。

3.1、下载地址

  • 开发版本

    • 包含完整的警告和调试模式:https://yuejs.org/js/vue.js
    • 删除了警告, 30.96KBmin+gzip:https://vuejs.org/js/vue.min.js
  • CDN
    • <script src=“https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.js”></script>

    • <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> 这两个已经变了,用下边这个 min压缩版

3.2、代码编写

Vue.js的核心是实现了MVVM模式, 她扮演的角色就是View Model层, 那么所谓的第一个应用程序就是展示她的数据绑定功能,操作流程如下:

  1. 创建一个HTML文件

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title><!--1.导入Vue.js--><script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script></head>
    <body><!--view层 模板-->
    <div id="app">{{message}}
    </div><script type="text/javascript">var vm=new Vue({el: "#app",// MOdel:数据data: {message: "hello vue!"}});
    </script></body>
    </html>
    

  2. 引入Vue.js

    <!--1.导入Vue.js-->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    
  3. 创建一个Vue实例

    <script type="text/javascript">var vm=new Vue({el: "#app",// MOdel:数据data: {message: "hello vue!"}});
    </script>
    

    说明:

    • el: '#vue':绑定元素的ID
    • data:{message:'Hello Vue!'}:数据对象中有一个名为message的属性,并设置了初始值 Hello Vue!
  4. 将数据绑定到页面元素

    <!--view层,模板-->
    <div id="app">{{message}}
    </div>
    

    说明:只需要在绑定的元素中使用双花括号将Vue创建的名为message属性包裹起来, 即可实现数据绑定功能, 也就实现了View Model层所需的效果, 是不是和EL表达式非常像?

3.3、完整的HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--1.导入Vue.js--><script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> </head>
<body><!--view层 模板-->
<div id="app">{{message}}
</div><script type="text/javascript">var vm=new Vue({el: "#app",// MOdel:数据data: {message: "hello vue!"}});
</script></body>
</html>

3.4、测试

为了能够更直观的体验Vue带来的数据绑定功能, 我们需要在浏览器测试一番, 操作流程如下:

  1. 在浏览器上运行第一个Vue应用程序, 进入开发者工具

  2. 在控制台输入vm.message=‘HelloWorld’, 然后回车, 你会发现浏览器中显示的内容会直接变成HelloWorld

  3. 此时就可以在控制台直接输入vm.message来修改值, 中间是可以省略data的, 在这个操作中, 我并没有主动操作DOM, 就让页面的内容发生了变化, 这就是借助了Vue的数据绑定功能实现的; MV VM模式中要求View Model层就是使用观察者模式来实现数据的监听与绑定, 以做到数据与视图的快速响应。

四、Vue基本语法

1、v-bind

  • 我们已经成功创建了第一个Vue应用!看起来这跟渲染一个字符串模板非常类似, 但是Vue在背后做了大量工作。现在数据和DOM已经被建立了关联, 所有东西都是响应式的。我们在控制台操作对象属性,界面可以实时更新!

  • 我们还可以使用v-bind来绑定元素特性!

    用于绑定数据和元素属性 v-bind:属性
    例如:绑定a标签的href属性

    <div class="app"><a v-bind:href="url">click me</a>
    </div>
    
  • 上代码

    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
    <head><meta charset="UTF-8"><title>Title</title></head>
    <body><!--view层,模板-->
    <div id="app"><span v-bind:title="message">鼠标悬停几秒钟查看此处动态绑定的提示信息!</span>
    </div><!--1.导入Vue.js-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script type="text/javascript">var vm = new Vue({el:"#app",/*Model:数据*/data:{message: '页面加载于 ' + new Date().toLocaleString()}});
    </script>
    </body>
    </html>
  • 你看到的v-bind等被称为指令。指令带有前缀v以表示它们是Vue提供的特殊特性。可能你已经猜到了, 它们会在渲染的DOM上应用特殊的响应式行为在这里,该指令的意思是:“将这个元素节点的title特性和Vue实例的message属性保持一致”。

  • 如果你再次打开浏览器的JavaScript控制台, 输入app.message=‘新消息’,就会再一次看到这个绑定了title特性的HTML已经进行了更新。

2、v-if, v-else

什么是条件判断语句,就不需要我说明了吧,以下两个属性!

  • v-if

  • v-else

  • 上代码

    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body><!--view层,模板-->
    <div id="app"><h1 v-if="ok">Yes</h1><h1 v-else>No</h1>
    </div><!--1.导入Vue.js-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
    <script type="text/javascript">var vm = new Vue({el:"#app",/*Model:数据*/data:{ok: true}});
    </script>
    </body>
    </html>
    

测试:
1.在浏览器上运行,打开控制台!
2.在控制台输入vm.ok=false然后回车,你会发现浏览器中显示的内容会直接变成NO
  注:使用v-*属性绑定数据是不需要双花括号包裹的

v-else-if

  • v-if

  • v-else-if

  • v-else

  • 注:===三个等号在JS中表示绝对等于(就是数据与类型都要相等)上代码:

    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <!--view层,模板-->
    <div id="app"><h1 v-if="type==='A'">A</h1><h1 v-else-if="type==='B'">B</h1><h1 v-else-if="type==='D'">D</h1><h1 v-else>C</h1>
    </div>
    <!--1.导入Vue.js--><script src="https://unpkg.com/vue/dist/vue.js"></script><script type="text/javascript">var vm = new Vue({el:"#app",/*Model:数据*/data:{type: 'A'}});</script>
    </body>
    </html>
    

3、v-for

v-for

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"><head><meta charset="UTF-8"><title>Title</title></head><body><!--view层,模板--><div id="app"><li v-for="item in items">  <!--在li里边,li循环,本例li循环两次-->{{item.message}}      <!--若放在ul里边,ul循环--></li></div><!--1.导入Vue.js--><script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script type="text/javascript">var vm = new Vue({el:"#app",/*Model:数据*/data:{items: [{message:"张三"},{message:"李四"}]}});</script>
</body>
</html>

再加一个index属性,index自带的属性 索引的意思

<div id="app"><li v-for="(item,index) in items">{{item.message}}---{{index}}</li>
</div>
  • 注:items是数组,item是数组元素迭代的别名。我们之后学习的Thymeleaf模板引擎的语法和这个十分的相似!

  • 上代码:

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <!--view层,模板-->
    <div id="app"><li v-for="(item,index) in items">{{item.message}}---{{index}}</li></div><!--1.导入Vue.js-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
    <script type="text/javascript">var vm = new Vue({el:"#app",/*Model:数据*/data:{items:[{message:'狂神说Java'},{message:'狂神说前端'},{message:'狂神说运维'}]}});
    </script>
    </body>
    </html>
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTBI0lLh-1621221640205)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1621042533074.png)]

  • 测试:在控制台输入vm.items.push({message:'狂神说运维'}),尝试追加一条数据,你会发现浏览器中显示的内容会增加一条狂神说运维.

    v-on监听事件

  • emsp;事件有Vue的事件、和前端页面本身的一些事件!我们这里的click是vue的事件, 可以绑定到Vue中的methods中的方法事件!

  • 上代码

    <!DOCTYPE html>
    <html lang="en"  xmlns:v-on="http://www.w3.org/1999/xhtml">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body><!--view层,模板-->
    <div id="app"><button v-on:click="sayHi">click me</button>
    </div><!--1.导入Vue.js-->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
    <script type="text/javascript">var vm = new Vue({el:"#app",/*Model:数据*/data:{message: "你好!!"},methods: {  //方法必须定义在vue的methods对象中,v-on:事件 event要写上sayHi: function (event) {//this在方法中指向vue实例alert(this.message);}}});
    </script>
    </body>
    </html>
  • 点击测试
    Vue还有一些基本的使用方式, 大家有需要的可以再跟着官方文档看看, 因为这些基本的指令几乎我们都见过了,一通百通!掌握学习的方式!

Mvvm、第一个Vue程序、Vue基本语法相关推荐

  1. 【Vue笔记一】 第一个Vue程序及其语法

    官网介绍:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,不仅易于上手,还 ...

  2. 一个Java程序猿眼中的前后端分离以及Vue.js入门

    原文:https://mp.weixin.qq.com/s/HWRYAR16vLE1XFep6_i1tA 松哥的书里边,其实有涉及到 Vue,但是并没有详细说过,原因很简单,Vue 的资料都是中文的, ...

  3. vue脚手架v-cli,第一个vue程序

    运行在node服务器上的vue程序 1. v-cli安装 2. 使用webpack构建vue程序 3. 目录介绍 4. webpack将vue打包成js文件 1. v-cli安装 在玩v-cli vu ...

  4. java mvc mvvm_从MVC到MVVM(为什么要用vue)

    axios 功能类似于jQuery.ajax. axios.post() axios.get() axios.put() axios.patch() axios.delete() 比jQuery.aj ...

  5. 自学Vue之路——Vue介绍及基本语法

    今日内容概要 前端发展介绍 Vue的快速使用 插值语法 指令系统之文本指令 指令系统之事件指令 指令系统之属性指令 前端发展介绍 HTML(5).CSS(3).JavaScript(ES5.ES6.E ...

  6. vue详细知识,语法和必备知识

    文章目录 目录 1.vue简介 1.1 vue是什么 1.2 Vue的特点 1.3 学习Vue之前需要掌握哪些JavaScript基础知识 1.4 初识vue需要知道的地方 2. vue的核心基础 2 ...

  7. 【猿说VUE】初试模板语法,开启VUE编码之旅

    模板语法 官网描述: Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的 ...

  8. 一个niubility的Vue游戏,真厉害!

    点击上方"程序员黑叔",选择"置顶或者星标" 期待你的关注! 用Vue.Vuex 做俄罗斯方块 本项目灵感来源于 React 版的俄罗斯方块,由于对其实现原理较 ...

  9. 一个niubility的Vue游戏,真厉害!(收藏)

    点击上方"程序员黑叔",选择"置顶或者星标" 期待你的关注! 用Vue.Vuex 做俄罗斯方块 本项目灵感来源于 React 版的俄罗斯方块,由于对其实现原理较 ...

最新文章

  1. 顶会ASPLOS 新成果解析:用“弹性异构”防御DNN加速器对抗攻击
  2. 有人问我:除了机房工程,你还懂什么?我笑了
  3. 重新认识二级指针(Pointers to Pointers)
  4. 吴恩达老师的机器学习和深度学习课程笔记打印版
  5. HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)
  6. linux系统中常见的目录,Linux系统中常见的目录名称以及相应内容
  7. 【Jmeter篇】jmeter+Ant+Jenkins实现自动化测试集成(一)
  8. servlet容器开发要点
  9. oracle中结果集合并
  10. Tomcat爆出严重漏洞,影响所有版本,波及约8万台服务器,附解决方案!(扩散!!!)...
  11. 疫情下企业面临的关键网络安全建设,去繁从简,保住核心安全
  12. 【字符串匹配】BF算法
  13. 拉取 gcr.io 镜像,如 Kubernetes,istio 等
  14. 2020-10-26可转债新规
  15. 点击切换图标(收藏和取消收藏)
  16. 通俗讲解:什么是Web
  17. Python中的pass的作用
  18. 2010-2020年和讯网分行业社会责任指数
  19. Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题
  20. JZOJ5462. 【NOIP2017提高A组冲刺11.8】好文章

热门文章

  1. [转载] 常用应届生Java开发笔试面试题(更新中)
  2. inputstream示例_Java InputStream close()方法与示例
  3. mysql语句数据库_数据库的Mysql语句
  4. html侧滑菜单mui,mui侧滑菜单点击含有mui-action-menu类的控件无法实现侧滑
  5. c ++ stl_获取列表的第一个和最后一个元素| C ++ STL
  6. 废弃fastjson!大型项目迁移Gson保姆级实战
  7. 表单reset无法重置hidden的解决方案
  8. centos linux7 系统安装
  9. NodeJS知识汇总
  10. python 列表索引位置,python – 在列表中查找值的第一个位置