记录一次vue练习的填坑记录

前段时间练习了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>复制代码

五、vue-router的keep-alive

关于这个我在以前文章里已经写过基本的使用,能够点击连接直接查看github

vue keep-alive组件的使用web

六、css模糊图片效果

原图是清晰的图片,咱们须要用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;
}复制代码

七、关于audio音频时长获取

这个内容对于没有处理过音视频的伙伴来讲是比较陌生的了,我也是第一次遇到。使用的场景是,在点击歌曲的时候会出现一个简单的播放器,包括开始/暂停,下一曲以及歌曲播放进度条。前两个功能都比较简单,播放进度条须要获取播放进度及总时长,直接放代码: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

相关文章
相关标签/搜索