vue是 MVVM 的框架
- MVVM思想:一种软件架构模式,决定了写代码的方式。
- M:model数据模型(ajax获取到的数据) 对应到前端就是
JavaScript
对象 - V:view视图(页面)
- VM:ViewModel 视图模型 就是连接视图与数据的中间件(中间桥梁)
- M:model数据模型(ajax获取到的数据) 对应到前端就是
- MVVM通过
数据双向绑定
让数据自动地双向同步 不在需要操作DOM- V(修改视图) -> M(数据自动同步)
- M(修改数据) -> V(视图自动同步)
数据(Model
)和视图(View
)是不能直接通讯的,而是需要通过ViewModel
来实现双方的通讯。当数据(Model
)变化的时候,ViewModel
能够监听到这种变化,并及时通知View
视图做出修改。同样的,当页面有事件触发的时候,ViewModel
也能够监听到事件,并通知数据(Model
)进行响应。所以ViewModel
就相当于一个观察者,监控着双方的动作,并及时通知对方进行相应的操作。
简单的理解就是:MVVM
实现了将业务(数据)与视图进行分离的功能。
在这里还需要注意的一点就是:
MVVM
框架的三要素:响应式,模板引擎,渲染
响应式:vue
如何监听数据的变化
模板:Vue
的模板如何编写和解析,怎样将具体的值替换掉{{msg}}
内容,这就是模板引擎的解析。
渲染:Vue
如何将模板转换成html
, 其实就是有虚拟DOM
向真实DOM
的转换过程。
指令
v-bind的使用,简写 :属性
对于插值表达式的绑定会出现闪烁的情况,通常使用v-text来解决
v-for列表渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>列表渲染</title>
</head>
<body>
<div id="app">
<ul>
<!-- users表示数组,item表示从数组中取出的对象,这个名字可以随意取 -->
<!-- 注意 v-for必须结合key属性来使用,它会唯一标识数组中的每一项,未来当数组中的那一项改变的时候,它会只更新那一项,好处就是提升性能。注意key的值唯一,不能重复 -->
<!-- index表示数组的索引值,该名字可以随意定义 -->
<li v-for="(item,index) in users" :key="item.id">
编号:{{item.id}} 姓名:{{item.name}}---索引:{{index}}
</li>
</ul>
</div>
<script src="vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
users: [
{
id: 1,
name: "张三",
},
{
id: 2,
name: "李四",
},
{
id: 3,
name: "老王",
},
],
},
});
</script>
</body>
</html>
v-on绑定事件的指令
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<span>{{name}}</span>
<!-- 通过v-on来指定对应的事件,然后后面跟上对应的方法名,方法的定义在methods完成 -->
<button v-on:click="changeName">更换姓名</button>
</div>
<script>
var vm = new new Vue({
el: '#app',
data: {
name: 'zhangsan'
},
// 通过methods完成函数或方法的定义
methods: {
changeName() {
// 在methods中要获取data中的属性,需要通过this来完成,this表示的是vue实例。
this.name = "itcast"
}
}
})
</script>
</body>
</html>
v-if和v-show指令可以用来控制元素的显示和隐藏
下面,我们先来看一下v-if
的应用。
这里还是对用户数据进行判断。
<div id="app">
<p v-if="users.length===0">没有任何用户数据</p>
<ul v-else>
<!-- users表示数组,item表示从数组中取出的对象,这个名字可以随意取 -->
<!-- 注意 v-for必须结合key属性来使用,它会唯一标识数组中的每一项,未来当数组中的那一项改变的时候,它会只更新那一项,好处就是提升性能。注意key的值唯一,不能重复 -->
<!-- index表示数组的索引值,该名字可以随意定义 -->
<!-- <li
v-for="(item,index) in users"
:key="item.id"
:class="{actived:selectItem===item}"
@mousemove="selectItem=item"
>
编号:{{item.id}} 姓名:{{item.name}}---索引:{{index}}
</li> -->
<li
v-for="(item,index) in users"
:key="item.id"
:style="{backgroundColor:selectItem===item?'#dddddd':'transparent'}"
@mousemove="selectItem=item"
>
编号:{{item.id}} 姓名:{{item.name}}---索引:{{index}}
</li>
</ul>
</div>
在上面的代码中,我们首先对users
数组做了一个判断,如果没有数据,就在页面上展示:“没有任何用户数据”
否则渲染整个列表。
上面是关于v-if
的使用,下面看一下v-show
.
v-show
是通过css
属性display
控制元素显示,元素总是存在的。
v-if
:通过控制dom
来控制元素的显示和隐藏,如果一开始条件为false
,元素是不存在的。
什么时候使用v-show
,什么时候使用v-if
呢?
如果需要频繁的控制元素的显示与隐藏,建议使用v-show
. 从而避免大量DOM
操作,提高性能。
而如果某个元素满足条件后,渲染到页面中,并且以后变化比较少,可以使用v-if