摘要:只要滑動(dòng)了就會(huì)觸發(fā),并且有一個(gè)代表當(dāng)時(shí)滑動(dòng)到第幾個(gè)??赡苡幸稽c(diǎn)笨笨的。
前言
在炎熱的夏天里最美滋滋的事情是什么呢,我覺(jué)得當(dāng)然是宅在家里,吹著空調(diào),吃著零食看電視劇電影里的帥氣小哥哥、漂亮小姐姐了!在閑暇時(shí)光我會(huì)經(jīng)常用愛(ài)奇藝小程序看視頻,加上現(xiàn)在已經(jīng)學(xué)習(xí)了一段時(shí)間小程序了,“啪”,動(dòng)手模仿一個(gè)愛(ài)奇藝視頻小程序的念頭就產(chǎn)生了。雖然現(xiàn)在還是個(gè)小白,但是希望在這趟“愛(ài)奇藝小程序之旅”上為各位乘客朋友好好開(kāi)車(劃掉,好好介紹我的問(wèn)題與經(jīng)驗(yàn)hhh
前期準(zhǔn)備微信開(kāi)發(fā)者工具
小程序開(kāi)發(fā)文檔
easy-mock:是一個(gè)前端接口模擬神器!此處放的是我的數(shù)據(jù)接口
項(xiàng)目圖片資源:如果想要get一下源碼和圖片,可以借鑒一下這篇文章哦 兩步快速獲取微信小程序源碼
滴滴 開(kāi)始發(fā)車?yán)?/p> 項(xiàng)目功能
首頁(yè)界面
任意點(diǎn)擊視頻縮略圖即可跳轉(zhuǎn)到相關(guān)頁(yè)面
熱點(diǎn)tab的下拉,上滑加載的基礎(chǔ)功能
搜索匹配電影名
這是總的效果
詳細(xì)介紹 1.首頁(yè)的輪播圖這里使用的是小程序的滑塊視圖容器swiper組件,用來(lái)做輪播圖那叫一個(gè)簡(jiǎn)單方便
使用過(guò)愛(ài)奇藝小程序的朋友會(huì)發(fā)現(xiàn)首頁(yè)簡(jiǎn)單介紹視頻信息的輪播圖是布局在頁(yè)面中間并且每一張圖片都不相連的,滑動(dòng)時(shí)很是簡(jiǎn)潔大方。一開(kāi)始我是簡(jiǎn)單的使用,將swiper設(shè)置了寬高并使之居中,就產(chǎn)生了下面的結(jié)果:只有中間的內(nèi)容在滑動(dòng),并不是想要的效果
那看來(lái)即使swiper組件看起來(lái)簡(jiǎn)單也要好好研究一番哪,看了文檔之后我發(fā)現(xiàn)swiper組件其實(shí)是swiper-item在滑動(dòng),并且它僅可放置在swiper組件中,寬高自動(dòng)設(shè)置為100%。既然這樣,那就去設(shè)置swiper-item的寬度好了
swiper{ width:100%; } swiper-item{ width:80%; }
結(jié)果就成了這個(gè)樣子:
emmm好像不太行,似乎每一個(gè)swiper-item總是那么分不開(kāi)啊,那就去設(shè)置里面的內(nèi)容的樣式吧
.info-box{ width: 100%; margin: 0 60rpx; }
總算這樣才做到了想要的效果。撒花~
2.宣傳圖跟著輪播圖改變在這里是使用了swiper的bindchange方法。只要滑動(dòng)了就會(huì)觸發(fā),并且有一個(gè)current代表當(dāng)時(shí)滑動(dòng)到第幾個(gè)。這樣想來(lái),swiper好像一個(gè)數(shù)組,里面包含著很多的swiper-item
所以我們可以在js部分通過(guò)獲取到這個(gè)current值,在對(duì)應(yīng)的圖片資源數(shù)組中遍歷并取出地址,換成宣傳圖的地址即可
//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值與圖片數(shù)組索引值匹配到了,則 bigImg = imgsUrlList[i].thumbnail; //換掉宣傳圖片地址 video_id = imgsUrlList[i].video_id; } } this.setData({ bigImg: bigImg, video_id }) }3.任意點(diǎn)擊視頻縮略圖即可跳轉(zhuǎn)到相關(guān)頁(yè)面
效果是這樣子滴
在這個(gè)功能里頭,數(shù)據(jù)處理是我碰到的一大難題了,因?yàn)闆](méi)有后端,我就想試圖模擬一下點(diǎn)擊一個(gè)圖片就發(fā)送視頻id,并由后端返回響應(yīng)數(shù)據(jù)的操作,大致思路就是就是通過(guò)了一個(gè)“中間站”去處理。emmm 可能有一點(diǎn)笨笨的= =。
首先準(zhǔn)備好來(lái)自Easy-Mock的數(shù)據(jù)接口
然后在視頻縮略圖上綁定一下事件,用data-傳遞想要用于查詢的參數(shù)
視頻詳情頁(yè)面獲取到傳過(guò)來(lái)的id之后就可以發(fā)起請(qǐng)求,因?yàn)閣x.request是個(gè)異步操作,需要一點(diǎn)時(shí)間,此處我對(duì)wx.request進(jìn)行了封裝,返回一個(gè)promise的辦法就可以把異步操作變成了同步的啦ヾ(?°?°?)??
//video-detail.js requestVideo: function(num = 0) { util.request({ //封裝的util.request方法 url: `https://www.easy-mock.com/mock/5b0c37bed0e51c310ce24ab0/iqiyi/media#!method=get`, //請(qǐng)求地址 data: { // 請(qǐng)求參數(shù) id: this.data.video_id, tag: "dramas", langs: "en" } }) .then(res => { //res是返回的數(shù)據(jù) //對(duì)數(shù)據(jù)進(jìn)行處理,之后便可通過(guò)數(shù)據(jù)綁定在頁(yè)面顯示響應(yīng)內(nèi)容 }) }
創(chuàng)建一個(gè)util工具文件夾,用于提供工具方法。這里就是我模擬后端傳回響應(yīng)數(shù)據(jù)的地方,先在util.js內(nèi)獲取所有的數(shù)據(jù),再根據(jù)視頻詳情頁(yè)面發(fā)送過(guò)來(lái)的參數(shù)對(duì)已經(jīng)獲得的數(shù)據(jù)進(jìn)行處理,通過(guò)返回promise,.then的操作在視頻詳情頁(yè)面獲得由util.js處理之后的數(shù)據(jù)。
//util.js let util = { request(opt) { let options = Object.assign({},opt); //花括號(hào)是目標(biāo)對(duì)象,后面的opt是源對(duì)象。進(jìn)行對(duì)象合并:將源對(duì)象里面的屬性添加到目標(biāo)對(duì)象中去,若兩者的屬性名有沖突,后面的將會(huì)覆蓋前面的 let { url, data} = options; //結(jié)構(gòu)成這兩個(gè)變量 return new Promise((resolve, reject) => { //向請(qǐng)求發(fā)起頁(yè)面返回一個(gè)promise wx.request({ //發(fā)送請(qǐng)求 url, data, success(res) { //請(qǐng)求到數(shù)據(jù)之后對(duì)數(shù)據(jù)進(jìn)行處理 let returnRes = []; if (data.hasOwnProperty("tag")) { let arr = res.data[data.tag]; if (data.hasOwnProperty("id")) { //如果請(qǐng)求參數(shù)中有tag,id則進(jìn)行以下匹配 console.log(arr) for (let i in arr) { if (arr[i].video_id === data.id) { returnRes = arr[i]; //得到跟點(diǎn)擊的縮略圖相對(duì)應(yīng)的視頻資源 } } resolve(returnRes) return; } returnRes = arr; } resolve(returnRes) }, fail(err) { reject(err) } }) }) } }4.關(guān)鍵字搜索
首先是在搜索頁(yè)面獲取到關(guān)鍵字,之后作為請(qǐng)求參數(shù)使用上述封裝好util.request進(jìn)行請(qǐng)求與數(shù)據(jù)處理
在util.js內(nèi)獲取到所有數(shù)據(jù)之后,在眾多數(shù)據(jù)中通過(guò)RegExpObject.test(string)實(shí)現(xiàn)關(guān)鍵字的遍歷匹配
//util.js if (data.hasOwnProperty("key")) { //如果請(qǐng)求參數(shù)是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)
搜索頁(yè)面使用util.request得到數(shù)據(jù)之后,搜索結(jié)果列表一項(xiàng)一項(xiàng)就可以顯示出來(lái)。重點(diǎn)是(敲黑板),一般來(lái)說(shuō)點(diǎn)擊哪一項(xiàng),在搜索結(jié)果頁(yè)面那一項(xiàng)就會(huì)排在最上面,那我就想要不然再建一個(gè)由點(diǎn)擊的的那一項(xiàng)作為第一項(xiàng)的查詢結(jié)果數(shù)組,將它存在本地然后在下一個(gè)頁(yè)面取出并顯示!
//search.js clickResult: function(e) { let index = e.currentTarget.dataset.num; //點(diǎn)擊了第幾項(xiàng) let searchVal = this.data.searchVal; //關(guān)鍵詞 let StorageResult = []; // 用于存在本地的數(shù)組 let temp = []; const result = this.data.result; for (let i = 0; i < result.length; i++) { if (i == index) { temp = result.splice(i, 1); //取出點(diǎn)擊的那一項(xiàng) } } StorageResult = temp; for (let i in result) { StorageResult = [...StorageResult, result[i]] //將點(diǎn)擊的那一項(xiàng)作為數(shù)組首位,其他搜索結(jié)果再依次放入 } wx.setStorage({ //在本地緩存搜索結(jié)果 key: "searchResult", data: StorageResult, success: function(res) { wx.navigateTo({ url: `search-result/search-result?key=${searchVal}` //跳轉(zhuǎn)到下一個(gè)頁(yè)面 }) } }) }
另外,搜索結(jié)果會(huì)順帶把集數(shù)羅列出來(lái),那就需要實(shí)現(xiàn)點(diǎn)哪集就在視頻詳情頁(yè)定位到哪集的功能
先在wxml里通過(guò)data-把id、集數(shù)、標(biāo)題傳到下一個(gè)頁(yè)面,在onload里頭獲取集數(shù)
//video-detail.js onLoad: function(option) { this.setData({ video_id: option.id, mediaList: null, }) wx.setNavigationBarTitle({ //設(shè)置導(dǎo)航條名稱 title: option.title }) if (option.hasOwnProperty("num")) { //調(diào)用請(qǐng)求資源方法傳入集數(shù) this.requestVideo(option.num); } else { this.requestVideo(); } }
請(qǐng)求所有視頻資源之后并遍歷,把當(dāng)前播放地址設(shè)為選中的那集
requestVideo: function(num = 0) { //沒(méi)有選擇集數(shù),則集數(shù)默認(rèn)是0 util.request({ ...(略) }) .then(res => { this.setData({ mediaList: res, isLoading: false, playerUrl: res.drama_num[num].video_url //修改播放地址 }) this.pickNum(num); //改變集數(shù)選擇狀態(tài) }) }
用于改變集數(shù)選擇狀態(tài)
pickNum: function(num) { for (let i of mediaList.drama_num) { i.selected = parseInt(i.drama_id) === parseInt(num) + 1 //如果選擇的集數(shù)與視頻資源的id一樣就改變?cè)摷倪x中狀態(tài) if (i.selected) { playerUrl = i.video_url } } this.setData({ mediaList, playerUrl }) }結(jié)束語(yǔ)
學(xué)習(xí)的時(shí)間比較短,做的項(xiàng)目還有超多不完善的,也很多沒(méi)有學(xué)習(xí)到的!但是要我認(rèn)為要勇于分享 ,才能更好進(jìn)步(?′?`?),希望能幫助一些人,也希望有人能多多指點(diǎn)我。
如果說(shuō)萬(wàn)事開(kāi)頭難,現(xiàn)在我邁出了第一步,寫(xiě)了第一個(gè)小程序,第一篇分享文章,就希望自己對(duì)技術(shù)能一直充滿熱情,多學(xué)習(xí)多鉆研(握拳!
最后厚臉皮的說(shuō)喜歡這篇文章的可以點(diǎn)個(gè)贊嗎!瘋狂比心!還有這里是 我的源碼地址
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/95490.html
摘要:在移動(dòng)端,愛(ài)奇藝月度總有效時(shí)長(zhǎng)億小時(shí),穩(wěn)居中國(guó)榜第三名。愛(ài)奇藝的峰值事件數(shù)達(dá)到萬(wàn)秒,在正確性容錯(cuò)性能延遲吞吐量擴(kuò)展性等方面均遇到不小的挑戰(zhàn)。從到愛(ài)奇藝主要使用的是和來(lái)進(jìn)行流式計(jì)算。作者:陳越晨 整理:劉河 本文將為大家介紹Apache Flink在愛(ài)奇藝的生產(chǎn)與實(shí)踐過(guò)程。你可以借此了解到愛(ài)奇藝引入Apache Flink的背景與挑戰(zhàn),以及平臺(tái)構(gòu)建化流程。主要內(nèi)容如下: 愛(ài)奇藝在實(shí)時(shí)計(jì)算方...
摘要:愛(ài)奇藝歷程采用的軟件棧服務(wù)現(xiàn)狀集群建設(shè)自動(dòng)化部署經(jīng)驗(yàn)沒(méi)有采用嵌入式管理服務(wù)降低風(fēng)險(xiǎn),對(duì)紅帽有一點(diǎn)擔(dān)憂。再次感謝和數(shù)人科技共同組織的,非常期待下一次的周末相聚。 周末兩天都是大霧霾天,作為運(yùn)營(yíng)也不能在家宅,告別了技術(shù)就得腿兒勤點(diǎn)兒。 非常感謝 Linker 的 Sam Chen 和 數(shù)人科技 的 CTO 共同組織的Mesos Meetup,OneAPM 最帥的 Docker 工程獅~陳亮...
摘要:據(jù)了解,迅雷于月日晚間對(duì)外發(fā)布財(cái)報(bào)。此次迅雷再發(fā)星域云新產(chǎn)品,實(shí)力自然不容小覷,再加之與剛成功上市的愛(ài)奇藝達(dá)成戰(zhàn)略合作,未來(lái)發(fā)展值得期待。5月16日,迅雷正式對(duì)外發(fā)布星域云和迅雷鏈開(kāi)放平臺(tái)。星域云將面向所有企業(yè)開(kāi)放三大云計(jì)算產(chǎn)品-邊緣計(jì)算、函數(shù)計(jì)算和CDN共享版。其中邊緣計(jì)算基于Docker技術(shù),向企業(yè)開(kāi)放150+節(jié)點(diǎn)資源,CDN共享版帶寬成本只有傳統(tǒng)CDN 的30%.網(wǎng)心科技現(xiàn)已與愛(ài)奇藝共...
閱讀 3168·2021-11-22 15:29
閱讀 1829·2021-10-12 10:11
閱讀 1889·2021-09-04 16:45
閱讀 2440·2021-08-25 09:39
閱讀 2856·2021-08-18 10:20
閱讀 2612·2021-08-11 11:17
閱讀 508·2019-08-30 12:49
閱讀 3387·2019-08-30 12:49