前段时间练习了vue,写了个简单的demo,是模仿网易音乐h5页面效果,内容比较简单只实现了基本的功能,使用了vue脚手架、vue-router、vuex以及vant ui库。在此简单记录下遇到的坑以及简单的填坑记录。css
一般咱们写的路由都是静态路由,就是写死路由的名字,可是有时候咱们的路由不能写死,好比涉及到文章详情,获取不一样的文章内容,此时咱们就须要用动态路由,也就是路由的path属性不能写死。举个栗子~html
//页面路由
<route-link :to="'/detail/' + id"></route-link>
//路由配置页面
new Router({
routes: [
path: "/detail/:id",
components: Details
]
})复制代码
普通单页应用中,路由组件是一次性加载的,会对性能有所影响。所以能够经过路由组件懒加载技术实现按需加载功能。这里只简单写下两个基本的方案:vue
1、require.ensure()
const Home = r => {require.ensure([], ()=>{r(require('./home.vue')), 'home'})}
{
path: '/home',
components: Home
}
2、import webpackChunksName
const Home = () => import(/*webpackChunkName: 'Home'*/ './home')
{复制代码
path: '/home',
components: Home
}
同时在webpack里添加
output: {
chunkFilename: '[name].js'
}复制代码
首先就是关于跨域代理的问题,由于用的vue脚手架,能够直接设置proxyTable,网上教程也不少,很少介绍;webpack
其次就是请求添加loading效果。请求数据使用的是axios,能够再请求前和相应后添加拦截器,统一添加loading效果。ios
//请求拦截器
Axios.interceptors.request.use((config)=>{
//请求前须要作的事情
return config
}, (err)=>{
return Promise.reject(err)
})
//响应拦截器
Axios.interceptors.response.use((response)=>{
//请求响应作的事情
return response
}, (err)=>{
return Promise.reject(err)
})复制代码
一般咱们再用vue的时候会涉及到一些数据的处理,好比将较大的数字转换成“xxx万”格式,时间日期的格式化等等,这时候咱们可使用过滤器转化,可是若是不少组件都用到一个过滤器,咱们每一个组件都写一遍过滤器就不太好了,此时能够添加一个全局过滤器,在须要使用的时候直接调用便可。git
//定义一个filters.js文件
const myFilters = {
changeNums: (nums)=>{
//对数值进行处理
}
}
//在index.js里引入过滤器,对其进行遍历,绑定每一个过滤器
import myFilter from './filters.js'
for(let item in myFilter){
Vue.filter(item, myFilter[key])
}
这样在须要使用过滤器的地方直接调用相对应的过滤器就能够了,好比:<i>{{item.song.album.publishTime | timeFilter}}</i>复制代码
关于这个我在以前文章里已经写过基本的使用,能够点击连接直接查看github
原图是清晰的图片,咱们须要用css进行模糊处理,须要用到样式的filter:blur()属性。vue-router
//html
<div class="box">
<div class="box-img">
<img src="a.jpg" />
</div>
<div class="box-bg"></div>
</div>
//css
.box{
width: 100%;
height: 200px;
position: relative;
}
.box-img{
position: absolute;
top: 0;
width: 100%;
height: 100%;
z-index: -1;
-webkit-filter: blur(12px);
filter: blur(12px);
}
.box-bg{
position: absolute;
top: 0;
width: 100%;
height: 100%;
z-index: -1;
backgroung: #333;
opacity: .5;
}复制代码
这个内容对于没有处理过音视频的伙伴来讲是比较陌生的了,我也是第一次遇到。使用的场景是,在点击歌曲的时候会出现一个简单的播放器,包括开始/暂停,下一曲以及歌曲播放进度条。前两个功能都比较简单,播放进度条须要获取播放进度及总时长,直接放代码:vuex
//音频播放器
<audio ref="audioMusic" :src="songNowGet" @timeupdate="updateTime" @canplay="durationTime" autoplay></audio>
//播放进度条
<div class="audioLine">
<span ref="line" :style="{width: lineWidth}"></span>
</div>
//获取播放时间
updateTime(){
this.musicCurrentTime = this.$refs.audioMusic.currentTime
}
//获取音频总时长
durationTime(){
this.musicDurationTime = this.$refs.audioMusic.duration
}
//对于音频播放,时间是时刻变化的,咱们须要经过watch进行监控
watch: {
//监听音乐播放时间的变化,更新宽度值并赋值给进度条 'musicCurrentTime': function(newVal){
let winWidth = document.documentElement.clientWidth;
if(newVal){
this.lineWidth = parseInt((newVal * winWidth)/this.musicDurationTime)
this.$refs.line.style.width = this.lineWidth/50 + 'rem'
}
}
}复制代码
其中
timeupdate和canplay都是audio的钩子函数,timeupdate表示播放位置发生改变时触发事件;canplay表示开始播放音频时触发事件。
currentTime和duration是audio属性,currentTime表示当前播放时间;duration表示媒体总时长。
这里我只是简单的用到了几个api,关于音频的相关属性和方法钩子,已经有小伙伴作了总结,详情能够查看大佬的文章,传送门:记一次vue中获取audio媒体总时长duration遇到的问题
以上就是在这个小练习项目中遇到的小坑及填坑记录,记录下来避免再次入坑,同时但愿能给一样采坑的小伙伴一点启发,更快的解决问题。
最后附上练习github传送门:music播放器小练习demo