1.vue基础

​ 概念:Vue是一种流行的前端JavaScript框架,用于构建交互式的用户界面。它是一种开源框架,由尤雨溪(Evan You)开发并维护。Vue的目标是通过简单的API和响应式数据绑定来帮助开发者构建现代化的单页面应用程序

​ vue官方文档:https://cn.vuejs.org

demo1:入门案例——导入依赖

导入开发版本的vue.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<body>
<div id="app">
{{message}}
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app=new Vue({
el:"#app",
data:{
message:"Hello Vue!"
}
})
</script>
</body>

也可导入vue.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue基础</title>
<!-- 导入Vue.js文件 -->
<script src="vue.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message:"Hello Vue!"
}
})
</script>
</body>
</html>

demo2——el挂载点

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">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- Vue实例的作用范围是什么? -->
<!-- Vue会管理el选项命中元素以及其内部的后代元素。 -->
app元素外部:{{ message }}
<div id="app_1">
app元素内部:{{ message }}
<br>
<span>app元素内部的sapn标签下:{{ message }}</span>
</div>
<script>
var app = new Vue({
el:'#app_1',
data:{
message:"Hello Vue!"
}
})
</script>
<br>

<!-- 是否可以使用其他的选择器? -->
<!-- 可以,但是推荐使用id选择器,因为其他选择器都不唯一。 -->
<div class="app_2">
{{ message }}
</div>
<script>
var app = new Vue({
el:'.app_2',
data:{
message:"现在使用的class选择器"
}
})
</script>
<br>

<!-- 是否可以设置其他的DOM元素呢? -->
<!-- 可以,可以使用其他的双标签,单标签不能、html和body之上也不能挂载。 -->
<h2 id="app_3">
{{ message }}
</h2>
<script>
var app = new Vue({
el: '#app_3',
data:{
message:"这是H2元素"
}
})
</script>
</body>
</html>

demo3:认识Vue实例——data数据对象

2.vue本地应用

通过vue实现常见的网页效果

Vue指令 作用
v-text 设置标签的内容(textContent)
v-html 设置元素的innerHTML
v-on 为元素绑定事件
v-show 根据真假切换元素的显示状态
v-if 根据表达式的真假切换元素的显示状态
v-bind 为元素绑定属性
v-for 根据数据生成列表结构
v-model 便捷的设置和获取表单元素的值

v-text

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- v-text
v-text指令的作用是:设置标签的内容(textContent)
默认写法会替换全部内容,使用差值表达式{{}},可以替换指定内容
-->
<div id="app">
<h2 v-text="message"></h2>
<h2 v-text="info"></h2>
<h2>{{ message }}</h2>

<h2 v-text="message">深圳</h2>
<h2>{{ message }}深圳</h2>

<h2 v-text="message + '!!'"></h2>
<h2>{{ message + '!!'}}深圳</h2>
</div>

<script>
var app = new Vue({
el:'#app',
data:{
message:"黑马程序员",
info:"前端与移动教研部"
}
})
</script>
</body>
</html>

v-html

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- v-html
v-html指令的作用是:设置元素的innerHTML;
内容中有html结构会被解析为标签;
v-text指令无论内容是什么,只会解析为文本。
-->
<div id="app">
<p v-html="content"></p>
<p v-text="content"></p>
</div>

<script>
var app = new Vue({
el:'#app',
data:{
// content:"黑马程序员"
content: "<a href='http://www.itheima.com'>黑马程序员</a>"
}
})
</script>
</body>
</html>

v-on

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- v-on指令
v-on指令的作用是:为元素绑定事件
事件名不需要写on
指令可以简写为@
绑定的方法定义在methods属性中
方法内部通过this关键字可以访问定义在data中数据
-->
<div id="app">
<input type="button" value="事件绑定-点击" v-on:click="dolt">
<input type="button" value="事件绑定-双击" v-on:dblclick="dolt">
<!-- 简写 -->
<input type="button" value="事件绑定-简写点击" @click="dolt">
<h2 @click="change">{{ food }}</h2>
</div>

<script>
var app = new Vue({
el:"#app",
data:{
food:"西蓝花炒鸡蛋"
},
methods:{
dolt:function(){
alert("做IT");
},
change:function(){
// console.log(this.food);
this.food += "好好吃!"
}
}
})
</script>
</body>
</html>
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!--
事件绑定的方法写成函数调用的形式,可以传入自定义参数
定义方法时需要定义形参来接受传入的实参
事件的后面跟上.修饰符可以对事件进行限制,例如.enter可以限制触发的按键为回车
-->
<div id="app">
<input type="button" value="点击" @click="doIt(666)">
<input type="text" @keyup.enter="sayHi">
</div>
<script>
var app = new Vue({
el:'#app',
methods:{
doIt:function(p1){
console.log("做It");
console.log(p1);
},
sayHi:function(){
alert("吃了没");
}
}
})
</script>
</body>
</html>

v-show

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- v-show
v-show指令的作用是:根据真假切换元素的显示状态
原理是修改元素的display,实现显示隐藏
指令后面的内容,最终都会解析为布尔值
值为true元素显示,值为false元素为隐藏
-->
<div id="app">
<input type="button" value="切换显示状态" @click="changeIsShow">
<img v-show="IsShow" src="1.png" alt="">
<br>
<span>{{ age }}</span>
<input type="button" value="年龄age增加" @click="changeAge">
<img v-show="age >= 18" src="1.png" alt="">
</div>

<script>
var app = new Vue({
el:'#app',
data:{
IsShow:false,
age:17
},
methods:{
changeIsShow:function(){
this.IsShow = ! this.IsShow;
},
changeAge:function(){
this.age++;
}
}
});
</script>
</body>
</html>

v-if

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- v-if指令
v-if指令的作用是根据表达式的真假切换元素的显示状态
本质是通过操纵dom元素来切换显示状态
表达式的值为true,元素存在于dom树中;表达式的值为false,从dom树中移除。
-->
<div id="app">
<button @click="ChangeShow">切换状态</button>
<p v-if="IsShow">我是一个p标签,由v-if控制</p>
<p v-show="IsShow">我是一个p标签,由v-show控制</p>
<p v-if="temperature >= 35">热死了!</p>
</div>

<script>
var app = new Vue({
el:'#app',
data:{
IsShow:true,
temperature:40
},
methods:{
ChangeShow:function(){
this.IsShow = !this.IsShow;
}
}
});
</script>
</body>
</html>

v-bind

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
<style>
.active{
border: 1px solid red;
}
</style>
</head>
<body>
<!-- v-bind指令
v-bind指令的作用是为元素绑定属性
完整写法是v-bind:属性名
简写的话可以直接省略v-bind,只保留 :属性名
-->
<div id="app">
全写:v-bind:src
<img v-bind:src="imgSrc" v-bind:title="imgTitle" alt="">
<br>
简写 :src
<img :src="imgSrc" :title="imgTitle + '!!!!'" alt="">
<br>
添加类_三元表达式
<button @click="toggleActive">点击我改变class属性</button>
<img :src="imgSrc" :title="imgTitle + '!!!!'" :class="isActive?'active':''" alt="">
<br>
添加类_对象方式
<button @click="toggleActive">点击我改变class属性</button>
<img :src="imgSrc" :title="imgTitle + '!!!!'" :class="{active:isActive}" alt="">
</div>

<script>
var app = new Vue({
el:'#app',
data:{
imgSrc:"http://www.itheima.com/images/logo.png",
imgTitle:"黑马程序员",
isActive:false
},
methods:{
toggleActive:function(){
this.isActive = !this.isActive;
}
}
});
</script>
</body>
</html>

v-for

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!--
v-for指令的作用是根据数据生成列表结构
数组经常和v-for结合使用
语法是(item,index) in 数据
item和index可以结合其他指令一起使用
数组长度的更新会同步到页面上,是响应式的
-->
<div id="app">
<ul>
<li v-for="item in Array">你好,{{ item }}</li>
</ul>
<h2 v-for="item in vegetables" :title="item.name">{{ item.name }}</h2>
<button @click="add">点我添加</button>
<button @click="remove">点我移除</button>
</div>

<script>
var app = new Vue({
el:'#app',
data:{
Array:["张三","李四","王五","马六","二蛋"],
vegetables:[
{name:"葱花炒蛋"},
{name:"番茄炒蛋"}
]
},
methods:{
add:function(){
this.vegetables.push({ name:"韭菜炒蛋"});
},
remove:function(){
// 移除最左边的一个
this.vegetables.shift();
}
}
})
</script>
</body>
</html>

v-model

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!--
v-model指令的作用是便捷的设置和获取表单元素的值
绑定的数据会和表单元素值相关联
-->
<div id="app">
<input type="text" v-model="message" @keyup.enter="getMessage">
<h2>{{ message }}</h2>
<input type="button" value="点我修改" @click="setMessage">
</div>
<script>
var app = new Vue({
el:'#app',
data:{
message:"黑马程序员"
},
methods:{
getMessage:function(){
alert(this.message);
},
setMessage:function(){
this.message = "111";
}
}
});
</script>
</body>
</html>

界面1:计数器

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- 计数器
创建Vue示例时:el(挂载点)、data(数据)、methods(方法)
v-on指令的作用是绑定事件,简写为@
方法中通过this关键字获取data中的数据
v-text指令的作用是设置元素的文本值,简写为{{}}
-->
<div class="input-num" id="app">
<button @click='reduce'>-</button>
<span>{{ num }}</span>
<button @click='add'>+</button>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
num:1
},
methods:{
reduce:function(){
console.log("reduce")
if(this.num == 1){
alert("不能为0")
}
else{
this.num--;
}
},
add:function(){
console.log("add")
if(this.num>=9){
alert("不能超过10个")
}
else{
this.num++;
}
}
}
});
</script>
</body>
</html>

界面2:图片切换

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- 图片切换
列表数据使用数组保存
v-bind指令可以设置元素属性,比如src
v-show和v-if都可以切换元素的显示状态,频繁切换用v-show
-->
<div id="app">
<img :src="imgArray[index]" alt="">
<a href="#" @click="prev" v-show="index>0">上一张</a>
<a href="#" @click="next" v-show="index<imgArray.length-1">下一张</a>
</div>

<script>
var app = new Vue({
el:'#app',
data:{
imgArray:["https://img20.360buyimg.com/pop/s590x470_jfs/t1/222408/26/6055/99082/61b997c0Ead36013d/9b2da06b3f438624.jpg.webp",
"https://img14.360buyimg.com/pop/s590x470_jfs/t1/208171/7/13900/69634/61c96765E6e65374c/642ed952f9778144.jpg.webp",
"https://imgcps.jd.com/ling4/100012043978/5Lqs6YCJ5aW96LSn/5L2g5YC85b6X5oul5pyJ/p-5f3a47329785549f6bc7a6f4/a10ab487/cr/s/q.jpg",
"https://img12.360buyimg.com/pop/s590x470_jfs/t1/205354/16/17988/82004/61b1dc96Ee600f3f3/9ffa616349105df0.png.webp"
],
index:0,
},
methods:{
prev:function(){
this.index--;
},
next:function(){
this.index++;
}
}
});
</script>
</body>
</html>

界面3:小黑记事本

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!-- 
列表结构可以通过v-for指令结合数据生成
v-on结合事件修饰符可以对事件进行限制,比如.enter
v-on在绑定事件时可以传递自定义参数
通过v-model可以快速的设置和获取表单元素的值
基于数据的开发方式
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="vue.js"></script>
</head>
<body>
<!-- 主体区域 -->
<section id="todoapp">
<!-- 输入框 -->
<header class="header">
<h1>小黑笔记本</h1>
<input v-model="inputValue" @keyup.enter="add" type="text" autofocus="autofocus" autocomplete="off" placeholder="请输入任务" class="new_todo">
</header>
<!-- 列表区域 -->
<section class="main">
<ul class="to_list">
<li class="todo" v-for="(item,index) in list">
<div class="view">
<span class="index">{{ index+1 }}</span>
<label>{{ item }}</label>
<button @click="remove(index)" class="destory">×</button>
</div>
</li>
</ul>
</section>
<!-- 统计和清空 -->
<footer class="footer">
<span class="todo_count" v-if="list.length!=0">
<strong>{{ list.length }}</strong>
items left
</span>
<button @click="clear" class="clear_completed" v-show="list.length!=0">Clear</button>
</footer>
</section>
<!-- 底部 -->
<footer class="info">

</footer>

<!-- JS -->
<script>
var app = new Vue({
el:'#todoapp',
data:{
list:["写代码","吃饭饭","睡觉觉"],
inputValue:"好好学习", //用来获取用户输入的内容
},
methods:{
add:function(){
this.list.push(this.inputValue);
},
remove:function(index){
console.log("1")
this.list.splice(index,1);
},
clear:function(){
this.list = [];
}
}
})
</script>
</body>
</html>

3.vue网络应用

axios:功能强大的网络请求库,先导入再使用。使用get和post方法发送对应的请求,then方法中的回调函数会在请求成功或失败时触发,通过回调函数的形参可以获取相响应地址的内容或错误信息。

axios官网文档:http://www.axios-js.com/zh-cn/docs/

模板:

1
2
axios.get(地址?key=value&key2=values).then(function(response){},function(err){})
axios.post(地址,{key:value,key2:value2}).then(function(response){},function(err){})
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>25-网络应用- axios基本使用</title>
</head>
<body>
<input type="button" value="get请求" class="get">
<input type="button" value="post请求" class="post">
<!-- 官网提供的 axios 在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
/*
接口1:随机笑话
请求地址:https://autumnfish.cn/api/joke/list
请求方法:get
请求参数:num(笑话条数,数字)
响应内容:随机笑话
*/
document.querySelector(".get").onclick=function(){
axios.get("https://autumnfish.cn/api/joke/list?num=3")
.then(function(response){
console.log(response);
},function(err){
console.log(err);
})
}
/*
接口2:用户注册
请求地址:https://autumnfish.cn/api/user/reg
请求方法:post
请求参数:username(用户名,字符串)
响应内容:注册成功或失败
*/
document.querySelector(".post").onclick=function(){
axios.post("https://autumnfish.cn/api/user/reg",{username:"阿香"})
.then(function(response){
console.log(response);
},function(err){
console.log(err);
})
}

</script>
</body>
</html>

axios与vue结合

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
<!-- 
axios回调函数中的this已经改变,无法访问到data中数据,
把this保存起来,回调函数中直接使用保存的this的变量即可。
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>26-网络应用- axios与vue结合使用</title>
</head>
<body>
<div id="app">
<input type="button" value="获取笑话" @click="getJoke">
<p>{{joke}}</p>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 官网提供的 axios 在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
/*
接口:随机获取一条笑话
请求地址:https://autumnfish.cn/api/joke
请求方法:get
请求参数:无
响应内容:随机笑话
*/
var app=new Vue({
el:"#app",
data:{
joke:"笑话显示区域",

},
methods:{

getJoke:function(){
console.log(this.joke);
var that=this;
axios.get("https://autumnfish.cn/api/joke")
.then(function(response){
console.log(response);
console.log(response.data);
console.log(this.joke);
that.joke=response.data;
},function(err){
console.log(err);
})
}
}
})
</script>
</body>
</html>

界面4:查天气

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<!-- 查询天气的应用 -->
<!--
回车查询
按下回车(v-on .enter)
查询数据(axios接口 v-model)
渲染数据(v-for 数组 that)

天气接口:
请求地址:http://wthrcdn.etouch.cn/weather_mini
请求方法:get
请求参数:city(查询城市名)
响应内容:天气信息
点击查询
点击城市(v-on 自定义参数)
查询数据(this关键字)
渲染数据
-->
<!--
应用的逻辑代码建议和页面分离,使用单独的js文件编写
axios回调函数中this指向改变了,需要额外的保存一份
-->
<!--
自定义参数可以让代码的复用性更高
methods中定义的方法内部,可以通过this关键字点出其他的方法
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>天知道</title>
<link rel="stylesheet" href="快速入门Vue.js资料\04-源代码\demo-天知道\css\index.css">
<link rel="stylesheet" href="快速入门Vue.js资料\04-源代码\demo-天知道\css\reset.css" />
</head>
<body>
<div class="wrap" id="app">
<div class="search_form">
<div class="logo"><img src="快速入门Vue.js资料\04-源代码\demo-天知道\img\logo.png" alt="logo" /></div>
<div class="form_group">
<input type="text" v-model="city" @keyup.enter="searchWeather" class="input_txt" placeholder="请输入查询的天气"/>
<button class="input_sub" @click="searchWeather">
搜 索
</button>
</div>
<div class="hotkey">
<a href="javascript:;" @click="changeCity('北京')">北京</a>
<a href="javascript:;" @click="changeCity('上海')">上海</a>
<a href="javascript:;" @click="changeCity('广州')">广州</a>
<a href="javascript:;" @click="changeCity('深圳')">深圳</a>
</div>
</div>
<ul class="weather_list">
<li v-for="item in weatherList">
<!-- 天气类型 -->
<div class="info_type">
<span class="iconfont">{{ item.type }}</span>
</div>
<!-- 天气温度 -->
<div class="info_temp">
<b>{{ item.low }}</b>
~
<b>{{ item.high }}</b>
</div>
<!-- 日期 -->
<div class="info_date">
<span>{{ item.date }}</span>
</div>
</li>
</ul>
</div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 官网提供的 axios 在线地址 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>


<!-- 自己的js -->
<script>
var app = new Vue({
el:'#app',
data:{
city:"",
weatherList:[]
},
methods:{
searchWeather:function(){
var that = this;
axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city)
.then(
function(response){
console.log(response.data.data.forecast);
that.weatherList = response.data.data.forecast;
},
function(err){
console.log(err);
}
)
},
changeCity:function(city){
this.city = city;
this.searchWeather();
}
}
})
</script>

</body>
</html>

4.vue综合实际

界面5:音乐播放器

1.歌曲搜索
2.歌曲播放
3.歌曲封面
4.歌曲评论
5.播放动画
6.mv播放

歌曲搜索

  1. 按下回车(v-on .enter)

  2. 查询数据(axios 接口 v-model )

  3. 渲染数据(v-for 数组 that)

  4. 点击播放(v-on 自定义参数)
    点击播放按钮:播放歌曲的本质就是设置歌曲的src,切换歌曲就是更换不同的src,歌曲的地址从network查看,歌曲地址是通过接口获取到的,获取歌曲地址后找到歌曲播放地址,将播放地址存到data的musicUrl字段中,再传给给audio标签;
    注:点击时需要传入参数,从接口获得的歌曲的点击事件才会才会被绑定。

  5. 歌曲地址获取:
    根据接口确定一个传递的参数(歌曲id),搜索出的歌曲时服务器返回的结果数组中每一项都有歌曲id,不同歌曲id不同,但查询逻辑是一样的;(总:接口调用,把所需的参数传过去)

  6. 歌曲地址设置(v-bind)
    data中增加歌曲属性,歌曲id依赖与歌曲的搜索结果,v-bind绑定到播放条中。

歌曲封面

播放动画

  1. 监听音乐播放(v-on play)
    核心:增删一个类
    播放时碟片旋转,暂停时停时旋转,检测动画的播放状态,在对应的事件中增删类名,

  2. 监听音乐暂停(v-on pause)

  3. 操纵类名(v-bind 对象)
    audio标签的play事件会在音频播放的时候触发
    audio标签的pause事件会在音频暂停的时候触发
    通过对象的方式设置类名,类名生效与否取决于后面值的真假

播放mv

  1. mv图标显示(v-if)
  2. mv地址获取
  3. 遮罩层
  4. mv地址设置

源码地址:

本篇文章用于作者本人学习回顾时使用。