一个人做的第一个小程序项目总结

这次的项目总共有6个人页面分别是,欢迎页、新闻列表页、详情页、电影首页、列表页、搜索页、详情页,下面按每个页用到哪些小程序api做一个总结

欢迎页

整个页面的组成部分就是 一个头像、名字、加一个按钮跳转页面

welcome.json

修改导航修改颜色

{
    
    
  "navigationBarBackgroundColor": "#b3d4db"
}

welcome.js

这个地方有个难点,就是如果跳转的页面是tabBar 就一定要用wx.switchTab方法,不然点击是没有反应的。


onTap: function(){
    
    
	//vx.navigateTo  这个方法就是带返回功能的
    // wx.navigateTo({
    
    
    //   url: '../posts/posts',
    // })
    // wx.redirectTo  是没有返回功能的 
    // wx.redirectTo({
    
    
    //   url: '../posts/posts',
    // })
    
    wx.switchTab({
    
    
      url: '../posts/posts',
    })
  },

新闻列表页

首先是在全局的 app.json 里面配置是路由、导航的颜色、tabBar的切换菜单,用到的api有catch:tap=“onSwiperTap"事件绑定、wx:for=”{ {postList}}" wx:for-item=“item” 列表循环、data-postId="{ {item.postId}}"事件传参、 模板传数据

{
    
    
  "pages": [
    "pages/welcome/welcome",
    "pages/posts/posts",
    "pages/posts/post-detail/post-detail",
    "pages/movies/movies",
    "pages/movies/more-movie/more-movie",
    "pages/movies/movie-detail/movie-detail"
  ],
  "window": {
    
    
    "navigationBarBackgroundColor": "#405f80"
  },
  "tabBar": {
    
    
    "borderStyle": "white",
    "color": "#333",
    "selectedColor": "#405f80",
    "list": [
      {
    
    
        "pagePath": "pages/posts/posts",
        "text": "阅读",
        "iconPath": "/images/tab/yuedu.png",
        "selectedIconPath": "/images/tab/yuedu_hl.png"
      },
      {
    
    
        "pagePath": "pages/movies/movies",
        "text": "电影",
        "iconPath": "/images/tab/dianying.png",
        "selectedIconPath": "/images/tab/dianying_hl.png"
      }
    ]
  }
}

posts.wxml

轮播窗 和 列表template模板组成的

轮播窗 代码

<swiper catch:tap="onSwiperTap" indicator-dots="true" autoplay="true">
    <swiper-item>
      <image  src="/images/wx.png" data-postId="3"></image>
    </swiper-item>
    <swiper-item>
      <image src="/images/vr.png" data-postId="4"></image>
    </swiper-item>
    <swiper-item>
      <image src="/images/iqiyi.png" data-postId="5"></image>
    </swiper-item>
  </swiper>

列表循环 代码

<import src="post-item/post-item-tem.wxml"/>  //模板引用
<block wx:for="{
    
    {postList}}" wx:for-item="item" wx:for-index="idx" wx:key="idx">
    <view catch:tap="onPostTap" data-postId="{
    
    {item.postId}}"> 
    //如果是 {
    
    {...item}} 等于把对象展开 ,那在模板里面就不用{
    
    {item.avatar}} 直接 {
    
    {avatar}} 这样就能拿到值了
      <template is="postItem" data="{
    
    {item}}" />  
    </view>
  </block>

posts.js

跳转到详情的方法

onPostTap: function (event) {
    
    
    var postId = event.currentTarget.dataset.postid;
    wx.navigateTo({
    
    
      url: 'post-detail/post-detail?id=' + postId,
    })
  },

获取列表数据 在本地创建的数据 在生命周期函数onLoad

var postsData = require('../../data/posts-data.js')
onLoad: function () {
    
    
    this.setData({
    
    
      postList: postsData.postList
    }) //es6简写
  }

post-item 模板

模板里面就是给每个字段添加值

<template name="postItem">
  <view class="post-container">
    <view class="post-author-data">
      	<image class="post-author" src="{
    
    {item.avatar}}"></image>
      	<text class="post-data">{
    
    {
    
    item.date}}</text>
     </view>
    </view>

新闻详情页

这里用到的功能比较多,我还是根据不页面列取出来

post-detail.wxml

用到三元运算

<image class="head-image" src="{
    
    {isPlayingMusic?postData.music.coverImg:postData.headImgSrc}}"></image>

用到了 wx:if wx:else、 catch:tap事件方法

<image catch:tap="onCollectionTap" wx:if="{
    
    {collected}}" src="/images/icon/collection.png"></image>
      <image catch:tap="onCollectionTap" wx:else src="/images/icon/collection-anti.png"></image>

post-detail.json

添加页面标题

{
    
    
  "navigationBarTitleText": "阅读"
}

post-detail.js

首先创建本地数据
var postsData = require(’…/…/…/data/posts-data.js’)
// 这个是在全局的 app.js 申请全局变量
var app = getApp()

App({
    
    
  globalData:{
    
    
    g_isPlayingMusic:false, //音乐是否在播放
    g_currentMusicPostId: null, //哪个音乐正在播放
    doubanBase: "http://t.yushu.im"  //请示地址
  },
})

然后通过 require 导入到 这个js里面来,在生命周期函数onLoad

onLoad: function(options) {
    
    
	//获取详情数据 
	var postId = options.id;
    this.data.currentPostId = postId
    var postData = postsData.postList[postId]
    // this.data.postData = postData;
    this.setData({
    
    
      postData: postData
    })
    //鉴听是否收藏方法
    var postsCollected = wx.getStorageSync('posts_collected')
    if (postsCollected) {
    
    
      var postCollected = postsCollected[postId]
      if (postCollected) {
    
    
        this.setData({
    
    
          collected: postCollected
        })
      }
    } else {
    
    
      var postsCollected = {
    
    }
      postsCollected[postId] = false;
      wx.setStorageSync('posts_collected', postsCollected)
    }
     //鉴听音乐播放方法
    var g_isPlayingMusic = app.globalData.g_isPlayingMusic //音乐是否在播放
    var g_currentMusicPostId = app.globalData.g_currentMusicPostId  //哪个详情页的音乐正在播放 
    if (g_isPlayingMusic && g_currentMusicPostId === postId) {
    
    
      this.setData({
    
    
        isPlayingMusic: true
      })
    }
    this.setAudioMonitor()
}

第一个难点就是音乐播放 封装setAudioMonitor方法 在 onLoad 调用 检查当前音乐的状态

setAudioMonitor: function() {
    
    
    wx.onBackgroundAudioPlay(() => {
    
    
      this.setData({
    
    
        isPlayingMusic: true
      })
      app.globalData.g_isPlayingMusic = true
      app.globalData.g_currentMusicPostId = this.data.currentPostId
    })
    wx.onBackgroundAudioPause(() => {
    
    
        this.setData({
    
    
          isPlayingMusic: false
        })
        app.globalData.g_isPlayingMusic = false
        app.globalData.g_currentMusicPostId = null
      }),
      wx.onBackgroundAudioStop(() => {
    
    
        this.setData({
    
    
          isPlayingMusic: false
        })
        app.globalData.g_isPlayingMusic = false
        app.globalData.g_currentMusicPostId = null
      })
  },

点击音乐按钮方法 用到了二个 api wx.pauseBackgroundAudio() 暂停 、wx.playBackgroundAudio 播放

// 音乐播放 
  onMiusicTap: function(event) {
    
    
    var isPlayingMusic = this.data.isPlayingMusic
    var currentPostId = this.data.currentPostId
    var postData = postsData.postList[currentPostId]
    // 监听音乐暂停事件
    if (isPlayingMusic) {
    
    
      wx.pauseBackgroundAudio()
      this.setData({
    
    
        isPlayingMusic: false
      })
    } else {
    
    
      wx.playBackgroundAudio({
    
    
        dataUrl: postData.music.url,  // 音乐地址 
        title: postData.music.title,  //名称
        coverImgUrl: postData.music.coverImg  //封面图
      })
      this.setData({
    
    
        isPlayingMusic: true
      })
    }
  }

第二个 收藏方法
在 onLoad 里面监听收藏状态 ,用到的api有 wx.getStorageSync 取 、wx.setStorageSync 存

点击收藏按钮事情方法

// 收藏方法  
  onCollectionTap: function(event) {
    
    
    // this.getPostsCollectedAsy()
    this.getPostsCollectedSyc()
  },
  //同步缓存方法
  getPostsCollectedSyc: function() {
    
    
    var postsCollected = wx.getStorageSync('posts_collected')
    var postCollected = postsCollected[this.data.currentPostId]
    postCollected = !postCollected  // 取反
    postsCollected[this.data.currentPostId] = postCollected
    this.showToast(postsCollected, postCollected)
  },
  //收藏弹窗 方法 
  showToast(postsCollected, postCollected) {
    
    
    //更新缓存
    wx.setStorageSync('posts_collected', postsCollected)
    //更新数据
    this.setData({
    
    
      collected: postCollected
    })
    wx.showToast({
    
    
      title: postCollected ? '收藏成功' : '取消成功',
      duration: 1000
    })
  },

不知不觉过去了快2个小时了,只整理了 三个页面,还是电影面页没有整理,用到了知识点还很多,费话不多说,开始整理电影页面,电影用的一个网站公开的 api地址 动态加载数据 电影首页、列表页、详情页

电影首页

一个搜索框 加 三个template使用的同一个模板组成的

猜你喜欢

转载自blog.csdn.net/qq_34312604/article/details/105705409