一、Vue 简介
1.1 简介
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式的 js 框架,发布于 2014 年 2 月。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库(如:vue-router,vue-resource,vuex)或既有项目整合。
- 渐进式:明式渲染 -> 组件系统 -> 客户端路由 -> 集中式状态管理 -> 项目构建
- 官网:Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)
- https://v2.cn.vuejs.org/
- 优点:
- 易用:熟悉 HTML,CSS,JavaScript 知识后,可快速上手 Vue
- 灵活:渐进式框架
- 高效: api20kb, 加载快,内部虚拟 DOM
- vue2 版本 (2023.12 停更)、Vue3
- 作者 尤雨溪
1.2 MVVM 模式的实现者 ------ 双向数据绑定模式
Model:模型层,在这里表示 JavaScript 对象
View:视图层,在这里表示 DOM(HTML 操作的元素)
ViewModel:连接视图和数据的中间件,Vue.js 就是 MVVM 中的 ViewModel 层的实现者
在 MVVM 架构中,是不允许 数据 和 视图 直接通信的,只能通过 ViewModel 来通信,而 ViewModel 就是定义了一个 Observer 观察者
- ViewModel 能够观察到数据的变化,并对视图下对应的内容进行更新
- ViewModel 能够监听到视图的变化,并能够通知数据发生改变
至此,我们就明白了,Vue.js 就是一个 MVVM 的实现者,他的核心就是实现了
DOM 监听与数据绑定

1.3 其它 MVVM 实现者
- AngularJS简单介绍一下,AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。
- ReactJSReact 引入了虚拟 DOM(Virtual DOM)的机制:在浏览器端用 Javascript 实现了一套 DOM API。基于 React 进行开发时所有的 DOM 构造都是通过虚拟 DOM 进行,每当数据变化时,React 都会重新构建整个 DOM 树,然后 React 将当前整个 DOM 树和上一次的 DOM 树进行对比,得到 DOM 结构的区别,然后仅仅将需要变化的部分进行实际的浏览器 DOM 更新。
- 微信小程序微信小程序的视图层和数据层就是通过 MVVM 进行绑定的。
1.4 为什么要使用 Vue.js
- 轻量级,体积小是一个重要指标。Vue.js 压缩后有只有 20 多 kb (Angular 压缩后 56kb+,React 压缩后 44kb+)
- 移动优先。更适合移动端,比如移动端的 Touch 事件
- 易上手,学习曲线平稳,文档齐全
- 吸取了 Angular(模块化)和 React(虚拟 DOM)的长处,并拥有自己独特的功能,如:计算属性
- 开源,社区活跃度高
1.5 Vue.js 的两大核心要素
1.5.1 数据驱动

1.5.2 组件化
- 页面上每个独立的可交互的区域视为一个组件
- 每个组件对应一个工程目录,组件所需的各种资源在这个目录下就近维护
- 页面不过是组件的容器,组件可以嵌套自由组合(复用)形成完整的页面
二、Vue 的初体验
开发工具
- VScode
- HBuilder
- WebStorm
- IDEA
2.1 在页面引入 vue 的 js 文件
注意:cdn 是一种加速策略,能够快速的提供 js 文件
也可以自己下载到本地,自己引入 vue.js
javascript
// 在线cdn
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
// 也可以自己下载到本地
<!-- 引入js文件 -->
<script src="../js/vue-2.7.16.js"></script>
2.2 准备 dom
javascript
<!-- 创建一个div,id是app -->
<div id="app"></div>
2.3 创建 vue 对象,设计对象的内容
其中该 vue 对象,绑定了页面中 id 是 app 的那个 div
javascript
<script>
// 创建Vue对象,注意大小写,构造器中是一个json
new Vue({
el:"#app", // 这是el是element缩写,目的是选择元素,所以此处是选择器
data: { // 这是data,数据,定义#app选中的区域可以使用的数据
name:"哈喽 小尤"
}
})
</script>
- el: element 的简称,也就是 Vue 实例挂载的元素节点,值可以是 CSS 选择符,或实际 HTML 元素,或返回 HTML 元素的函数。
- data: 用于提供数据的对象,里面存放 json 数据。
2.4 在页面的元素中使用插值表达式来使用 vue 对象中的内容
javascript
<div id="app">
{{ title }}
</div>
三、 插值表达式
插值表达式是 {{}}, 即双花括号
3.1 运算
html
<div id="app">
{{ 1 + 1}}<br>
{{ 1 - 1}}<br>
{{ 2 * 2}}<br>
{{ 2 / 2}}<br>
{{ 2 +"--"+ 2}}<br> <!-- 字符串拼接 -->
{{ 2 > 1 ? "2大":"1大"}}<br>
</div>
3.2 取数据
插值表达式的可以是在 View 中获得 Model 中的内容
Model 中的内容如下:
javascript
<body>
<div id="app">
{{title }},
{{arr}},
{{user}},
{{user.age}},
{{user.username}}
</div>
</body>
<scrip>
new Vue({
el:"#app",
data:{
title:"hello world!",
arr:[11,22,33],
user:{
age:18,
username:"taotie"
}
}
});
</script>
3.3 获取数组中的内容
html
<div id="app">
{{arr[2]}}
</div>
此时,页面上会显示 "33",也就是数组中的第三个元素被获取。
3.4 获取对象中的属性
html
<div id="app">
{{ user.username }}
</div>
此时,页面上会显示 "taotie",也就是对象中 username 属性的值。
3.5 调用 Vue 中的方法
重点 1: 在哪里定义方法?方法的定义语法?
html
<div id="app">
{{ fun1() }} <!-- 注意还要加参数列表() -->
{{ fun2(66) }}
</div>
<script src="../js/vue.js"></script>
<script>
new Vue({
el: "#app",
data: { // 定义数据
},
methods: { // 定义函数
// key:value
fun1:function(){
alert("调用fun1执行")
console.log("fun1输出");
},
// 上面函数定义,有简化写法
fun2(a){
console.log("fun2输出" , a)
// 返回值在页面展现
return "fun22222"
}
}
})
</script>
调用了 vue 对象中的 fun2 方法,控制台输出内容,页面并展示了方法的返回值。
总结
html1.插值表达式可以运算 2.插值表达式可以取data中的数据 3.插值表达式可以调用方法
五、Vue 的分支
vue 中有很多指令
形如: v-xxx
5.1 v-if
Vue 中的分支语句 v-if 非常好理解,逻辑跟 Java 中的 if-else 相同。
作用:根据 if 的对错来决定要不要展现该 标签内容
v-if 语句块包含以下内容:
- v-if
- v-else
- v-else-if
接下来以一个简单例子即可理解:

从这个例子可以看出,vue 对象中的 data 提供了分支的条件。根据条件,如果是 true,则 v-if 的内容就会
显示,反之不显示。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue-2.7.16.js"></script>
</head>
<body>
<div id="app">
<p v-if="score > 90">优秀</p>
<p v-else-if="score > 80">良好</p>
<p v-else-if="score > 70">及格</p>
<p v-else>不及格</p>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
score: 88
}
})
</script>
</html>
5.2 v-show
v-if 和 v-show 之间有着看似相同的效果,但优化上却有区别。先看下面这个例子:
html
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
<p v-show="rich">
有钱!
</p>
<p v-if="rich">
有钱!
</p>
<button type="button" @click="rich=!rich">今晚彩票开奖</button>
</div>
</body>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
rich:false
},
methods:{
}
});
</script>
</html>
通过点击 "今晚彩票开奖" 按钮,能切换 rich 的值,此时发现,v-if 和 v-show 的显示状态都会来回切换。看起来是一样的,但通过查看控制台代码发现,
**v-show实际会将p标签的css样式的display属性设为none来达到隐藏的效果。

而v-if 是直接在页面上添加和删除 p 标签来达到效果
总结:因此 v-show 在反复切换的应用场景下,效率比 v-if 更高。
六、Vue 的循环 v-for【重点】
Vue 中的循环关键字并没有 Java 的那么多,只有 v-for,但用法上有多种。接下来我们来逐一介绍。
6.1 普通的 for 循环
我们需要定义数据源,然后通过 v-for 来遍历数据源,再使用插值表达式输出数据。
html
<body>
<div id="app">
<ul>
<!-- in是关键词,args是下方data中定义的数组,a是遍历出的结果变量 -->
<li v-for="a in args">{{a}}</li>
</ul>
</div>
</body>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
args:[1,2,3,4,5,6]
}
});
</script>
在这个例子中,数据源提供了一个数组。视图层通过 v-for 来循环输出多个 li 标签,非常简单。
6.2 带着索引的 for
html
<body>
<div id="app">
<ul>
<li v-for=" (a,i) in args" :key='i'>{{i}}{{a}}</li>
</ul>
</div>
</body>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
args:[1,2,3,4,5,6]
}
});
</script>
(a,i) 顺序建议不要变, 第一个就是遍历的得到的值,第二个就是下标
此时的 i 就是每次循环的循环变量 ,从 0 开始一直到元素个数 - 1
6.3 遍历对象数组填充表格【特别重点】
List<User> users = new ArrayList<>();
users.add (new User (1, "张三"));
users.add (new User (2, " 李四));
{ id:1, name:"张三" }, { id:2, name:"lsii " }
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<h2>简单遍历数组</h2>
<ul>
<li v-for="e in arr">{{e}}</li>
</ul>
<hr>
<h2>遍历,携带下标</h2>
<ul>
<li v-for="(e,i) in arr">{{e}}==>{{i+1}}</li>
</ul>
<h2>遍历,取出对象</h2>
<table border="2">
<tr>
<td>序号</td>
<td>用户id</td>
<td>姓名</td>
<td>性别</td>
</tr>
<tr v-for="(user,i) in userList">
<td>{{i+1}}</td>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.sex}}</td>
</tr>
</table>
</div>
<script src="../js/vue-2.7.16.js"></script>
<script>
new Vue({
el:"#app",
data:{
arr:[11,33,44,66],
userList:[
{id:1101,name:"老王",sex:"男"},
{id:1102,name:"老李",sex:"女"},
{id:1103,name:"老刘",sex:"女"},
]
}
})
</script>
</body>
</html>
| 页面效果 |
|---|
![]() |
6.4 带着:key 遍历
html
<!-- v-for是循环,所在标签会随着循环重复出现 -->
<!-- in是关键词,右边是下方定义的数组,左边是遍历得到的数据-->
<!-- 建议在给每个循环中,设置:key,key的值唯一即可 -->
<div v-for="e in arr" v-bind:key="e">{{e}}</div>
七、Vue 的属性绑定【重点】
Vue 提供了多个关键字,能快速的将数据对象中的值绑定在视图层中,即 MVVM。
7.1 v-model
通过 v-model 将 input 标签的value 值与 vue 对象中的 data 属性值进行绑定。
ps: v-model 就是实现 Vue 的 mvvm 思想的方式
html
<body>
<div id="app">
输入值 <input v-model="username">
<hr>
username={{username}}
</div>
<script src="../js/vue-2.7.16.js"></script>
<script>
new Vue({
el:"#app",
data:{
username:"admin"
},
methods:{
}
})
</script>
</body>
此时 input 标签中加入了 "
**v-model='username'**",表示 input 的 value 值与 vue 对象 data 中的 username 属性绑定,当在 input 输入框中输入内容会实时修改 username 的值。于是 {{username}} 插值表达式能实时输出 input 输入框内的值。
| ** 页面效果如下:** |
|---|
![]() |
7.2 v-bind
我们知道插值表达式是不能写在 html 的标签的属性内的,那如果一定要用 vue 中的属性作为 html 标签的属性的内容,就可以通过 v-bind 进行属性绑定。
换句话,使用 v-bind, 将 html 中其他属性都变成变量来绑定
html
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div id="app">
<!-- <input v-bind:type="dyncType">
<a v-bind:href="href">点击跳转</a>
<img v-bind:src="src"> -->
<input :type="dyncType">
<a :href="href">点击跳转</a>
<img :src="src">
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
new Vue({
el:'#app',
data:{
dyncType:"radio",
href:"http://www.jd.com",
src:"../images/1.jpg"
}
})
</script>
</html>
这样,a 标签内的 href 属性就可以使用 vue 对象中的属性值。
注意:v-bind 也可以简写,使用冒号 "
:" 来代替。html
预览
html<a v-bind:href='link'></a> 等价于==> <a :href='link'>
八、Vue 的事件绑定【重点】
语法:v-on: 事件名称
可以简写为: @事件名称
:::danger注意: v-on 都能绑定哪些事件?其实 vue 并没提供什么事件,只是换了写法而已。所以之前原生 js 有哪些 dom 事件,现在 vue 就可以使用哪些事件
:::
html
<button v-on:click="start()">开始</button>
<button @click="begin()">开始</button>
事件中触发的函数,在 vue 实例中的 methods 中进行定义,可以按照如下两种方式进行定义:
html
<script type="text/javascript">
var vue = new Vue({
el : "#app",
data: {
},
methods:{
// 方式1
// 函数名: function(参数)
start:function(){
},
// 方式2
// 函数名(参数)
begin(){
}
}
})
</script>
** 练习 1: **
设计一个 div, 其中有数字,再设计一个按钮,点击按钮使数字递增 10

练习
输入 A,B 值后,点击计算按钮,在结果处展示相加后的结果


html
<body>
<div id="app">
<h2>简易加法计算器</h2>
数组A <input v-model="num1"> <br>
数组B <input v-model="num2"> <br>
<button @click="add">+</button>
<button @click="clear">clear</button>
<br>
结果: {{result}} <span></span>
</div>
<script src="../js/vue-2.7.16.js"></script>
<script>
new Vue({
el:"#app",
data:{
num1: null,
num2: null,
result: null
},
methods:{
add(){
this.result = parseInt(this.num1) + parseInt(this.num2)
},
clear(){
this.num1 = null
this.num2 = null
this.result = null
}
}
})
</script>
</body>
</html>
扩展:表单修饰符
练习中涉及到表单数据转字符串问题,++获取的表单数据是字符串++, 需要使用 **parseInt ()** 转成数字
vue 提供了表单修饰符表单输入绑定 --- Vue.js (vuejs.org)
其中:
**number**, 可以使表单的输入的数据直接就是数字,不需要再解析
html<input v-model.number="age" type="number">除了.number 修饰符外,还有其他的修饰符,比如
.trim.lazy
练习动态添加对象
效果图如下,输入数据,动态的添加到页面中
ps: 列表初始数据有 3 个 1-zs,2-ls,3-ww

html
<body>
<div id="app">
<!-- 输入框 -->
<div>
<label>ID
<input type="text" v-model="id">
</label>
<label>Name
<input type="text" v-model="name">
</label>
<button v-on:click="add">添加</button>
</div>
<!-- 列表 -->
<div>
<ul>
<li v-for="item in list">{{item.id +'---'+item.name}}</li>
</ul>
</div>
</div>
<script type="text/javascript" src="js/vue.min.js"></script>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
id: 0,
name:'',
list:[
{id:1,name:'zs'},
{id:2,name:'ls'},
{id:3,name:'ww'}
]
},
methods:{
add:function(){
// 获得输入的值
var id_ = this.id;
var name_ = this.name;
// 向数组中添加元素
this.list.push({id:id_,name:name_});
}
}
});
</script>
九、计算属性:computed
9.1 什么是计算属性
计算属性的重点突出在 属性 两个字上(属性是名词,就是存储数据的),首先它是个 属性 其次这个属性有 计算 的能力(计算是动词),这里的 计算 就是个函数;简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;
为什么要用,什么时候用计算属性?
- ++当 {{}} 表达式内写很多复杂代码时使用计算属性来抽取代码++
9.2 演示
官网演示很详细...计算属性 --- Vue.js (vuejs.org)
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
展示内容:{{message}}
<hr>
<!-- 反转后1 先拆分得到数组:{{message.split("")}} <br>[a, b, c] -->
<!-- 反转后2 数组反转:{{message.split("").reverse()}} <br>[c, b, a] -->
<!-- 数组再变字符串: -->
<!-- 使用{{}}做运算,代码复杂cba -->
{{message.split("").reverse().join("-")}} <br>
<hr>
<!-- 使用计算属性,将代码抽取到计算属性中,这里只需要调用即可,简单方便 -->
{{reverseString}}
</div>
<script src="../js/vue-2.7.16.js"></script>
<script>
new Vue({
el:"#app",
data:{
message:"abc"
},
methods:{},
computed:{ // 计算属性
reverseString(){
// 计算,返回该结果,上方使用{{}}取出结果
return this.message.split("").reverse().join("")
}
}
})
</script>
</body>
</html>
9.3 计算属性与方法的区别
看下面这个例子
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
展示内容:{{message}}
<hr>
<!-- 反转后1 先拆分得到数组:{{message.split("")}} <br> -->
<!-- 反转后2 数组反转:{{message.split("").reverse()}} <br> -->
<!-- 数组再变字符串: -->
<!-- 使用{{}}做运算,代码复杂 -->
{{message.split("").reverse().join("")}} <br>
<hr>
<!-- 使用计算属性,将代码抽取到计算属性中,这里只需要调用即可,简单方便 -->
{{reverseString}}
<hr>
<h2>演示计算属性和函数的区别</h2>
函数获取时间:{{getCurrentTime()}} <br>
计算属性获取数据:{{getCurrentTime2}}
</div>
<script src="../js/vue-2.7.16.js"></script>
<script>
var vue = new Vue({
el:"#app",
data:{
message:"abc"
},
methods:{
getCurrentTime(){ // 次次调用次次执行
return Date.now();
}
},
computed:{ // 计算属性,只会在加载时计算一次,结果缓存存储,后续使用直接取值不会再运算
reverseString(){
// 计算,返回该结果,上方使用{{}}取出结果
return this.message.split("").reverse().join("")
},
getCurrentTime2(){
return Date.now();
}
}
})
</script>
</body>
</html>
计算属性和函数长得类似,需要注意 设计时二者名字不能重复
说明
- methods:定义方法,调用方法使用 currentTime1 (),需要带括号,每次都会重新执行
- computed:定义计算属性,调用属性使用 currentTime2,不需要带括号,计算一次重复使用 (将结果缓存起来重复使用);
注意:methods 和 computed 里不能重名
测试效果
仔细看图中说明,观察其中的差异

9.4 结论
调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点;计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销
计算属性的执行时机是在 created 钩子函数之前执行!且只执行一次!
- 函数每次调用都会执行
- 计算属性是页面加载时执行一次,后续每次调用都是之前的值不再计算
十、Vue 的组件化【理解】
Vue 的组件化设计思想借鉴了 Java 的面向对象思想:封装的思想!
也就是说,在实际的 vue 项目中,以及使用了 Vue 框架的项目中,Vue 的对象都会以组件的形式出现,能被反复使用。
也可以这么理解 **,Vue 的组件是将一些代码封装到组件中 **, 使用时只需要通过一个组件名既可使用该组件的功能
要想实现组件化,需要在页面中注册组件:
- 全局注册
- 本地注册
组件其实就是页面内的部分代码,完成某个功能
10.1 组件的全局注册
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件的全局注册</title>
</head>
<body>
<div id="app">
<model1></model1>
<model1></model1>
<model1></model1>
</div>
<hr/>
<div id="app1">
<model1></model1>
<model1></model1>
<model1></model1>
</div>
</body>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
//通过Vue.component实现组件的全局注册,全局注册后的组件可以被重复使用。
Vue.component("model1",{
template:"<div><h1>{{title}}</h1><button type='button' @click='btnfn'>点我</button></div>",
data:function(){
return {
title:"hello vue"
}
},
methods:{
btnfn:function(){
alert("hello !!!");
}
}
});
new Vue({
el:'#app'
})
new Vue({
el:'#app1'
})
</script>
</html>
10.2 组件的本地注册
vue 的全局注册,也就意味着在页面的任意一个被 vue 绑定过的 div 中,都可以使用全局注册了的 vue 组件。
但是,如果是对 vue 组件进行本地注册,那么在其他被 vue 绑定的 div 中,不能使用该组件。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue组件的本地(局部)注册</title>
</head>
<body>
<div id="app">
<model11></model11>
</div>
<hr/>
<!--在这里使用组件model11会报错-->
<div id="app1">
<model11></model11>
</div>
</body>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
new Vue({
el:'#app',
components:{
"model11":{
template:"<div><h1>{{title}}</h1><button type='button' @click='btnfn'>点我</button></div>",
data:function(){
return {
title:"hello vue"
}
},
methods:{
btnfn:function(){
alert("hello !!!");
}
}
}
}
})
new Vue({
el:'#app1'
})
</script>
10.3 注意特性【重点】
- 组件是一段完整的页面代码,包括 html 标签,js 数据和函数
- 组件要设置名字,使用时是将名字作为标签使用
- componet 中注册的组件中的 data,必须是以函数的形式,且 return 返回数据
- template 标签内,必须有且只能有一个根标签,且一般都是 div 标签。
- template 支持模板字符串


javascript
data:function(){
return {
title:"hello vue"
}
}
data:{}
// 简化成
data(){
return {
title:"hello vue"
}
}
十一、 组件的生命周期【面试】
Vue 中的组件也是有生命周期的。一个 Vue 组件会经历:初始化、创建、绑定、更新、销毁等阶段,不同的阶段,都会有相应的 **++生命周期钩子 hook 函数++** 被调用。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue-2.7.16.js"></script>
</head>
<body>
<div id="app">
<p>{{msg}}</p>
<p id="n1">{{name}}</p>
<button @click="update">更新name</button>
<button @click="destroye()">销毁按钮</button>
</div>
</body>
<script>
new Vue({
el: '#app',
data: {
msg: 'hello world',
name: 'zhangsan'
},
methods: {
update() {
this.name = Math.random() + "李四";
},
destroye() {
this.$destroy()
}
},
beforeCreate() {//创建vue之前
console.log('beforeCreate')
console.log(this.msg)//undefined 创建vue实例之前,数据还没有被初始化
},
created() {//创建vue实例之后
console.log('created')
console.log(this.msg)//hello world
},
beforeMount() {//挂载之前
console.log('beforeMount')
},
mounted() {//挂载之后
console.log('mounted')
},
beforeUpdate() {//更新之前
console.log(this.name)
console.log(document.getElementById('n1').innerText)//老数据
console.log('data更新之前执行')
},
updated() {//更新之后
console.log('data更新之后执行')
console.log(document.getElementById('n1').innerText)//新数据
console.log(this.name)
},
beforeDestroy() {//销毁之前
console.log('beforeDestroy')
},
destroyed() {//销毁之后
console.log('destroyed')
},
})
</script>
</html>
| ** 钩子函数 ** | 解释 |
|---|---|
| beforeCreate | 在实例初始化之后,数据观测和事件配置之前被调用 此时 data 和 methods 以及页面的 DOM 结构都没有初始化 什么都做不了 |
| **created ** | 在实例创建完成后被立即调用此时 data 和 methods 已经可以使用 但是页面还没有渲染出来,可以在这里进行数据的初始化、异步请求数据、监听事件等操作 |
| beforeMount | 在挂载开始之前被调用 此时页面上还看不到真实数据 只是一个模板页面而已 |
| mounted | mounted 钩子函数是组件挂载到 DOM 后被调用的。在这个阶段可以访问到组件所依赖的 DOM 元素,进行 DOM 操作、绑定事件等 |
| beforeUpdate | 数据更新时调用,发生在虚拟 DOM 打补丁之前。 页面上数据还是旧的 |
| updated | 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 页面上数据已经替换成最新的 |
| beforeDestroy | 实例销毁之前调用 |
| destroyed | 实例销毁后调用 |
| 组件的生命周期钩子 |
|---|
![]() |
十二、Vue-Cli 搭建 Vue 项目【重点】
12.1 什么是 vue-cli
cli: Command Line 命令行工具,vue-cli 就是 vue 的命令行工具,也称之为脚手架,使用 vue-cli 提供的各种命令可以拉取、创建、运行我们需要使用到的框架,比如 webpack、Element UI、Element Admin 等等。那么要想使用 vue-cli 命令,需要先安装 node.js。
12.2 node.js 的介绍及安装
node.js 的介绍
node.js 提供了前端程序的运行环境,可以把 node.js 理解成是运行前端程序的服务器。
node.js 的安装
从官网下载安装即可:http://nodejs.cn/download/


首先自己手动创建一个文件夹 nodejs
然后再选择该路径安装

这个切换路径是,需要自己手动创建一个文件夹 nodejs

不要勾选这个,否则会下载很多东西


| 测试 node.js 是否安装成功: 在 DOS 窗口中输入 "node -v" 查看版本,如果看到版本,就表示安装成功。(环境变量已经自动配置好) |---------------------------------------------------------------------------------| |
| |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
node -v 是 查看 node 的版本
npm -v 是 查看 npm 版本
解释:
npm 是安装工具的工具包,类似于 Linux 中 yum,Linux 中安装软件 yum install
node 中安装软件使用 npm install
设置 npm 源,配置镜像后,下载资源就会很快.
html
npm config set registry https://registry.npmmirror.com
12.3 使用 node.js 安装 vue-cli
(管理员权限) 使用如下命令安装 vue-cli
npm install @vue/cli -g
# 如果出错,可以卸载,重新执行上一步安装
npm uninstall @vue/cli -g
- npm: 使用 node.js 的命令
- install: 安装
- @vue/cli: 要安装的 vue-cli
- -g: 全局安装
当出现以下界面,表示正在安装:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
安装 vue-cli 检测
- vue -V

12.4 使用 vue-cli 命令创建项目
进入工作空间,执行命令创建
- vue create 项目名
注意 bug: 创建项目时如果出现报错,提示
no permitted即没有权限在此处创建项目,这个是因为磁盘权限不够,需要修改硬盘权限


选择具体 features

选择 vue 版本

如果选择了 Router, 那么就会有这个

一般选择第一项,为的是将文件分离打包

是否将此操作存储为模板,本例选择 n, 选择为 y 就会在下次创建时使用

创建完毕

运行项目


12.6 项目结构

| 文件名 | 解释 |
|---|---|
| build | webpack 的一些配置 |
| config | 不同环境的配置,比如开发环境,生产环境等 |
| node_modules | npm install 下载的依赖包 |
| public | 用于存放公共 js 文件夹、json 文件和图片等 |
| dist | 存放项目打包后的文件 |
| src | 项目的源码 |
| src/assets | 存放静态资源文件,如图片等 |
| src/components | 存放公共组件 |
| src/router | 静态路由表 |
| src/store | vuex |
| src/views | 开发的页面资源,路由页面相关的 |
| src/main.js | 对应 App.vue 创建 vue 实例,也是 **入口文件** |
| src/App.vue | 入口页面 |
| gitignore | git 管理时,忽略的文件或文件夹 |
| package.json | 项目的核心配置记录,可以查看当前安装依赖的版本号 |
| index.html | 首页的入口 |
| vue.config.js | 可选的配置文件,存放在根目录中,@vue/cli-service 启动的时候会自动加载 |
可以在 package.json 中修改端口


12.7 启动项目
进入项目,使用命令行输入
**npm run serve**启动

ps:
- 可以使用 vscode 打开项目,再在 vscode 终端敲命令 启动
- 也可以使用 idea 打开项目,在终端敲命令 启动
总结
牢记 Vue 的基本结构\
html
<body>
<div id="app">
{{}}
<div v-if="变量" v-for=""></div>
<img v-bind:src="" @click="">
</div>
<script src="../js/vue-2.7.16.js"></script>
<script>
new Vue({
el:"#app",
data:{}, // 定义变量
methods:{}, // 定义函数
computed:{}, // 定义计算属性
components:{} // 定义组件
})
</script>
</body>
- 记住每个指令的作用
- v-if 和 v-show
- v-for
- v-bind 和 v-model
- v-on
- 记住计算属性的
- 目的
- 写法
- 和函数的区别
- 知道组件
- 为什么需要组件?有什么作用?
- 怎么写的?
- 需要有组件名
- 组件模版有 templet 写标签,data 定义数据,methods 定义函数
- 怎么用的?
- 组件名当标签名
- 有什么需要注意的语法要求?
- templet 中写标签只能有标签
- ...
- 会使用 vue-cli 创建项目
- 会用命令创建项目
- 运行项目
- 点开项目的每个文件看看
- 记住 src 下的每个文件的作用



| |