MVVM(Model-View-ViewModel)是一种软件架构设计模式,由微软WPF(用于替代WinForm,以前就是用这个技术开发桌面应用程序的)和Silverlight(类似于Java Applet,简单点说就是在浏览器上运行的 WPF)的架构师Ken Cooper和Ted Peters开发,是一种简化用户界面的事件驱动编程方式。由John Gossman(同样也是WPF和Silverlight的架构师)于2005年在他的博客上发表。
MVVM源自于经典的 MVC(Model-View-Controller)模式。MVVM的核心是ViewModel层,负责转换 Model中的数据对象,来让数据变得更容易管理和使用,其作用如下:
Vue技术是MVVM开发模式的实现者。
MVC ------> M (model) V (view) C (controller)
MVVM ----> M (model) V (view) VM (viewmodel:连接视图和数据的中间件)
MVVM已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。当下流行的MVVM框架有Vue.js , Angular Js等。
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大好处
View是视图层,也就是用户界面。前端主要由HTML和css来构建,为了更方便地展现ViewModel或者Model层的数据,已经产生了各种各样的前后端模板语言,比如 FreeMarker、Thymeleaf 等等,各大 MVVM框架如Vue.js,AngularJS,EJS等也都有自己用来构建用户界面的内置模板语言。
Model是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开。这里的难点主要在于需要和前端约定统一的接口规则。
ViewModel是由前端开发人员组织生成和维护的视图数据层。在这一层,前端开发者对从后端获取的Model数据进行转换处理,做二次封装,以生成符合View层使用预期的视图数据模型。
需要注意的是ViewModel所封装出来的数据模型包括视图的状态和行为两部分,而Model层的数据模型是只包含状态的
视图状态和行为都封装在了ViewModel里。这样的封装使得ViewModel可以完整地去描述View层。由于实现了双向绑定,ViewModel的内容会实时展现在View层,这是激动人心的,因为前端开发者再也不必低效又麻烦地通过操纵DOM去更新视图。
MVVM框架已经把最脏最累的一块做好了,我们开发者只需要处理和维护ViewModel,更新数据视图就会自动得到相应更新,真正实现事件驱动编程。
View层展现的不是 Model层的数据,而是ViewModel的数据,由ViewModel负责与 Model层交互,这就完全解耦了View层和 Model层,这个解耦是至关重要的,它是前后端分离方案实施的重要一环。
换言之,VM的实现原理:
view model中内置了一个观察者,这个观察者观察两个维度
1) 观察视图的变化: 当视图变了,就通知数据进行变化
2)观察数据的变化: 当数据变了,就通知视图进行变化
—— MVVM通过VM实现了双向数据绑定
这是一种加速策略,能够从离自己最近的服务器上快速的获得外部的资源。
Vue(读音/vju'/,类似于view)是一套用于构建用户界面的渐进式框架,发布于2014年2月。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库(如:vue-router:跳转,vue-resource:通信,vuex:管理)或既有项目整合
Vue:一款渐进式JavaScript框架,所谓渐进式就是逐步实现新特性的意思,如实现模块化开发、路由、状态管理等新特性,其特点是综合了Angular(模块化)和React(虚拟 DOM)的优点
总结一句话:Vue是一个渐进式的js框架,只注重视图层,结合了HTML+CSS+JS,非常的易用,并且有很好的生态系统,而且vue体积很小,速度很快,优化很到位。
官网: 介绍 — Vue.js
在MVVM架构中,是不允许 数据 和 视图 直接通信的,只能通过ViewModel来通信,而ViewModel就是定义了一个 Observer观察者
至此,我们就明白了,Vue.js 就是一个MVVM的实现者,它的核心就是实现了DOM监听与数据绑定
轻量级,体积小是一个重要指标。Vue.js 压缩后有只有20多kb(Angular压缩后56kb+,React压缩后44kb+)
移动优先。更适合移动端,比如移动端的Touch事件
易上手,学习曲线平稳,文档齐全
吸取了Angular(模块化)和React(虚拟DOM)的长处,并拥有自己独特的功能,如:计算属性
开源,社区活跃度高
……
如何获得vue的cdn文件:vue (v3.2.26) - Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。 | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务
如何在页面中使用vue,两个部分:
html: < div id="app" > < /div >
需要有一个Vue对象(实例)
vue对象里有哪些东西,分别是什么用?
new Vue({
el:'' 该vue对象绑定在哪个div上
data:{
提供数据的,里面存放键值对
}
})
在html的被vue绑定的元素中,通过插值表达式来获取vue对象中的数据
欢迎你!年龄是{{age}}的{{name}}
差值表达式是用在html中被绑定的元素中的。
目的是通过差值表达式来获取vue对象中的属性和方法。
语法格式: {{vue的内容}},注意 差值表达式不能写在html的标签中,不能作为属性的值的部分。
vue对象中的属性是哪里提供?
new Vue({
data:{} <--- 这个data就提供了属性--->
})
vue对象中的方法是哪里提供?
new Vue({
methods:{ <-- 这个methods就是提供方法的 -->
sayHi:function(){
alert("hello vue");
}
}
});
除此之外,差值表达式也能够这么使用:
{{ [0,1,2,3,4][1] }}
{{ {name:'xiaoming',age:20}.name }}
【说明】IDEA可以安装Vue的插件!
注意:Vue不支持IE8及以下版本,因为Vue使用了IE8无法模拟的ECMAScript5特性,但它支持所有兼容ECMAScript 5 的浏览器。
开源版本
包含完整的警告和调试模式:https://vuejs.org/js/vue.js
删除了警告,30.96KB min + gzip: https://vuejs.org/js/vue.min.js
CDN
Vue.js 的核心是实现了MVVM模式,它扮演的角色就是ViewModel层,那么所谓的第一个应用程序就是展示它的数据绑定功能,操作流程如下:
1.创建一个HTML文件
Title
2.引入Vue.js
3.创建一个Vue的实例
说明:
4.将数据绑定到页面元素
{{message}}
说明:只需要在绑定的元素中使用双花括号将Vue创建的名为message 属性包裹起来,即可实现数据绑定功能,也就实现了ViewModel层所需的效果,是不是和EL表达式非常像?
5.完整的HTML
Title
{{message}}
6.测试
为了能够更直观的体验Vue 带来的数据绑定功能,我们需要在浏览器测试一番,操作流程如下;
1、在浏览器上运行第一个Vue应用程序,进入开发者工具
2、在控制台输入vm.message = 'Hello World',然后回车,你会发现浏览器中显示的内容会直接变成Hello World
此时就可以在控制台直接输入vm.message来修改值,中间是可以省略data的,在这个操作中,我并没有主动操作 DOM,就让页面的内容发生了变化,这就是借助了Vue的数据绑定功能实现的
MVVM模式中要求ViewModel 层就是使用观察者模式来实现数据的监听与绑定,以做到数据与视图的快速响应
这些关键字都是作为html页面的标签中的属性
v-model是将标签的value值与vue实例中的data属性值进行绑定。
格式如下:
请输入您的专业:
new Vue({
el:'#app',
data:{
major:'java'
}
});
通过配合具体的事件名,来绑定vue中定义的函数
事件有Vue的事件、和前端页面本身的一些事件!我们这里的 click 是vue的事件,可以绑定到vue中的methods中的方法事件!
格式如下:
new Vue({
el:'#app',
data:{
major:'java'
},
methods:{
sayHi:function(){
alert("HELLO VUE!");
},
changeMajor:function(){
console.log("change Title")
}
}
});
代码测试:
Title
补充知识:
(1)event.target.value:
比如在响应函数里,可以指明使用event内置的参数对象。该对象表示当前事件,可以通过event.target.value来获得当前事件对象的value的值。
(2)this的用法
this表示当前vue对象 “new Vue()”,可以通过 “this.” 来调用当前vue对象的属性和方法。
(3)v-on还可以简写
v-on:input="" ==> @input=""
我们知道差值表达式是不能写在html的标签的属性内的,那如果一定要用vue中的属性作为html标签的属性的内容,就可以通过v-bind进行属性绑定。
格式如下:
new Vue({
data:{
link:'http://www.baidu.com'
}
});
注意: v-bind也可以简写成如下形式
==>
上代码:
Title
鼠标悬停几秒钟查看此处动态绑定的提示信息!
v-bind等被称为指令。指令带有前缀v-,以表示它们是 Vue提供的特殊特性,它们会在渲染的DOM上应用特殊的响应式行为。在这里,该指令的意思是:''将这个元素节点的title特性和Vue 实例的message属性保持一致''。
如果你再次打开浏览器的JavaScript 控制台,输入vm.message = '新消息',就会再一次看到这个绑定了title 特性的HTML已经进行了更新。
此时该标签中的差值表达式,只获取一次数据,之后数据的变化不影响此差值表达式的值。
v-html会将vue中的属性的值作为html的元素来使用
v-text会将vue中的属性的值只作为纯文本来使用
格式如下:
new Vue({
el:'#app',
data:{
link:'http://www.baidu.com',
mylink:'千锋'
}
});
结果如下:
代码测试:
Title
Yes
No
测试:
注:使用v-*属性绑定数据是不需要双花括号包裹的
就是在else里再嵌套一个if
注:===三个等号在JS中表示绝对等于(就是数据与类型都要相等)
代码测试:
Title
A
B
C
在vue中经常会碰到这个标签,目前可以使用该标签配合 v-if 实现多个元素一起出现,或一起消失。
注意:template不能和 v-show 一起用。
格式如下:
hello vue1
hello vue2
v-for 是vue中循环的关键字
我们需要定义数据源,然后通过v-for来遍历数据源,再使用差值表达式 {{}} 输出数据
格式如下:
- {{a}}
注:args是数组,a是数组元素迭代的别名
< li v-for=" (a,i) in args" :key='i' >{{i}}{{a}}< /li >
此时的 i 就是每次循环的循环变量 ,从0开始一直到元素个数 -1
格式如下:
- {{i}}--{{k}}--{{v}}
new Vue({
el:'#app',
data:{
args:[1,2,3,4,5,6],
students:{
name:'xiaoming',
age:20
}
}
});
-
{{i}}--{{k}}--{{v}}--------------------
new Vue({
el:'#app',
data:{
args:[1,2,3,4,5,6],
students:[
{
name:'xiaoming',
age:20
},
{
name:'xiaowang',
age:21
}
]
}
});
vue中如何使用事件
事件的参数传递,分成三个部分:
设参:
传参:
addbtnfn:function(step){}
接参:
this.count += step;
vue中的事件修饰符
@click.stop 阻止点击事件的传播
@mousemove.stop 阻止鼠标移动事件
@keyup.space 空格键弹起时
...
计算属性的重点突出在属性两个字上(属性是名词),首先它是个属性,其次这个属性有计算的能力(计算是动词),这里的计算就是个函数。简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已,可以想象为缓存!
计算属性:计算出来的结果,保存在属性中,内存中运行:虚拟Dom
代码测试:
Title
currentTime1{{currentTime1()}}
currentTime2{{currentTime2}}
注意:
说明:
结论:
调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销。
通过watch里给属性绑定函数,当属性的值发生变化时,该函数就会自动被调用。调用时可以接收两个参数,第一个参数是属性改变后的值,第二个参数是属性改变前的值。
{{title}}
new Vue({
data:{
temp: true
}
})
如果temp是true ==>>
如果temp是false ==>>
Title
==》
.red{
background-color: red;
}
.mywidth{
width:450px;
}
注意:不能这么写:
new Vue({
el:'#app',
data:{
temp:false,
mw:'mywidth',
mycolor:'green'
}
}
注意:style引用了vue中的内容,因此是一个键值对,所以需要大括号,对象的键是不能出现“background-color”,应该改成
backgroundColor.
颜色:
高度:
在Vue.js中,如果使用vuex,实际上数据还是单向的,之所以说是数据双向绑定,这是用的UI控件来说,对于我们处理表单,Vue.js的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪,局部性数据流使用双向,简单易操作。
你可以用v-model 指令在表单< input > 、 < textarea >及< select >元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但v-model本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
注意:v-model会忽略所有表单元素的value、checked、selected特性的初始值,而总是将Vue 实例的数据作为数据来源。你应该通过JavaScript在组件的data选项中声明初始值!
Title
输入的文本: {{message}}