1. Vue.js课程介绍
2. Vue的认识和特点介绍
3. Vue.js安装
- 安装方式:
- CDN引入:选择开发环境版本
<!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- 生产环境版本,优化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script>
- 下载和引入(先用这种)
开发环境 https://vuejs.org/js/vue.js
生产环境 https://vuejs.org/js/vue.min.js - NPM安装(脚手架的使用):后续通过webpack和CLI的使用,我们使用该方式
- CDN引入:选择开发环境版本
4. HelloVue的初体验
- 注:let(定义变量)/const(定义常量),ES6中基本不用Var
- 代码:
<body>
<div id="app"> {{ message }} </div>
<script src="../js/vue.js"></script>
<script>
// let(定义变量)/const(定义常量),ES6中基本不用Var
// 编程范式:声明式编程。优点:数据与界面处理完全分离
const app = new Vue({
el: "#app", // 用于挂载要管理的元素
data: { // 定义数据
message: '宁好'
}
})
/* 原始JS的做法(编程范式:命令式编程):
1. 创建div元素,设置id属性
2. 定义一个变量叫message
3. 将message变量放在前面的div元素中显示
4. 修改message数据:今天天气不错
5. 将修改后的数据再次替换到div元素 */
</script>
</body>
- 第一个Vue程序,体验Vue的响应式
5. Vue列表的展示
- 体验v-for指令的用法
- 代码:
<body>
<div id="app">
<ul>
<li v-for = "item in movies"> {{ item }} </li>
</ul>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
message:'宁好',
movies: ['星际穿越','大话西游','鬼吹灯','泰坦尼克']
}
})
</script>
</body>
- 效果:
6. 小案例 - 计数器
- 代码:
<body>
<div id="app">
<h2>当前计数:{{ counter }} </h2>
<button @click="add">+</button>
<button @click="sub">-</button>
<!-- <button @click="counter++">+</button> -->
<!-- <button @click="counter--">-</button> -->
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
counter: 0
},
methods: {
add: function () {
console.log('add被执行');
this.counter++ // this代表当前对象
},
sub: function () {
console.log('sub被执行');
this.counter-- // this代表当前对象
}
}
})
// 1.拿button元素
// 2.添加监听事件(v-on,可以简写为@,这种简写的方式又称为语法糖)
</script>
</body>
- 总结:
- 新的属性:methods,该属性用于在Vue对象中定义方法
- 新的指令:@click, 该指令用于监听某个元素的点击事件,并且需要指定当发生点击时,执行的方法(方法通常是methods中定义的方法)
7. Vue中的MVVM
-
MVVM:Model-View-ViewModel
-
计数器中的MVVM
- View依然是我们的DOM
- Model就是我们我们抽离出来的obj(app)
- ViewModel就是我们创建的Vue对象实例
- 工作方式:
- 首先ViewModel通过Data Binding让obj(app)中的数据实时的在DOM中显示
- 其次ViewModel通过DOM Listener来监听DOM事件,并且通过methods中的操作,来改变obj(app)中的数据
8. 理解Vue的options选项
我们在创建Vue实例的时候,传入了一个对象options。
- 目前先掌握这些选项:
1.el:
1. 类型:string | HTMLElement
2. 作用:决定之后Vue实例会管理哪一个DOM
2. data:
1. 类型:Object | Function (组件当中data必须是一个函数)
2. 作用:Vue实例对应的数据对象
3. methods:
1. 类型:{ [key: string]: Function }
2. 作用:定义属于Vue的一些方法,可以在其他地方调用,也可以在指令中使用 - 补充:开发中什么时候称为方法,什么时候称之为函数?
- 方法:method,定义在类中,与一个对象相关联
- 廖雪峰网站:绑定到对象上的函数称为方法,和普通函数也没啥区别,但是它在内部使用了一个this关键字。在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是
xiaoming
这个变量。所以,this.birth
可以拿到xiaoming
的birth
属性
9. 什么是Vue的生命周期
- 生命周期:事物从诞生到消亡的整个过程
10. 理解Vue的生命周期有哪些
11. 定义Vue的template
- 补充:代码规范:缩进4个空格或缩进2个空格(前端大型开源项目经常使用)
12. 插值操作 - Mustache语法
-
问:如何将data中的文本数据,插入到HTML中呢?
- 答:我们已经学习过了,可以通过Mustache语法(也就是双大括号)
-
补充:Mustache语法不仅可以直接写变量,也可以写简单的表达式
13. 插值操作 - 其他指令的使用
-
v-once
该指令表示元素和组件(组件后面才会学习)只渲染一次,不会随着数据的改变而改变。该指令后面不需要跟任何表达式(比如之前的v-for后面是由跟表达式的)-
指令:
-
结果:
-
-
v-html
该指令后面往往会跟上一个string类型,并会将string的html解析出来并且进行渲染
- 代码:
<body>
<div id="app">
<h2> {{ url }} </h2>
<h2 v-html="url"></h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
message:'宁好',
url:'<a href="http://www.google.com">谷歌搜索</a>'
}
})
</script>
</body>
- 效果:
- v-text指令
v-text作用和Mustache比较相似,都是用于将数据显示在界面中。但是v-text不够灵活,所以一般不使用
- 代码:
<div id="app">
<h2> {{ message }} </h2>
<h2 v-text="message"></h2>
</div>
- 结果:
- v-pre
v-pre用于跳过这个元素和它子元素的编译过程,用于显示原本的Mustache语法
- 代码:
<div id="app">
<h2> {{ message }} </h2>
<h2 v-pre> {{ message }} </h2>
</div>
- 结果:
- v-cloak(cloak:斗篷)
- 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
[v-cloak]{
display: none;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<h2> {{ message }} </h2>
</div>
<script src="../js/vue.js"></script>
<script>
// 在Vue解析之前,div中有一个属性v-clock
// 在Vue解析之后,div中就没有一个属性v-cloak
setTimeout(function () {
const app = new Vue({
el: "#app",
data: {
message: '宁好'
}
})
}, 1000)
</script>
</body>
</html>
- 结果 :“宁好”在空白一秒后显示
14. v-bind的基本使用
- v-bind简介:
- 作用:动态绑定属性
- 缩写:
:
- 预期:any (with argument) | Object (without argument)
- 参数:attrOrProp (optional)
- 代码:
<body>
<div id="app">
<img v-bind:src="imgURL" alt="">
<br>
<a :href="aHref">谷歌搜索</a> <!-- 语法糖写法 -->
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
message: '宁好',
imgURL: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/OSIRIS_Mars_true_color.jpg/600px-OSIRIS_Mars_true_color.jpg',
aHref: 'http://www.google.com'
}
})
</script>
</body>
-
结果:
-
v-bind语法糖:可简写为
:
15. v-bind动态绑定class(对象语法)
对象语法的含义是:class后面跟的是一个对象
- 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.active {
color: blue;
}
</style>
</head>
<body>
<div id="app">
<!-- <h2 class="active"> {{ message }} </h2> -->
<!-- <h2 :class="active"> {{ message }} </h2> -->
<!-- <h2 v-bind:class=" {key1:value1, key2:value2}"> {{ message }} </h2> -->
<!-- <h2 v-bind:class=" {类名1:boolean}, 类名2:boolean} "> {{ message }} </h2> -->
<h2 v-bind:class="{active: isActive, line: isLine}"> {{message}} </h2>
<button @click="btnClick">按钮</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
message: '宁好',
isActive: true,
isLine: true
},
methods:{
btnClick: function(){
this.isActive = !this.isActive;
}
}
})
</script>
</body>
</html>
- 结果:
属性如图:
控制台输入:
字体的蓝色消失且无active属性:
点击按钮,字体交替变色:
- 总结:
用法一:直接通过{}绑定一个类
<h2 :class="{'active': isActive}">Hello World</h2>
用法二:也可以通过判断,传入多个值
<h2 :class="{'active': isActive, 'line': isLine}">Hello World</h2>
用法三:和普通的类同时存在,并不冲突
注:如果isActive和isLine都为true,那么会有title/active/line三个类
<h2 class="title" :class="{'active': isActive, 'line': isLine}">Hello World</h2>
用法四:如果过于复杂,可以放在一个methods或者computed中(后面再讲)
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>
16. v-bind动态绑定class(数组语法)
数组语法的含义是:class后面跟的是一个数组
- 总结:
用法一:直接通过{}
绑定一个类
<h2 :class="['active']">Hello World</h2>
用法二:也可以传入多个值
<h2 :class=“[‘active’, 'line']">Hello World</h2>
用法三:和普通的类同时存在,并不冲突
注:会有title/active/line三个类
<h2 class="title" :class=“[‘active’, 'line']">Hello World</h2>
用法四:如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>
17. v-for和v-bind结合的作业布置
18. v-bind绑定style(对象语法)
- 语法:
style后面跟的是一个对象类型- 对象的key是CSS属性名称
- 对象的value是具体赋的值,值可以来自于data中的属性
:style="{color: currentColor, fontSize: fontSize + 'px'}"
- 代码:
<!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 :style="{key(CSS属性名): value(属性值)}">{{ message }}</h2> -->
<!-- 50px必须加上单引号,否则会被当成变量解析 -->
<h2 :style="{fontSize: '50px'}"> {{ message }} </h2>
<!-- font和size的连接既可用以上的驼峰标识,也可用font-size -->
<h2 :style="{fontSize: finalSize, color: finalColor}"> {{ message }} </h2>
<!-- finalSize被单成一个变量使用 -->
<!-- 在Vue中,引用key时可以不加单引号,但引用value时必须加单引号 -->
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
message: '宁好',
finalSize: '100px',
finalColor: 'blue',
}
})
</script>
</body>
</html>
- 效果:
19. v-bind绑定style(数组语法)
- 语法:
style后面跟的是一个数组类型。若为多个值,分割即可
<div v-bind:style="[baseStyles, overridingStyles]"></div>
- 代码:
<!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 :style="[baseStyle, baseStyle1]">{{ message }}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el:"#app",
data:{
message:'宁好',
baseStyle: {backgroundColor:'yellow'},
baseStyle1: {fontSize:'100px'},
}
})
</script>
</body>
</html>
- 结果:
20. 计算属性的基本使用
- 代码:
<!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>{{ firstName + ' ' + lastName }}</h2>
<h2>{{ firstName }} {{ lastName }}</h2>
<h2>{{ getFullName() }}</h2>
<h2>{{ fullName }}</h2> <!-- 计算属性后不需要加() -->
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
firstName: 'LeBron',
lastName: 'James'
},
// computed:计算属性
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName;
}
},
methods: {
getFullName() {
return this.firstName + ' ' + this.lastName;
}
}
})
</script>
</body>
</html>
- 结果:
21. 计算属性的复杂操作
- 代码:
<!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>总价格: {{ totalPrice }}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
books: [
{ id: 110, name: 'JS编程艺术', price: 50 },
{ id: 111, name: '代码大全', price: 70 },
{ id: 112, name: '深入理解计算机原理', price: 120 },
{ id: 113, name: '现代操作系统', price: 96 },
]
},
computed: {
// 以后讲高阶函数:filter/map/reduce
totalPrice: function () {
let result = 0
for (let i = 0; i < this.books.length; i++) {
result += this.books[i].price;
}
return result;
}
}
})
</script>
</body>
</html>
- 结果: