博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
世界杯来了!小程序赛事操作来一波~
阅读量:7124 次
发布时间:2019-06-28

本文共 4092 字,大约阅读时间需要 13 分钟。

前言

NBA总决赛结束还没一周,马上世界杯就如期而至。大家在熬夜看球,而我关在小黑屋默默码字(可怜脸)。在体验到小程序的方便快捷省内存之后,前段时间的“骑勇大战”果断用了小程序观看。由于体验不错,又正在学习小程序知识,马上就想动手实践学习一下“腾讯体育”小程序的制作。到目前为止,只想说一句“选择是好的,过程是一言难尽的”,虽然还没全部完成,但也遇到不少问题,希望此分享可以给你带来帮助()。

效果图

(干巴巴的开讲,还不如先来波动图)

问题及解决方案

1、scroll-view组件

让我们先来看看

  • scroll-x

在此项目中,首页——世界杯的头部是一个横向滑动的scroll-view组件,在设置了scroll-x属性后,并未达到预期效果,scroll-view中的每个部分还是自成一行。在一番简单搜索后得出,设置white-space: nowrap;样式就可使其在同一行。

  • scroll-y

NBA赛事详情页中有5个sroll-view,虽然内容有点少,但还是看得出有scroll的效果的。

同样的,在制作竖向滚动效果时,需要设置sroll-y属性,在官方的文档中也特别说明了

使用竖向滚动时,需要给scroll-view一个固定高度,通过 WXSS 设置 height。

那么问题来了,在scroll-view并非占满全屏的情况下,如何确定其高度呢?

首先想到,把包含选项卡和scroll-view的大盒子固定宽度后,在遵循文档流的情况下,将 scroll-view 高度设置为 100%不就好了吗?但是,在如此一番设置之后,scroll-view的高度变成了大盒子的高度???(黑人问号脸),最重要的是scroll-view中的内容不能完全显示,这就头疼了。

随后马上想到可以使用弹性布局,固定其选项卡的高度,下方的scroll-view设置flex: 1,这难道还解决不了吗?是的,bug永相随。下图可以看到,选项卡的高度明显变小,要是scroll-view的内容再多一点,选项卡就被挤到窒息了。

最后无奈只好将scroll-view的高度逐渐调整到屏幕底部的高度,简直不要太粗暴,缺点是在不同屏幕尺寸设备上查看,效果不一。如果有大佬可提供较好解决方案,恳请指教。

2、swiper组件

开发文档是好朋友,让我们再来。

swiper组件在小程序中非常常见,它可在有限的区域展示更多内容,还能增加页面的视觉动态效果,总之就是好。(但,好东西也是有槽点的啦)

1) 从上面动图可看出,NBA赛事详情页中也使用到了swiper组件,并且与头部的导航进行了绑定,滑动swiper可改变导航栏的状态,点击导航栏选项可切换swiper-item。这个实现较为简单,步骤如下:

  • data中添加一个表示下标的变量curIndex
  • 将此变量绑定到导航栏各个选项,同时使用一个三目运算符进行wx:if条件渲染,若curIndex等于当前选项的下标,则在其底部添加一个伪元素表示选中;
  • curIndex绑定到swipercurrent属性中,通过选项卡的bindtap事件和swiperbindchange事件实时切换swiper-item

话不多说,贴上代码:

//nbaMatches.wxml
{
{item.nbaSort}}
...
复制代码

//nbaMatches.jsbindswiper(e) {    this.setData({      curIndex: e.detail.current    })  },switchSort(e) {    console.log(e.currentTarget.dataset.index);    this.setData({      curIndex: e.currentTarget.dataset.index?e.currentTarget.dataset.index: 0    })}复制代码

2)此项目的“热门”页也使用了一个swiper组件,相比普通swiper的使用,这个更为复杂。此处的swiper不再是与有限个的选项进行交互,而是与无限个的日期进行交互。难道一年365天就要365个swiper-item? 吓得老夫虎躯一震。

经过一场“猪脑子”风暴后,还是没有想出完美的解决方案,只好设置有限个swiper-item来初步实现所需效果。

还是贴代码吧!

//swiper的bindchange事件changeMatch(e) {    const current = e.detail.current;   //获取当前位置    const befInd = this.data.swiperCurIndex;  //获取滑动前的位置    const index = current - befInd;    if (index <= -1) {   //判断左滑右滑      this.preDay();   //日期切换至前一天    } else if (index >= 1) {      this.nextDay();   //日期切换至后一天    } else {      return    }  }复制代码

// nextDay() 方法类似preDay() {    let day = this.data.day;    let month = this.data.month;    let week= this.data.week;    let i = this.data.i;    if (i<=0) {  //周一至周日的循环切换      i = 6;    }else {      i--;    }    if(day<=1) {  //日期本月第一天时,将日期切换至上月最后一天      month--;      day = this.data.daysCountArr[month-1];    }else {      day--;  //否则切换至前一天    }    this.setData({      swiperCurIndex: this.data.swiperCurIndex-1,      month,      day,      i,      week: this.data.weekArr[i],      curDate: month+'月'+day+'日'+' '+this.data.weekArr[i]    })  }复制代码

如果大佬们有解决方案欢迎交流讨论。详细代码查看可点击。

3、选项卡

天啦噜!你连选项卡都要说?(笑哭)听我解释。

通常我们使用的选项卡中的选项都是 2 到 4 个,如果不嫌麻烦,我们只要将选项卡和其对应的内容逐个在.wxml中写出来就好了。但是,一旦选项变多,若逐个写出,那.wxml中的代码将跟“懒婆娘的裹脚布”似的。此时,使用wx:for来循环输出选项就非常有必要了。另外,如果每个选项中的内容都是类似的就更好了,可通过选项卡的点击事件获得当前选项的id,根据id使用wx:if条件渲染来决定当前选项卡显示的数据。在这又要cue一下我们的NBA赛事详情页,此页面中的球员榜这个swiper-item就包含了一个有 5 个选项的选项卡。

详细代码查看可点击。

4、自定义日历

为了更好的体验,体育赛事总要加入日历,方便用户查看赛事安排。若使用picker组件,用户体验可能差强人意,那么如何自定义一个日历呢?在参照了各路大神的方法后得出以下分析:

  • 可左右切换月份并显示当月日历。腾讯体育官方小程序的日历可左右滑动切换,与“热门”页类似。由于还没有解决方案,在这里没有使用swiper组件。日历主体中的每月日期是一个二维数组,每月的周数则为数组的length,因此wxml中的日期输出需要使用两重wx:for。部分代码如下:
{
{item.date}}
{
{item.gameNum}}
场比赛
复制代码
  • 默认高亮显示当天日期,点击具体日期高亮显示。这个实现起来较为简单,只需得到通过点击事件获取当前点击日期,在.wxml中使用三目运算符判断获取日期与数据中的日期是否相同,从而达到高亮显示的效果。
  • 返回今天。点击“返回今天”可回退至“热门”页并显示当天的赛事。使用小程序自带 API ——wx.navigateBack(OBJECT)即可返回上一页面,以下为文档截图:
    值得注意的是:

wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面

结语

由于是第一次写项目,相关知识储备也还不够,从项目开始到现在,遇到的问题可不止这些,但解决问题的过程是辛苦也是富有乐趣的。目前这个项目也还有很多部分没有实现,但会持续更新,如果感兴趣欢迎交流讨论。之后将全面学习mpvue和wepy小程序框架,若使用框架写这个项目相信会简单一些,有机会可以写一个mpvue版。

我的项目在哦。

转载于:https://juejin.im/post/5b22f71fe51d4558ab7b16d4

你可能感兴趣的文章
java 类初始化和对象初始化
查看>>
ZooKeeper设置ACL权限控制
查看>>
POJ 2392 Space Elevator
查看>>
这样阻止事件冒泡
查看>>
1.把二元查找树转变成排序的双向链表
查看>>
也谈运维架构
查看>>
Web服务基础三之Apache虚拟主机、虚拟目录配置
查看>>
自动化运维工具ansible源码安装方法
查看>>
调整SMTP会话连接时间解决邮件无法接收问题
查看>>
操作系统目标作用及发展过程
查看>>
详解IPSec ***
查看>>
IT圈的那些“蔡康永”们
查看>>
mysql高可用方案之MHA
查看>>
bs+flask+redis实现社工库网站
查看>>
Forrester: 2012年北美MSS市场分析报告
查看>>
深入大数据安全分析(3):大数据安全分析重塑网络安全
查看>>
演示:GLBP跟踪功能、权值、与不同的负载均衡方式
查看>>
TROUBLE SHOOTING: FRM-30425
查看>>
《Two Dozen Short Lessons in Haskell》(二十二)递归
查看>>
前端性能优化:DocumentFragments或innerHTML取代复杂的元素注入
查看>>