小程序项目--网络请求代码的重构和封装

183 阅读2分钟

分层架构

1.把网络请求抽取到services文件夹中:
封装成类,取实例对象

2.把向mv的网络请求封装到video.js里:
在调用时即可自定义 offset limit

3.抽取展示视频组件 在js文件里面,properties存放itemData接收页面传来的数据

(wxss背景图片不可以使用本地)

上拉加载更多,下拉刷新功能

跳转视频详情页

  • 监听整个组件
  • 监听组件根元素

内容滚动

调用scroll-view,要有固定高度 page { height: 100vh; }

轮播图

无限循环

页面内边距

直接在page里面设置

封装一个工具(获取轮播图的元素长度高度)

加入节流

export default function querySelect(selector) {
  return new Promise(resolve => {
    const query = wx.createSelectorQuery()
    query.select(selector).boundingClientRect()
    query.exec((res) => {
      resolve(res)
    })
  })
}

音乐首页

  • 复用组件
  • 增加网络请求

小程序中的数据共享

使用

npm install hy-event-store

重构主页推荐歌曲请求

 // this.fetchRecommendSongs()
    //发起action
    recommendStore.onState("recommendSongs",(value)=>{
      this.setData({ recommendSongs:value })
    })
    recommendStore.dispatch("fetchRecommendSongsAction")

推荐歌曲数据共享

import { HYEventStore } from "hy-event-store"
import { getPlayListDetail } from "../services/music"

const recommendStore = new HYEventStore({
  state: {
    recommendSongs: []
  },
  actions: {
    fetchRecommendSongsAction(ctx) {
      getPlayListDetail(3778678).then(res => {
        ctx.recommendSongs = res.playlist.tracks
      })
    }
  }
})

export default recommendStore

热门歌单滚动细节

抽取获取屏幕宽高的方法

App({
  globalData: {
    screenWidth: 375,
    screenHeight: 667
  },
  onLaunch() {
    // 1.获取设备的信息
    wx.getSystemInfo({
      success: (res) => {
        this.globalData.screenWidth = res.screenWidth
        this.globalData.screenHeight = res.screenHeight
      },
    })
  }
})

所有的歌单数据请求和展示

(for循环获取需要循环十次,低效)

// 发送网络请求
async fetchAllMenuList(){
  const tagRes = await getSongMenuTag()
  const tags = tagRes.tags
  //2。根据tags去获取对应的歌单
  const allPromises=[]
  for(const tag of tags){
   const promise=getSongMenuList(tag.name)
   allPromises.push(promise)
  }
  //3.获取到所有的数据之后,调用一次setData
  Promise.all(allPromises).then(res=>{
    this.setData({ songMenus: res })
  })
}

巅峰榜构建

共享巅峰榜数据

存入rankingStore中

import { HYEventStore } from "hy-event-store"
import { getPlaylistDetail } from "../services/music"

export const rankingsMap = {
  newRanking: 3779629,
  originRanking: 2884035,
  upRanking: 19723756
}
const rankingStore = new HYEventStore({
  state: {
    newRanking: {},
    originRanking: {},
    upRanking: {}
  },
  actions: {
    fetchRankingDataAction(ctx) {
      for (const key in rankingsMap) {
        const id = rankingsMap[key]
        getPlaylistDetail(id).then(res => {
          ctx[key] = res.playlist
        })
      }
    }
  }
})

export default rankingStore