看完这个才发现,不是Vue难学,而是没有找到好的教程。
进度:目前已经学到第12节。
一、感想
其实感觉写Vue和写类差不多,主要是写属性、写方法。
基于 Vue.js 的移动端组件库
http://mint-ui.github.io/#!/zh-cn
二、音乐播放器
源码:
1 |
<!DOCTYPE html> |
2 |
<html lang= "en" > |
3 |
4 |
<head> |
5 |
<meta charset= "UTF-8" /> |
6 |
<meta name= "viewport" content= "width=device-width, initial-scale=1.0" /> |
7 |
<meta http-equiv= "X-UA-Compatible" content= "ie=edge" /> |
8 |
<title>Document</title> |
9 |
<!-- 样式 --> |
10 |
<link rel= "stylesheet" href= "./css/index.css" > |
11 |
</head> |
12 |
13 |
<body> |
14 |
<div class = "wrap" > |
15 |
<div class = "play_wrap" id= "player" > |
16 |
<div class = "search_bar" > |
17 |
<img src= "images/player_title.png" alt= "" /> |
18 |
<!-- 搜索歌曲 --> |
19 |
<input type= "text" autocomplete= "off" v-model= 'query' @keyup.enter= "searchMusic();" /> |
20 |
</div> |
21 |
<div class = "center_con" > |
22 |
<!-- 搜索歌曲列表 --> |
23 |
<div class = 'song_wrapper' ref= 'song_wrapper' > |
24 |
<ul class = "song_list" > |
25 |
<li v- for = "item in musicList" > |
26 |
<!-- 点击放歌 --> |
27 |
<a href= "javascript:;" @click= 'playMusic(item.id)' ></a> |
28 |
<b>{{item.name}}</b> |
29 |
<span> |
30 |
<i @click= "playMv(item.mvid)" v- if = "item.mvid!=0" ></i> |
31 |
</span> |
32 |
</li> |
33 |
34 |
</ul> |
35 |
<img src= "images/line.png" class = "switch_btn" alt= "" > |
36 |
</div> |
37 |
<!-- 歌曲信息容器 --> |
38 |
<div class = "player_con" : class = "{playing:isPlay}" > |
39 |
<img src= "images/player_bar.png" class = "play_bar" /> |
40 |
<!-- 黑胶碟片 --> |
41 |
<img src= "images/disc.png" class = "disc autoRotate" /> |
42 |
<img :src= "coverUrl==''?'./images/cover.png':coverUrl" class = "cover autoRotate" /> |
43 |
</div> |
44 |
<!-- 评论容器 --> |
45 |
<div class = "comment_wrapper" ref= 'comment_wrapper' > |
46 |
<h5 class = 'title' >热门留言</h5> |
47 |
<div class = 'comment_list' > |
48 |
49 |
<dl v- for = "item in hotComments" > |
50 |
<dt> |
51 |
<img :src= "item.user.avatarUrl" alt= "" /> |
52 |
</dt> |
53 |
<dd class = "name" >{{item.user.nickname}}</dd> |
54 |
<dd class = "detail" > |
55 |
{{item.content}} |
56 |
</dd> |
57 |
</dl> |
58 |
</div> |
59 |
<img src= "images/line.png" class = "right_line" > |
60 |
</div> |
61 |
</div> |
62 |
<div class = "audio_con" > |
63 |
<audio ref= 'audio' @play= "play" @pause= "pause" :src= "musicUrl" controls autoplay loop class = "myaudio" ></audio> |
64 |
</div> |
65 |
<div class = "video_con" v-show= "showVideo" > |
66 |
<video ref= 'video' :src= "mvUrl" controls= "controls" ></video> |
67 |
<div class = "mask" @click= "closeMv" ></div> |
68 |
</div> |
69 |
</div> |
70 |
</div> |
71 |
<!-- 开发环境版本,包含了有帮助的命令行警告 --> |
72 |
<script src= "https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script> |
73 |
<!-- 官网提供的 axios 在线地址 --> |
74 |
<script src= "https://unpkg.com/axios/dist/axios.min.js" ></script> |
75 |
<script type= "text/javascript" > |
76 |
// 设置axios的基地址 |
77 |
axios.defaults.baseURL = 'https://autumnfish.cn' ; |
78 |
// axios.defaults.baseURL = 'http://localhost:3000'; |
79 |
80 |
81 |
82 |
// 实例化vue |
83 |
var app = new Vue({ |
84 |
el: "#player" , |
85 |
data: { |
86 |
// 搜索关键字 |
87 |
query: '' , |
88 |
// 歌曲列表 |
89 |
musicList: [], |
90 |
// 歌曲url |
91 |
musicUrl: '' , |
92 |
// 是否正在播放 |
93 |
isPlay: false, |
94 |
// 歌曲热门评论 |
95 |
hotComments: [], |
96 |
// 歌曲封面地址 |
97 |
coverUrl: '' , |
98 |
// 显示视频播放 |
99 |
showVideo: false, |
100 |
// mv地址 |
101 |
mvUrl: '' |
102 |
}, |
103 |
// 方法 |
104 |
methods: { |
105 |
// 搜索歌曲 |
106 |
searchMusic() { |
107 |
if (this.query == 0) { |
108 |
return |
109 |
} |
110 |
axios.get( '/search?keywords=' + this.query).then(response => { |
111 |
// 保存内容 |
112 |
this.musicList = response.data.result.songs; |
113 |
114 |
}) |
115 |
116 |
// 清空搜索 |
117 |
this.query = '' |
118 |
}, |
119 |
// 播放歌曲 |
120 |
playMusic(musicId) { |
121 |
// 获取歌曲url |
122 |
axios.get( '/song/url?id=' + musicId).then(response => { |
123 |
// 保存歌曲url地址 |
124 |
this.musicUrl = response.data.data[0].url |
125 |
}) |
126 |
// 获取歌曲热门评论 |
127 |
axios.get( '/comment/hot?type=0&id=' + musicId).then(response => { |
128 |
// console.log(response) |
129 |
// 保存热门评论 |
130 |
this.hotComments = response.data.hotComments |
131 |
132 |
}) |
133 |
// 获取歌曲封面 |
134 |
axios.get( '/song/detail?ids=' + musicId).then(response => { |
135 |
// console.log(response) |
136 |
// 设置封面 |
137 |
this.coverUrl = response.data.songs[0].al.picUrl |
138 |
}) |
139 |
140 |
}, |
141 |
// audio的play事件 |
142 |
play() { |
143 |
this.isPlay = true |
144 |
// 清空mv的信息 |
145 |
this.mvUrl = '' |
146 |
}, |
147 |
// audio的pause事件 |
148 |
pause() { |
149 |
this.isPlay = false |
150 |
}, |
151 |
// 播放mv |
152 |
playMv(vid) { |
153 |
if (vid) { |
154 |
this.showVideo = true; |
155 |
// 获取mv信息 |
156 |
axios.get( '/mv/url?id=' + vid).then(response => { |
157 |
// console.log(response) |
158 |
// 暂停歌曲播放 |
159 |
this. $refs .audio.pause() |
160 |
// 获取mv地址 |
161 |
this.mvUrl = response.data.data.url |
162 |
}) |
163 |
} |
164 |
}, |
165 |
// 关闭mv界面 |
166 |
closeMv() { |
167 |
this.showVideo = false |
168 |
this. $refs .video.pause() |
169 |
}, |
170 |
// 搜索历史记录中的歌曲 |
171 |
historySearch(history) { |
172 |
this.query = history |
173 |
this.searchMusic() |
174 |
this.showHistory = false; |
175 |
} |
176 |
}, |
177 |
178 |
}) |
179 |
180 |
</script> |
181 |
</body> |
182 |
183 |
</html> |
三、版本二
源码:
1 |
<!DOCTYPE html> |
2 |
<html lang= "zn" > |
3 |
<head> |
4 |
<meta charset= "UTF-8" > |
5 |
<meta name= "viewport" content= "width=device-width, initial-scale=1.0" > |
6 |
<title>Vue音乐实例 _ Ganto</title> |
7 |
<link rel= "stylesheet" href= "css/index.css" > |
8 |
<link rel= "shortcut icon" type= "text/css" href= "http://ganto.xyz/images/favicon.ico" /> |
9 |
</head> |
10 |
<body> |
11 |
<div id= "box" > |
12 |
<div id= "app" > |
13 |
<div class = "header" > |
14 |
<span class = "ntm" ><a style= "color: white;text-decoration: none;" href= "#" >Music</a></span> |
15 |
<div class = "search" > |
16 |
<input type= "text" placeholder= "请输入歌手名字" class = "text" v-model= "city" @keyup.enter= "getjoke" > |
17 |
<input type= "button" class = "button" value= "搜索" @click= "getjoke" > |
18 |
</div> |
19 |
<span class = "tm" title= "点击隐藏" ><i>右上角展开</i>×</span> |
20 |
</div> |
21 |
<ul> |
22 |
<li class = "li" :title= "a.name + '-' + a.artists[0].name" v- for = "(a,index) in arr" @click= "fun(a.id,a.name,a.artists[0].name)" >{{a.name}}-{{a.artists[0].name}}</li> |
23 |
</ul> |
24 |
<div class = "section" > |
25 |
<div class = "nar" > |
26 |
<span class = "name" >{{ name }}</span> |
27 |
<img class = "img" :src= "imgUrl" alt= "" > |
28 |
</div> |
29 |
<div class = "lyric" > |
30 |
<span v- for = "lrc in lyric" >{{ lrc.toString().substring(10,) }}</br></span> |
31 |
</div> |
32 |
</div> |
33 |
<audio autoplay controls loop :src= "url" ></audio> |
34 |
</div> |
35 |
<span class = "kai" title= "展开" >√</span> |
36 |
<span class = "github" title= "右键关闭" ><a style= "color: #2ab;text-decoration: none;" href= "http://ganto.xyz/vue/musicVueDemoByGanto.zip" >GitHub源码</a></span> |
37 |
</div> |
38 |
<script src= "https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js" ></script> |
39 |
<script src= "https://unpkg.com/axios/dist/axios.min.js" ></script> |
40 |
<!-- 开发环境版本,包含了有帮助的命令行警告 --> |
41 |
<script src= "https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script> |
42 |
<script src= "js/index.js" ></script> |
43 |
<script> |
44 |
$( function (){ |
45 |
$( ".kai" ).hide(); |
46 |
$( ".tm i" ).hide(); |
47 |
$( ".tm" ).click( function (){ |
48 |
$( "#app" ).slideUp(100); |
49 |
$( ".kai" ).fadeIn(); |
50 |
}); |
51 |
$( ".tm" ).hover( function (){ |
52 |
$( ".tm i" ).stop().slideDown(); |
53 |
}, function (){ |
54 |
$( ".tm i" ).stop().slideUp(); |
55 |
}) |
56 |
$( ".kai" ).click( function (){ |
57 |
$( "#app" ).slideDown(100); |
58 |
$( ".kai" ).fadeOut(); |
59 |
}); |
60 |
var app = $( "#app" ), |
61 |
header = $( ".header" ); |
62 |
var disX, |
63 |
disY; |
64 |
header.mousedown( function (e){ |
65 |
disX = e.pageX - parseInt(app.offset().left); |
66 |
disY = e.pageY - parseInt(app.offset().top); |
67 |
document.onmousemove = function (e){ |
68 |
var event = e || window.event; |
69 |
app.css({ "left" :e.pageX - disX + "px" , "top" :e.pageY - disY + "px" }); |
70 |
} |
71 |
document.onmouseup = function (){ |
72 |
document.onmousemove = null; |
73 |
} |
74 |
|
75 |
}) |
76 |
$( ".github" ).mousedown( function (e){ |
77 |
if (e.button == 2){ |
78 |
$(this).fadeOut(); |
79 |
} |
80 |
}) |
81 |
}) |
82 |
</script> |
83 |
</body> |
84 |
</html> |