本文最后更新于:8 个月前
Vue学习
Vue 2.x 的文档: https://v2.cn.vuejs.org/v2/guide/
Vue 3 的文档: https://cn.vuejs.org/guide/introduction.html
视频:黑马程序员vue前端基础教程-4个小时带你快速入门vue
https://www.bilibili.com/video/BV12J411m7MG/
https://blog.csdn.net/cjdxyang/article/details/121122938
Vue CLI: https://cli.vuejs.org/zh/guide/ Vite 官方中文文档: https://cn.vitejs.dev/guide/
一、选择器
ID选择器
类选择器
标签选择器
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 <!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 > </head > <body id ="body" > <div id ="app" class ="app" > {{message}} <h3 > {{message}}</h3 > <span > {{message}}</span > </div > <script src ="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js" > </script > <script > var app = new Vue ({ el : "#app" , data : { message : "Hello, Vue!" } }) </script > </body > </html >
二、data: 数据对象 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 <!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 > data: 数据对象</title > </head > <body > <div id ="app" > {{message}} <h2 > {{school}} </h2 > <span > {{ school.name }} {{ school.mobil }} </span > <ul > <li > {{campus[0]}}</li > <li > {{campus[1]}}</li > <li > {{campus[2]}}</li > </ul > </div > <script src ="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js" > </script > <script > var app = new Vue ({ el : "#app" , data : { message : "hello,vue" , school : { name : "北京大学" , mobil : "123456789" }, campus : ["北京" , "上海" , "广州" ] } }) </script > </body > </html >
三、vue渲染命令 1. v-text 2. v-on v-on基础
绑定事件:click、dblclick、mouseenter
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 <!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 > </head > <body > <script src ="./vue.js" > </script > <div id ="app" > <h2 v-text ="message" > abc</h2 > <h2 v-text ="info" > abc</h2 > <h2 > {{message}}abc</h2 > <p v-text ="context" > </p > <p v-html ="context" > </p > <input type ="button" value ="v-on指令" v-on:click ="doIt" > <input type ="button" value ="v-on简写" @click ="doIt" > <input type ="button" value ="双击事件" @dblclick ="doIt" > <h2 @click ="changeFood" > {{food}}</h2 > </div > <script > var app = new Vue ({ el : "#app" , data : { message : "哈哈哈" , info : "123123" , context : "<a href='https://www.baidu.com'>百度</a>" , food : "西红柿" }, methods : { doIt : function ( ){ alert ("doIt" ) }, changeFood : function ( ){ 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 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 > 计数器</title > </head > <body > <div id ="app" > <div class ="input-num" > <button @click ="sub" > -</button > <span > {{num}}</span > <button @click ="add" > +</button > </div > </div > <script src ="./vue.js" > </script > <script > var app = new Vue ({ el : "#app" , data : { num : 1 }, methods : { add :function ( ){ if (this .num < 10 ) { this .num ++; } else { alert ("别点啦,最大了" ); } }, sub :function ( ){ if (this .num > 0 ) { this .num --; } else { alert ("别点啦,最小了" ); } } } }) </script > </body > </html >
3. 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 > v-show指令</title > </head > <body > <div id ="app" > <input type ="button" value ="切换显示图片" @click ="changeIsShow" > <input type ="button" value ="累加年龄" @click ="addAge" > <div > <img src ="C:\Users\chris\Downloads\Snipaste_2023-05-30_20-44-37.png" width ="30%" v-show ="isShow" > <img src ="C:\Users\chris\Downloads\Snipaste_2023-05-30_20-44-37.png" width ="30%" v-show ="age>=18" > </div > </div > <script src ="./vue.js" > </script > <script > var app = new Vue ({ el : "#app" , data : { isShow : false , age : 17 }, methods : { changeIsShow : function ( ) { this .isShow = !this .isShow ; }, addAge : function ( ) { this .age ++; } } }) </script > </body > </html >
4. v-if
v-if指令的作用是:根据表达式的真假切换元素的显示状态
本质是通过操纵dom元素来切换显示状态
表达式的值为true,元素存在于dom树中,为false,从dom树中移除
频繁的切换v-show,反之使用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 39 <!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 > v-if指令</title > </head > <body > <div id ="app" > <input type ="button" value ="切换显示" @click ="toggleIsShow" > <p v-if ="isShow" > 黑马程序员</p > <p v-show ="isShow" > 黑马程序员 - v-show修饰</p > <h2 v-if ="temperature>=35" > 热死啦</h2 > </div > <script src ="./vue.js" > </script > <script > var app = new Vue ({ el : "#app" , data : { isShow : false , temperature : 25 }, methods : { toggleIsShow : function ( ) { this .isShow = !this .isShow ; } } }) </script > </body > </html >
5. v-bind 设置元素的属性(比如src, title, class)
作用:为元素绑定属性
简写可以省略v-bind,只保留::属性名
6.v-for 作用:根据数据生成列表结构
数组经常和v-for结合使用
语法:
item和index可以结合其他指令一起使用
数组长度的更新会同步到页面上,是响应式的
7.v-on补充
https://v2.cn.vuejs.org/v2/api/#v-on
传递自定义参数,事件修饰符
事件绑定的方法写成函数调用 的形式,就可以传入自定义参数
定义方法时需要定义形参 接收传入的实参
事件的后面跟上.修饰符 可以对事件进行限制
.enter 可以限制触发的按键为回车
8.v-model 获取和设置表单元素的值(双向数据绑定)
v-model指令的作用是便捷的设置和获取表单元素的值
绑定的数据会和表单元素的值相关联
绑定的数据和表单元素的值双向绑定,同步更新
四、小黑记事本 1) 新增
生成列表数据(v-for数组)
获取用户输入(v-model)
回车,新增数据(v-on, .enter添加数据)
2) 删除
点击删除指定内容(v-on splice 索引)
3) 统计
统计信息的个数(v-text, length)
4) 清空
点击清楚所有信息(v-on, 清空数组)
5) 隐藏
没有数据时,隐藏元素(v-show, v-if, 数组非空)
6) 总结
列表结构可以通过v-for指令结合数据生成
v-on结合事件修饰符可以对事件进行限制,比如 .enter
v-on在绑定事件时可以传递自定义参数
通过v-model可以快速的设置和获取表单元素的值
基于数据的开发方式
五、网络应用 Vue 结合网络数据开发应用
axios: 网络请求库
axios + vue结合
天气预报案例
1. axios
官网:https://axios-http.com/
项目:https://github.com/axios/axios
功能强大的网络请求库
1 2 // 引入axios<script src ="https://unpkg.com/axios/dist/axios.min.js" > </script >
1 2 3 4 5 6 7 axios.get (地址?key=value&key2=value2).then ( function (response ){ }, function (err ){ } )
1 2 3 4 5 6 7 axios.post (地址,{key :value, key2 :value2}).then ( function (response ){ }, function (err ){ } )
axios必须先导入才可以使用
使用get或post方法即可发送对应的请求
then方法中的回调函数会在请求成功或失败时触发
通过回调函数的形参可以获取响应内容,或错误信息
2. axios+vue axios如何结合Vue开发网络应用
axios回调函数中的this已经改变,无法访问到data中的数据
解决:在axios发送请求之前先把this保存起来,var that = this,回调函数中就可以直接使用保存的this了
3.天知道 1) 回车查询 (1) 按下回车(v-on .enter)
(2) 查询数据(axios接口 v-model)
(3) 渲染数据(v-for 数组 that)
应用的逻辑代码建议和页面分离,使用单独的js文件编写
axios回调函数中this指向改变了,需要额外的保存一份
服务器返回的数组比较复杂时,获取的时候需要注意层级结构
2) 点击查询 (1) 点击城市(v-on 自定义参数)
(2) 查询数据(this.数据)
(3) 渲染数据
自定义参数可以让代码的复用性更高
methods中定义的方法内部,可以通过this关键字调用其他方法
六、综合应用 悦听音乐播放器
网易云音乐API https://binaryify.github.io/NeteaseCloudMusicApi/#/
1. 歌曲搜索
请求地址:
https://autumnfish.cn/search?keywords=
(1) 按下回车(v-on .enter)
(2) 查询数据(axios接口 v-model)
(3) 渲染数据(v-for 数组 that)
2. 歌曲播放
请求地址:
https://autumnfish.cn/song/url
请求方法:get
请求参数:id(歌曲id)
响应内容:歌曲的URL地址
(1) 点击播放(v-on 自定义参数)
(2) 歌曲地址获取(axios接口 歌曲id)
(3) 歌曲地址设置(v-bind)
3. 歌曲封面
请求地址:
https://autumnfish.cn/song/detail
请求方法:get
请求参数:ids(歌曲id)
响应内容:歌曲详情,包含封面信息
(1) 点击播放(增加逻辑)
(2) 歌曲封面获取
(3) 歌曲封面设置
4. 歌曲评论
热门评论获取
请求地址:
https://autumnfish.cn/comment/hot?type=0
请求方法:get
请求参数:id(歌曲id, type固定为0)
响应内容:歌曲的热门评论
(1) 点击播放(增加逻辑)
(2) 歌曲评论获取(接口 歌曲id)
(3) 歌曲评论渲染(v-for)
5. 播放动画 (1) 监听音乐播放(v-on play)
(2) 监听音乐暂停(v-on pause)
(3) 操作类名(v-bind 对象)
audio标签的play事件会在音频播放的时候触发
audio标签的pause事件会在音频暂停的时候触发
通过对象的方式设置类名,类名生效与否取决于后面值的真假
6. MV播放
mv地址获取
请求地址:
https://autumnfish.cn/mv/url
请求方法:get
请求参数:id(mvid,为0说明没有MV)
响应内容:MV的地址
(1) MV图标显示(v-if)
(2) MV地址获取(接口 mvid)
(3) 遮罩层(v-show v-on)
(4) MV地址设置(v-bind)
不同的接口需要的数据是不同的,文档的阅读需要仔细
页面结构复杂,通过审查元素的方式去快速定位相关元素
7. 获取歌词
https://music.163.com/api/song/lyric?id={歌曲ID}&lv=1&kv=1&tv=-1
https://autumnfish.cn/