资讯专栏INFORMATION COLUMN

爱奇艺小程序陪你嗨一夏

edagarli / 705人阅读

摘要:只要滑动了就会触发,并且有一个代表当时滑动到第几个。可能有一点笨笨的。

前言

在炎热的夏天里最美滋滋的事情是什么呢,我觉得当然是宅在家里,吹着空调,吃着零食看电视剧电影里的帅气小哥哥、漂亮小姐姐了!在闲暇时光我会经常用爱奇艺小程序看视频,加上现在已经学习了一段时间小程序了,“啪”,动手模仿一个爱奇艺视频小程序的念头就产生了。虽然现在还是个小白,但是希望在这趟“爱奇艺小程序之旅”上为各位乘客朋友好好开车(划掉,好好介绍我的问题与经验hhh

前期准备

微信开发者工具

小程序开发文档

easy-mock:是一个前端接口模拟神器!此处放的是我的数据接口

项目图片资源:如果想要get一下源码和图片,可以借鉴一下这篇文章哦 两步快速获取微信小程序源码

滴滴 开始发车啦

项目功能

首页界面

任意点击视频缩略图即可跳转到相关页面

热点tab的下拉,上滑加载的基础功能

搜索匹配电影名

这是总的效果

详细介绍 1.首页的轮播图

这里使用的是小程序的滑块视图容器swiper组件,用来做轮播图那叫一个简单方便

使用过爱奇艺小程序的朋友会发现首页简单介绍视频信息的轮播图是布局在页面中间并且每一张图片都不相连的,滑动时很是简洁大方。一开始我是简单的使用,将swiper设置了宽高并使之居中,就产生了下面的结果:只有中间的内容在滑动,并不是想要的效果

那看来即使swiper组件看起来简单也要好好研究一番哪,看了文档之后我发现swiper组件其实是swiper-item在滑动,并且它仅可放置在swiper组件中,宽高自动设置为100%。既然这样,那就去设置swiper-item的宽度好了

swiper{
    width:100%;
}
swiper-item{
    width:80%;
}

结果就成了这个样子:

emmm好像不太行,似乎每一个swiper-item总是那么分不开啊,那就去设置里面的内容的样式吧

.info-box{
    width: 100%;
    margin: 0 60rpx;
}

总算这样才做到了想要的效果。撒花~

2.宣传图跟着轮播图改变

在这里是使用了swiperbindchange方法。只要滑动了就会触发,并且有一个current代表当时滑动到第几个。这样想来,swiper好像一个数组,里面包含着很多的swiper-item

所以我们可以在js部分通过获取到这个current值,在对应的图片资源数组中遍历并取出地址,换成宣传图的地址即可

//index.js
        moviepicChange(e) {
        const imgsUrlList = this.data.imgsUrlList; //图片资源
        let bigImg = this.data.bigImg;
        let video_id = this.data.video_id;

        for (let i = 0; i < imgsUrlList.length; i++) {
            if (i == e.detail.current) { //如果current值与图片数组索引值匹配到了,则
                bigImg = imgsUrlList[i].thumbnail; //换掉宣传图片地址
                video_id = imgsUrlList[i].video_id;
            }
        }
        this.setData({
            bigImg: bigImg,
            video_id
        })
    }
3.任意点击视频缩略图即可跳转到相关页面

效果是这样子滴

在这个功能里头,数据处理是我碰到的一大难题了,因为没有后端,我就想试图模拟一下点击一个图片就发送视频id,并由后端返回响应数据的操作,大致思路就是就是通过了一个“中间站”去处理。emmm 可能有一点笨笨的= =。

首先准备好来自Easy-Mock的数据接口

然后在视频缩略图上绑定一下事件,用data-传递想要用于查询的参数


视频详情页面获取到传过来的id之后就可以发起请求,因为wx.request是个异步操作,需要一点时间,此处我对wx.request进行了封装,返回一个promise的办法就可以把异步操作变成了同步的啦ヾ(◍°∇°◍)ノ゙

//video-detail.js
requestVideo: function(num = 0) {
util.request({ //封装的util.request方法
        url: `https://www.easy-mock.com/mock/5b0c37bed0e51c310ce24ab0/iqiyi/media#!method=get`,  //请求地址
        data: { // 请求参数
            id: this.data.video_id,
            tag: "dramas",
            langs: "en"
        }
    })
    .then(res => { //res是返回的数据
        //对数据进行处理,之后便可通过数据绑定在页面显示响应内容
    })
}

创建一个util工具文件夹,用于提供工具方法。这里就是我模拟后端传回响应数据的地方,先在util.js内获取所有的数据,再根据视频详情页面发送过来的参数对已经获得的数据进行处理,通过返回promise.then的操作在视频详情页面获得由util.js处理之后的数据。

//util.js    
let util = {
request(opt) {
    let options = Object.assign({},opt); //花括号是目标对象,后面的opt是源对象。进行对象合并:将源对象里面的属性添加到目标对象中去,若两者的属性名有冲突,后面的将会覆盖前面的
    let { url, data} = options; //结构成这两个变量

    return new Promise((resolve, reject) => { //向请求发起页面返回一个promise
        wx.request({ //发送请求
            url,
            data,
            success(res) { //请求到数据之后对数据进行处理
                let returnRes = [];
                if (data.hasOwnProperty("tag")) { 
                    let arr = res.data[data.tag];

                    if (data.hasOwnProperty("id")) { //如果请求参数中有tag,id则进行以下匹配
                        console.log(arr)
                        for (let i in arr) {
                            if (arr[i].video_id === data.id) { 
                                returnRes = arr[i]; //得到跟点击的缩略图相对应的视频资源
                            }
                        }
                        resolve(returnRes)
                        return;
                    }
                    returnRes = arr;
                }
                resolve(returnRes)
            },
            fail(err) {
                reject(err)
            }
        })
    })
}
}

4.关键字搜索

首先是在搜索页面获取到关键字,之后作为请求参数使用上述封装好util.request进行请求与数据处理

在util.js内获取到所有数据之后,在众多数据中通过RegExpObject.test(string)实现关键字的遍历匹配

//util.js
if (data.hasOwnProperty("key")) { //如果请求参数是key
const media = res.data;
for (let i in media) { //遍历匹配电影名
    for (let j in media[i]) {
        var re = new RegExp(data.key);
        if (re.test(media[i][j].title)) {
            returnRes.push(media[i][j]); //得到匹配好的电影
        }
    }
}
resolve(returnRes)
return;
}
resolve(returnRes)

搜索页面使用util.request得到数据之后,搜索结果列表一项一项就可以显示出来。重点是(敲黑板),一般来说点击哪一项,在搜索结果页面那一项就会排在最上面,那我就想要不然再建一个由点击的的那一项作为第一项的查询结果数组,将它存在本地然后在下一个页面取出并显示!

//search.js
clickResult: function(e) {
let index = e.currentTarget.dataset.num; //点击了第几项
let searchVal = this.data.searchVal; //关键词
let StorageResult = []; // 用于存在本地的数组

let temp = [];
const result = this.data.result;

for (let i = 0; i < result.length; i++) {
    if (i == index) {
        temp = result.splice(i, 1); //取出点击的那一项
    }
}
StorageResult = temp;
for (let i in result) {
    StorageResult = [...StorageResult, result[i]] //将点击的那一项作为数组首位,其他搜索结果再依次放入
}
wx.setStorage({ //在本地缓存搜索结果
    key: "searchResult",
    data: StorageResult,
    success: function(res) {
        wx.navigateTo({
            url: `search-result/search-result?key=${searchVal}` //跳转到下一个页面
        })
    }
})
}

另外,搜索结果会顺带把集数罗列出来,那就需要实现点哪集就在视频详情页定位到哪集的功能

先在wxml里通过data-把id、集数、标题传到下一个页面,在onload里头获取集数

//video-detail.js
onLoad: function(option) {
this.setData({
    video_id: option.id,
    mediaList: null,
})
wx.setNavigationBarTitle({ //设置导航条名称
    title: option.title
})
if (option.hasOwnProperty("num")) { //调用请求资源方法传入集数
    this.requestVideo(option.num);
} else {
    this.requestVideo();
}
}

请求所有视频资源之后并遍历,把当前播放地址设为选中的那集

requestVideo: function(num = 0) { //没有选择集数,则集数默认是0
util.request({
       ...(略)
    })
    .then(res => {
        this.setData({
                mediaList: res,
                isLoading: false,
                playerUrl: res.drama_num[num].video_url //修改播放地址
            })
        this.pickNum(num); //改变集数选择状态
    })
}

用于改变集数选择状态

pickNum: function(num) {
for (let i of mediaList.drama_num) {
    i.selected = parseInt(i.drama_id) === parseInt(num) + 1 //如果选择的集数与视频资源的id一样就改变该集的选中状态
    if (i.selected) {
        playerUrl = i.video_url
    }
}
this.setData({
        mediaList,
        playerUrl
    })
}

结束语

学习的时间比较短,做的项目还有超多不完善的,也很多没有学习到的!但是要我认为要勇于分享 ,才能更好进步(๑´ㅂ`๑),希望能帮助一些人,也希望有人能多多指点我。

如果说万事开头难,现在我迈出了第一步,写了第一个小程序,第一篇分享文章,就希望自己对技术能一直充满热情,多学习多钻研(握拳!

最后厚脸皮的说喜欢这篇文章的可以点个赞吗!疯狂比心!还有这里是 我的源码地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95490.html

相关文章

  • 从 Spark Streaming 到 Apache Flink : 实时数据流在奇艺的演进

    摘要:在移动端,爱奇艺月度总有效时长亿小时,稳居中国榜第三名。爱奇艺的峰值事件数达到万秒,在正确性容错性能延迟吞吐量扩展性等方面均遇到不小的挑战。从到爱奇艺主要使用的是和来进行流式计算。作者:陈越晨 整理:刘河 本文将为大家介绍Apache Flink在爱奇艺的生产与实践过程。你可以借此了解到爱奇艺引入Apache Flink的背景与挑战,以及平台构建化流程。主要内容如下: 爱奇艺在实时计算方...

    econi 评论0 收藏0
  • 周末“干活”之 Mesos Meetup

    摘要:爱奇艺历程采用的软件栈服务现状集群建设自动化部署经验没有采用嵌入式管理服务降低风险,对红帽有一点担忧。再次感谢和数人科技共同组织的,非常期待下一次的周末相聚。 周末两天都是大雾霾天,作为运营也不能在家宅,告别了技术就得腿儿勤点儿。 非常感谢 Linker 的 Sam Chen 和 数人科技 的 CTO 共同组织的Mesos Meetup,OneAPM 最帅的 Docker 工程狮~陈亮...

    warmcheng 评论0 收藏0
  • 迅雷星域云发布云计算新产品 与奇艺达成战略合作

    摘要:据了解,迅雷于月日晚间对外发布财报。此次迅雷再发星域云新产品,实力自然不容小觑,再加之与刚成功上市的爱奇艺达成战略合作,未来发展值得期待。5月16日,迅雷正式对外发布星域云和迅雷链开放平台。星域云将面向所有企业开放三大云计算产品-边缘计算、函数计算和CDN共享版。其中边缘计算基于Docker技术,向企业开放150+节点资源,CDN共享版带宽成本只有传统CDN 的30%.网心科技现已与爱奇艺共...

    Markxu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<