摘要:只要滑動了就會觸發,并且有一個代表當時滑動到第幾個。可能有一點笨笨的。
前言
在炎熱的夏天里最美滋滋的事情是什么呢,我覺得當然是宅在家里,吹著空調,吃著零食看電視劇電影里的帥氣小哥哥、漂亮小姐姐了!在閑暇時光我會經常用愛奇藝小程序看視頻,加上現在已經學習了一段時間小程序了,“啪”,動手模仿一個愛奇藝視頻小程序的念頭就產生了。雖然現在還是個小白,但是希望在這趟“愛奇藝小程序之旅”上為各位乘客朋友好好開車(劃掉,好好介紹我的問題與經驗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.宣傳圖跟著輪播圖改變在這里是使用了swiper的bindchange方法。只要滑動了就會觸發,并且有一個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 }) }結束語
學習的時間比較短,做的項目還有超多不完善的,也很多沒有學習到的!但是要我認為要勇于分享 ,才能更好進步(?′?`?),希望能幫助一些人,也希望有人能多多指點我。
如果說萬事開頭難,現在我邁出了第一步,寫了第一個小程序,第一篇分享文章,就希望自己對技術能一直充滿熱情,多學習多鉆研(握拳!
最后厚臉皮的說喜歡這篇文章的可以點個贊嗎!瘋狂比心!還有這里是 我的源碼地址
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95490.html
摘要:在移動端,愛奇藝月度總有效時長億小時,穩居中國榜第三名。愛奇藝的峰值事件數達到萬秒,在正確性容錯性能延遲吞吐量擴展性等方面均遇到不小的挑戰。從到愛奇藝主要使用的是和來進行流式計算。作者:陳越晨 整理:劉河 本文將為大家介紹Apache Flink在愛奇藝的生產與實踐過程。你可以借此了解到愛奇藝引入Apache Flink的背景與挑戰,以及平臺構建化流程。主要內容如下: 愛奇藝在實時計算方...
摘要:愛奇藝歷程采用的軟件棧服務現狀集群建設自動化部署經驗沒有采用嵌入式管理服務降低風險,對紅帽有一點擔憂。再次感謝和數人科技共同組織的,非常期待下一次的周末相聚。 周末兩天都是大霧霾天,作為運營也不能在家宅,告別了技術就得腿兒勤點兒。 非常感謝 Linker 的 Sam Chen 和 數人科技 的 CTO 共同組織的Mesos Meetup,OneAPM 最帥的 Docker 工程獅~陳亮...
摘要:據了解,迅雷于月日晚間對外發布財報。此次迅雷再發星域云新產品,實力自然不容小覷,再加之與剛成功上市的愛奇藝達成戰略合作,未來發展值得期待。5月16日,迅雷正式對外發布星域云和迅雷鏈開放平臺。星域云將面向所有企業開放三大云計算產品-邊緣計算、函數計算和CDN共享版。其中邊緣計算基于Docker技術,向企業開放150+節點資源,CDN共享版帶寬成本只有傳統CDN 的30%.網心科技現已與愛奇藝共...
閱讀 3054·2021-11-22 15:29
閱讀 1731·2021-10-12 10:11
閱讀 1758·2021-09-04 16:45
閱讀 2240·2021-08-25 09:39
閱讀 2793·2021-08-18 10:20
閱讀 2516·2021-08-11 11:17
閱讀 450·2019-08-30 12:49
閱讀 3313·2019-08-30 12:49