摘要:包含文章視頻源代碼原創新書移動前端高效開發實戰已在亞馬遜京東當當開售。最新活動報名地址與天天練口語小程序總榜排名第四教育類排名第一的研發團隊,面對面溝通交流。
§ 頁面邏輯處理
本文配套視頻地址:
https://v.qq.com/x/page/n0554...
修改 index.js 文件,引入我們需要的外部資源開始前請把 ch3-2 分支中的 code/ 目錄導入微信開發工具 ?
"use strict"; import util from "../../utils/index"; import config from "../../utils/config"; let app = getApp(); let isDEV = config.isDev; // 后繼的代碼都會放在此對象中 let handler = { } Page(handler)
我們首先挖出和渲染相關的數據,并添加在 handler 對象的 data 字段中(Model 層)
修改 index.js 中的 handler 對象:
// 此處省略部分代碼 let handler = { data: { page: 1, //當前加載第幾頁的數據 days: 3, pageSize: 4, totalSize: 0, hasMore: true,// 用來判斷下拉加載更多內容操作 articleList: [], // 存放文章列表數據,與視圖相關聯 defaultImg: config.defaultImg }, }
注意: 后續添加的代碼都是放在 handler 對象中,它會傳遞到 Page 函數中用來初始化頁面組件
然后要做的就是獲取列表的數據,初始化數據的工作我們一般放在生命周期的 onLoad() 里:
let handler = { onLoad (options) { this.requestArticle() }, /* * 獲取文章列表數據 */ requestArticle () { util.request({ url: "list", mock: true, data: { tag:"微信熱門", start: this.data.page || 1, days: this.data.days || 3, pageSize: this.data.pageSize, langs: config.appLang || "en" } }) .then(res => { console.log( res ) }); } }數據加載完成之后,我們需要對接口返回的數據進行業務方面的容錯處理
修改 requestArticle 函數:
let handler = { // 此處省略部分代碼 requestArticle () { util.request({ url: "list", mock: true, data: { tag:"微信熱門", start: this.data.page || 1, days: this.data.days || 3, pageSize: this.data.pageSize, langs: config.appLang || "en" } }) .then(res => { // 數據正常返回 if (res && res.status === 0 && res.data && res.data.length) { // 正常數據 do something console.log(res) } /* * 如果加載第一頁就沒有數據,說明數據存在異常情況 * 處理方式:彈出異常提示信息(默認提示信息)并設置下拉加載功能不可用 */ else if (this.data.page === 1 && res.data && res.data.length === 0) { util.alert(); this.setData({ hasMore: false }); } /* * 如果非第一頁沒有數據,那說明沒有數據了,停用下拉加載功能即可 */ else if (this.data.page !== 1 && res.data && res.data.length === 0) { this.setData({ hasMore: false }); } /* * 返回異常錯誤 * 展示后端返回的錯誤信息,并設置下拉加載功能不可用 */ else { util.alert("提示", res); this.setData({ hasMore: false }); return null; } }) } }
上面我們把 wx.request 重新包裝成了 Promise 的形式,其實我們是請求的 mock 數據。但是接口請求到的數據絕大部分情況下都不會直接適用于 UI 展示,所以我們需要做一層數據轉換,把接口數據轉換成視圖數據。
格式化數據先看下后端返回的數據結構
我們需要做兩件事情
遍歷 data 數組,對返回的日期格式化,當天的顯示 今天,如果是今年的文章,顯示月日格式 08-21 ;如果是往年的文章,顯示標準的年月日格式 2015-06-12。
遍歷 articles 數組,判斷此篇文章的 contentId 是否已經在全局變量 visitedArticles 中,如果存在,說明已經訪問過。
修改 app.js,增加全局變量 visitedArticles
globalData: { user: { name: "", avator: "" }, visitedArticles: "" }
修改 index.js 中的 requestArticle 函數:
let handler = { // 此處省略部分代碼 requestArticle () { // 注意:修改此處代碼 if (res && res.status === 0 && res.data && res.data.length) { let articleData = res.data; //格式化原始數據 let formatData = this.formatArticleData(articleData); console.log( formatData ) } } }
增加對列表數據格式化的代碼:
let handler = { // 此處省略部分代碼 /* * 格式化文章列表數據 */ formatArticleData (data) { let formatData = undefined; if (data && data.length) { formatData = data.map((group) => { // 格式化日期 group.formateDate = this.dateConvert(group.date); if (group && group.articles) { let formatArticleItems = group.articles.map((item) => { // 判斷是否已經訪問過 item.hasVisited = this.isVisited(item.contentId); return item; }) || []; group.articles = formatArticleItems; } return group }) } return formatData; }, /* * 將原始日期字符串格式化 "2017-06-12" * return "今日" / 08-21 / 2017-06-12 */ dateConvert (dateStr) { if (!dateStr) { return ""; } let today = new Date(), todayYear = today.getFullYear(), todayMonth = ("0" + (today.getMonth() + 1)).slice(-2), todayDay = ("0" + today.getDate()).slice(-2); let convertStr = ""; let originYear = +dateStr.slice(0,4); let todayFormat = `${todayYear}-${todayMonth}-${todayDay}`; if (dateStr === todayFormat) { convertStr = "今日"; } else if (originYear < todayYear) { let splitStr = dateStr.split("-"); convertStr = `${splitStr[0]}年${splitStr[1]}月${splitStr[2]}日`; } else { convertStr = dateStr.slice(5).replace("-", "月") + "日" } return convertStr; }, /* * 判斷文章是否訪問過 * @param contentId */ isVisited (contentId) { let visitedArticles = app.globalData && app.globalData.visitedArticles || ""; return visitedArticles.indexOf(`${contentId}`) > -1; }, }
正常情況下,這個時候控制臺打印出來的數據,是經過格式化的標準數據了,下一步,我們需要把它添加到 data 中的 articleList 字段里面,這樣視圖才有了渲染的數據
修改 index.js,增加 renderArticle 函數。由于每次請求的都是某一頁的數據,所以在函數中,我們需要把每次請求過來的列表數據都 concat(拼接)到 articleList中:
let handler = { // 此處省略部分代碼 renderArticle (data) { if (data && data.length) { let newList = this.data.articleList.concat(data); this.setData({ articleList: newList }) } } }
在 requestArticle 函數中調用 renderArticle:
let handler = { // 此處省略部分代碼 requestArticle () { // 注意:修改此處代碼 if (res && res.status === 0 && res.data && res.data.length) { let articleData = res.data; //格式化原始數據 let formatData = this.formatArticleData(articleData); this.renderArticle( formatData ) } } }最終結果
最終的 index.js 文件就是這樣的:
"use strict"; import util from "../../utils/index" import config from "../../utils/config" let app = getApp() let isDEV = config.isDev // 后繼的代碼都會放在此對象中 let handler = { data: { page: 1, //當前的頁數 days: 3, pageSize: 4, totalSize: 0, hasMore: true,// 用來判斷下拉加載更多內容操作 articleList: [], // 存放文章列表數據 defaultImg: config.defaultImg }, onLoad(options) { this.requestArticle(); }, /* * 獲取文章列表數據 */ requestArticle() { util.request({ url: "list", mock: true, data: { tag: "微信熱門", start: this.data.page || 1, days: this.data.days || 3, pageSize: this.data.pageSize, langs: config.appLang || "en" } }) .then(res => { // 數據正常返回 if (res && res.status === 0 && res.data && res.data.length) { let articleData = res.data; //格式化原始數據 let formatData = this.formatArticleData(articleData); this.renderArticle(formatData) } /* * 如果加載第一頁就沒有數據,說明數據存在異常情況 * 處理方式:彈出異常提示信息(默認提示信息)并設置下拉加載功能不可用 */ else if (this.data.page === 1 && res.data && res.data.length === 0) { util.alert(); this.setData({ hasMore: false }); } /* * 如果非第一頁沒有數據,那說明沒有數據了,停用下拉加載功能即可 */ else if (this.data.page !== 1 && res.data && res.data.length === 0) { this.setData({ hasMore: false }); } /* * 返回異常錯誤 * 展示后端返回的錯誤信息,并設置下拉加載功能不可用 */ else { util.alert("提示", res); this.setData({ hasMore: false }); return null; } }) }, /* * 格式化文章列表數據 */ formatArticleData(data) { let formatData = undefined; if (data && data.length) { formatData = data.map((group) => { // 格式化日期 group.formateDate = this.dateConvert(group.date); if (group && group.articles) { let formatArticleItems = group.articles.map((item) => { // 判斷是否已經訪問過 item.hasVisited = this.isVisited(item.contentId); return item; }) || []; group.articles = formatArticleItems; } return group }) } return formatData; }, /* * 將原始日期字符串格式化 "2017-06-12" * return "今日" / 08-21 / 2017-06-12 */ dateConvert(dateStr) { if (!dateStr) { return ""; } let today = new Date(), todayYear = today.getFullYear(), todayMonth = ("0" + (today.getMonth() + 1)).slice(-2), todayDay = ("0" + today.getDate()).slice(-2); let convertStr = ""; let originYear = +dateStr.slice(0, 4); let todayFormat = `${todayYear}-${todayMonth}-${todayDay}`; if (dateStr === todayFormat) { convertStr = "今日"; } else if (originYear < todayYear) { let splitStr = dateStr.split("-"); convertStr = `${splitStr[0]}年${splitStr[1]}月${splitStr[2]}日`; } else { convertStr = dateStr.slice(5).replace("-", "月") + "日" } return convertStr; }, /* * 判斷文章是否訪問過 * @param contentId */ isVisited(contentId) { let visitedArticles = app.globalData && app.globalData.visitedArticles || ""; return visitedArticles.indexOf(`${contentId}`) > -1; }, renderArticle(data) { if (data && data.length) { let newList = this.data.articleList.concat(data); this.setData({ articleList: newList }) } } } Page(handler)
下一篇中,我們將會把數據與視圖層結合在一起,動態的展示視圖層
iKcamp官網:http://www.ikcamp.com
訪問官網更快閱讀全部免費分享課程:《iKcamp出品|全網最新|微信小程序|基于最新版1.0開發者工具之初中級培訓教程分享》。
包含:文章、視頻、源代碼
iKcamp最新活動iKcamp原創新書《移動Web前端高效開發實戰》已在亞馬遜、京東、當當開售。
報名地址:http://www.huodongxing.com/ev...
與“天天練口語”小程序總榜排名第四、教育類排名第一的研發團隊,面對面溝通交流。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/51416.html
摘要:因為循環中當前項的下標變量名默認為,當前項的變量名默認為。包含文章視頻源代碼原創新書移動前端高效開發實戰已在亞馬遜京東當當開售。最新活動報名地址與天天練口語小程序總榜排名第四教育類排名第一的研發團隊,面對面溝通交流。 § 視圖與數據關聯 本文配套視頻地址:https://v.qq.com/x/page/z0554... 開始前請把 ch3-3 分支中的 code/ 目錄導入微信開發工...
摘要:因為循環中當前項的下標變量名默認為,當前項的變量名默認為。包含文章視頻源代碼原創新書移動前端高效開發實戰已在亞馬遜京東當當開售。最新活動報名地址與天天練口語小程序總榜排名第四教育類排名第一的研發團隊,面對面溝通交流。 § 視圖與數據關聯 本文配套視頻地址:https://v.qq.com/x/page/z0554... 開始前請把 ch3-3 分支中的 code/ 目錄導入微信開發工...
摘要:因為循環中當前項的下標變量名默認為,當前項的變量名默認為。包含文章視頻源代碼原創新書移動前端高效開發實戰已在亞馬遜京東當當開售。最新活動報名地址與天天練口語小程序總榜排名第四教育類排名第一的研發團隊,面對面溝通交流。 § 視圖與數據關聯 本文配套視頻地址:https://v.qq.com/x/page/z0554... 開始前請把 ch3-3 分支中的 code/ 目錄導入微信開發工...
摘要:微信小程序課程,面向所有具備前端基礎知識的同學閱讀要求讀者需要具備但不限于以下技能更佳一共四部分十五小節,適合七天的訓練營。 ?? 微信小程序課程,面向所有具備前端基礎知識的同學 ?? 閱讀要求 讀者需要具備但不限于以下技能 HTML JavaScript es6更佳 CSS 一共四部分十五小節,適合七天的訓練營。 從現在開始,我假裝你已經掌握了 html、 css以及 ES6...
摘要:微信小程序課程,面向所有具備前端基礎知識的同學閱讀要求讀者需要具備但不限于以下技能更佳一共四部分十五小節,適合七天的訓練營。 ?? 微信小程序課程,面向所有具備前端基礎知識的同學 ?? 閱讀要求 讀者需要具備但不限于以下技能 HTML JavaScript es6更佳 CSS 一共四部分十五小節,適合七天的訓練營。 從現在開始,我假裝你已經掌握了 html、 css以及 ES6...
摘要:微信小程序課程,面向所有具備前端基礎知識的同學閱讀要求讀者需要具備但不限于以下技能更佳一共四部分十五小節,適合七天的訓練營。 ?? 微信小程序課程,面向所有具備前端基礎知識的同學 ?? 閱讀要求 讀者需要具備但不限于以下技能 HTML JavaScript es6更佳 CSS 一共四部分十五小節,適合七天的訓練營。 從現在開始,我假裝你已經掌握了 html、 css以及 ES6...
閱讀 3621·2021-09-30 09:59
閱讀 2229·2021-09-13 10:34
閱讀 576·2019-08-30 12:58
閱讀 1507·2019-08-29 18:42
閱讀 2198·2019-08-26 13:44
閱讀 2921·2019-08-23 18:12
閱讀 3320·2019-08-23 15:10
閱讀 1624·2019-08-23 14:37