2019-01-12音乐App项目实践

在进行页面切换时,页面会重新加载recommend.vue中的created,mounted等造成对资源的浪费,此时完全没有必要,我们只需要吧缓存加载到dom中即可
App.vue




此时切换回来之后就会是上次轮播到的那张图,同时可以解决轮播图抖动的问题。
同时在slider.vue中可添加

destoryed(){
clearTimeout(this.timer)
}
//当一个页面加载完成后及时清除资源,是一个好的习惯要养成,是一个内存的释放

歌单数据接口

当我们拿到QQ音乐的接口直接在jsonp中进行处理时,不会获得预想的数据,会报错500,5XX是服务器端的错误,主要引起原因是:

image.png

HOST:是域名的来源
Referer:表示请求的来源

  • 解决方法--代理

在dev-server.js中手动添加代理,需要用到axios安装axios后,就会欺骗浏览器我们发出的是一个ajax请求这也是代理的意思

var axios = require('axios')
var apiRoutes = express.Router()

apiRoutes.get('/getDiscList', function (req, res) {
  var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
  axios.get(url, {
    headers: {
      referer: 'https://c.y.qq.com/',
      host: 'c.y.qq.com'
    },
    params: req.query
  }).then((response) => {
    res.json(response.data)//把从浏览器获取的数据,传递给前端进行展示
  }).catch((e) => {
    console.log(e)
  })
})
app.use('/api', apiRoutes)

此时我们的请求不再是jsonp的了

 return jsonp(url, data, options)//改为
export function getDiscList() {
  const url = '/api/getDiscList'

  const data = Object.assign({}, commonParams, {
    platform: 'yqq',
    hostUin: 0,
    sin: 0,
    ein: 29,
    sortId: 5,
    needNewCode: 0,
    categoryId: 10000000,
    rnd: Math.random(),
    format: 'json'//把jsonp格式转换为json格式
  })

  return axios.get(url, {//对数据的请求
    params: data//传递的参数为params而非param
  }).then((res) => {
    return Promise.resolve(res.data)
  })
}

歌单接口数据渲染到DOM中

  

热门歌单推荐

//v-html会对内容进行转义
image.png

实现以上歌单列表时可采用flex布局实现,同时采用align-itms:center实现垂直居中的效果

歌单实现滚动效果

创建base组件下的scroll.vue

 
//插槽
export default {
//以下属性可在better-scroll的官网上查看readme
    props: {
      probeType: {//监听一些类型,是大幅度拖动还是点击
        type: Number,
        default: 1
      },
      click: {//是否点击
        type: Boolean,
        default: true
      },
      data: {//获取的数据
        type: Array,
        default: null
      },
}
//初始化滚动
 _initScroll() {
        if (!this.$refs.wrapper) {//当他不存在时
          return
        }
        this.scroll = new BScroll(this.$refs.wrapper, {
          probeType: this.probeType,
          click: this.click
        })
 

//在scroll中定义 :data="discList",并且在Scroll.js中
  watch: {
      data() {
        setTimeout(() => {
          this.refresh()//重新加载数据
        }, this.refreshDelay)
      }
    }

此时会出现一个情况当顶部的滚动图片出现加载延迟的时候,歌单列表会先一步加载出来,此时再滑动时候,会出现无法滑动到底额情况,出现这种情况的原因是因为,当滚动图片区没有数据时,热门歌单获取的高度就变高了,多出了滚动区图片的高度,所以进行设置,

  loadImage() {
        if (!this.checkloaded) {
          this.checkloaded = true
          this.$refs.scroll.refresh()
        }
      },
//此处加载出图片高度

vue-lazyload图片懒加载

  • 为什么应用图片懒加载?

在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽。这也就是们通常所说的首屏加载,技术上现实其中要用的技术就是图片懒加载--到可视区域再加载
详情请到https://www.cnblogs.com/liliangel/p/6122836.html

//main.js中引入lazyload
Vue.use(VueLazyload, {
  loading: require('common/image/default.png')
})
//默认懒加载的图片,webpack会解析require
  

loading基础组件的开发与应用

当数据未加载时显示一个转圈的图标,可以利用element-ui 实现

你可能感兴趣的:(2019-01-12音乐App项目实践)