1. 概述
Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写
基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。之前我们是将关注点放在 了 DOM 操作上;而要了解 MVVM 思想,必须先聊聊 MVC 思想,如下图就是 MVC 思想图解

C 就是咱们 js 代码,M 就是数据,而 V 是页面上展示的内容
MVC 思想是没法进行双向绑定的
双向绑定是指当数据模型数据发生变化时,页面展示的会随之发生变化,而如果表单数据 发生变化,绑定的模型数据也随之发生变化
接下来我们聊聊 MVVM 思想,如下图是三个组件图解

图中的 Model 就是我们的数据, View 是视图,也就是页面标签,用户可以通过浏览器看到的内容
Model 和 View 是通 过 ViewModel 对象进行双向绑定的,而 ViewModel 对象是 Vue 提供的
接下来让大家看一下双向绑定的效果,输入框绑定了 username 模型数据,而在页面上也使用 {{}} 绑定了 username 模型数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div id="app"> <input name="username" v-model="username"> {{username}} </div> <script src="js/vue.js"></script> <script> new Vue({ el:"#app", data(){ return{ username:"" } } }); </script>
|
当我们在输入框中输入内容,而输入框后面随之实时的展示我们输入的内容,这就是双向绑定的效果
2. Vue 指令
指令:HTML 标签上带有 v- 前缀的特殊属性,不同指令具有不同含义。例如:v-if,v-for…
常用的指令有:
| 指令 |
作用 |
| v-bind |
为HTML标签绑定属性值,如设置 href , css样式等 |
| v-model |
在表单元素上创建双向数据绑定 |
| v-on |
为HTML标签绑定事件 |
| v-if |
条件性的渲染某元素,判定为true时渲染,否则不渲染 |
| v-else |
|
| v-else-if |
|
| v-show |
根据条件展示某元素,区别在于切换的是display属性的值 |
| v-for |
列表渲染,遍历容器的元素或者对象的属性 |
2.1 v-bind & v-model 指令
v-bind 为HTML标签绑定属性值,如设置 href , css样式等
该指令可以给标签原有属性绑定模型数据。这样模型数据发生变化,标签属性值也随之发生变化
1 2 3
| <a v-bind:href="url">百度一下</a>
<a :href="url">百度一下</a>
|
v-model 该指令可以给表单项标签绑定模型数据。这样就能实现双向绑定效果
1
| <input name="username" v-model="username">
|
演示代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <div id="app"> <a v-bind:href="url">点击一下</a> <a :href="url">点击一下</a> <input v-model="url"> </div> <script src="js/vue.js"></script> <script> new Vue({ el:"#app", data(){ return { username:"", url:"https://www.baidu.com" } } }); </script>
|
2.2 v-on 指令
v-on 为HTML标签绑定事件
我们在页面定义一个按钮,并给该按钮使用 v-on 指令绑定单击事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <input type="button" value="一个按钮" v-on:click="show()">
<input type="button" value="一个按钮" @click="show()">
<script> new Vue({ el: "#app", methods: { show(){ alert("我被点了"); } } }); </script>
|
注意:v-on: 后面的事件名称是之前原生事件属性名去掉on
例如:
- 单击事件 : 事件属性名是 onclick,而在vue中使用是
v-on:click
- 失去焦点事件:事件属性名是 onblur,而在vue中使用时
v-on:blur
2.3 条件判断指令
| 指令 |
作用 |
| v-if |
条件性的渲染某元素,判定为true时渲染,否则不渲染 |
| v-else |
| v-else-if |
| v-show |
根据条件展示某元素,区别在于切换的时display属性的值 |
现在要实现,当 count 模型的数据是3时,在页面上展示 div1 内容;当 count 模型的数据是4时,在页面上展示 div2 内容;count 模型数据是其他值时,在页面上展示 div3。这里为了动态改变模型数据 count 的值,再定义一个输入框绑定 count 模型数据。html 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div id="app"> <div v-if="count == 3">div1</div> <div v-else-if="count == 4">div2</div> <div v-else>div3</div> <hr> <input v-model="count"> </div> <script src="js/vue.js"></script> <script>
new Vue({ el:"#app", data(){ return { count:3 } } }); </script>
|
然后我们在看看 v-show 指令的效果,如果模型数据 count 的值是3时,展示 div v-show 内容,否则不展示,html页面代码如下
1 2 3
| <div v-show="count == 3">div v-show</div> <br> <input v-model="count">
|
通过上面的演示,发现 v-show 和 v-if 效果一样,那它们到底有什么区别呢
v-show 不展示的原理是给对应的标签添加 display css属性,并将该属性值设置为 none ,这样就达到了隐藏的效果。而 v-if 指令是条件不满足时根本就不会渲染
2.4 v-for 指令
| 指令 |
作用 |
| v-for |
列表渲染,遍历容器的元素或者对象的属性 |
这个指令看到名字就知道是用来遍历的,该指令使用的格式如下:
1 2 3
| <标签 v-for="变量名 in 集合模型数据"> {{变量名}} </标签>
|
注意:需要循环那个标签,v-for 指令就写在那个标签上
如果在页面需要使用到集合模型数据的索引,就需要使用如下格式:
1 2 3 4
| <标签 v-for="(变量名,索引变量) in 集合模型数据"> {{索引变量 + 1}} {{变量名}} </标签>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <div id="app"> <div v-for="addr in addrs"> {{addr}} <br> </div>
<hr> <div v-for="(addr,i) in addrs"> {{i+1}}--{{addr}} <br> </div> </div> <script src="js/vue.js"></script> <script>
new Vue({ el:"#app", data(){ return { addrs:["北京","上海","西安"] } } }); </script>
|
2.5 生命周期
生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法
| 状态 |
阶段周期 |
| beforeCreate |
创建前 |
| created |
创建后 |
| beforeMount |
载入前 |
| mounted |
挂载完成 |
| beforeUpdate |
更新前 |
| updated |
更新后 |
| beforeDestroy |
销毁前 |
| destroyed |
销毁后 |
.png)
3. Element
Element:是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页。
Element 提供了很多组件(组成网页的部件)供我们使用。例如 超链接、按钮、图片、表格等等~
如下图左边的是我们编写页面看到的按钮,上图右边的是 Element 提供的页面效果,效果一目了然
3.1 食用方式
- 将资源
element-ui 文件夹直接拷贝到项目的 webapp 下
- 创建页面,并在页面引入Element 的css、js文件 和 Vue.js
1 2 3
| <script src="vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
|
- 创建Vue核心对象
Element 是基于 Vue 的,所以使用Element时必须要创建 Vue 对象
1 2 3 4 5
| <script> new Vue({ el:"#app" }) </script>
|
- 官网复制Element组件代码
栗子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app">
<el-row> <el-button>默认按钮</el-button> <el-button type="primary">主要按钮</el-button> <el-button type="success">成功按钮</el-button> <el-button type="info">信息按钮</el-button> <el-button type="warning">警告按钮</el-button> <el-button type="danger">删除</el-button> </el-row> <el-row> <el-button plain>朴素按钮</el-button> <el-button type="primary" plain>主要按钮</el-button> <el-button type="success" plain>成功按钮</el-button> <el-button type="info" plain>信息按钮</el-button> <el-button type="warning" plain>警告按钮</el-button> <el-button type="danger" plain>危险按钮</el-button> </el-row>
<el-row> <el-button round>圆角按钮</el-button> <el-button type="primary" round>主要按钮</el-button> <el-button type="success" round>成功按钮</el-button> <el-button type="info" round>信息按钮</el-button> <el-button type="warning" round>警告按钮</el-button> <el-button type="danger" round>危险按钮</el-button> </el-row>
<el-row> <el-button icon="el-icon-search" circle></el-button> <el-button type="primary" icon="el-icon-edit" circle></el-button> <el-button type="success" icon="el-icon-check" circle></el-button> <el-button type="info" icon="el-icon-message" circle></el-button> <el-button type="warning" icon="el-icon-star-off" circle></el-button> <el-button type="danger" icon="el-icon-delete" circle></el-button> </el-row> </div>
<script src="js/vue.js"></script> <script src="element-ui/lib/index.js"></script> <link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
<script> new Vue({ el:"#app" }) </script>
</body> </html>
|
3.2 Element 布局
Element 提供了两种布局方式,分别是:
Layout 布局