环境搭建篇:
01_从零构建微信小程序项目_项目概述
02_从零构建微信小程序项目_项目环境搭建
静态页面篇:
03_从零构建微信小程序项目_首页静态效果实现
04_从零构建微信小程序项目_咨询页面静态效果实现
05_从零构建微信小程序项目_课程页面静态效果实现
06_从零构建微信小程序项目_我的页面静态效果实现
07_从零构建微信小程序项目_精选文章页面静态效果实现
08_从零构建微信小程序项目_关于我们页面静态效果实现
09_从零构建微信小程序项目_咨询师详情页静态效果实现
10_从零构建微信小程序项目_登录页面静态效果实现
11_从零构建微信小程序项目_注册页面静态效果实现
数据交互篇:
12_从零构建微信小程序项目_数据交互_深入理解小程序
13_从零构建微信小程序项目_数据交互_WXML语法详解
14_从零构建微信小程序项目_数据交互_json-server详解
15_从零构建微信小程序项目_数据交互_首页
16_从零构建微信小程序项目_数据交互_登录和注册
17_从零构建微信小程序项目_数据交互_精选文章列表(涵盖:上提加载和下拉刷新)
18_从零构建微信小程序项目_数据交互_文章详情页(涵盖:多页面传参和富文本解析)
b站直通车:
2021年最新微信小程序项目实战教程,从入门到精通,零基础入门小程序开发【配置素材+源码+笔记】_哔哩哔哩_bilibili
精选文章页面的数据结构之前我们已经定义过了,在首页的精选文章部分,之前我们只定义了5条,现在无非弄多一点数据而已,因为我们要做上提加载(分页);
怎么获取数据?
1、进入官网,访问对应的页面,比如精选文章:
https://www.hnsfxlzx.com/sf/p/view/article/rmwz
2、打开浏览器控制台(谷歌浏览器->右键->检查),NetWork,刷新页面,在控制台搜索框里面搜索page,一般都是要使用的数据;点击路径,右侧Response,复制数据;
3、通过https://www.sojson.com/页面,格式化json;从中拿需要的数据;
"hotArticles": [
{
"SOURCE": "十方智育",
"ARTICLES_TITLE": "失眠—你失控情绪的另一个出口",
"CJSJ": 1585708931000,
"ID": "2c9065246e96ad950171339e1a1f07b1",
"IMAGE": "/images/rmwz01.jpg",
"INFO": "失眠,已经成为当下许多年轻人的困扰。正如一句网络流行语调侃的那样,许多人的现状就是“也不是不困,就是想再等等……到底等什么呢?不知道,就是想再等等。”失眠造成的困扰不言而喻,有时会伴随着焦虑、抑郁、烦躁等情绪问题。尤其在隔离环境当中,突然没有平日忙碌的工作来填补时间的情况下,那些",
"pv": 9999
},
{
"SOURCE": "十方智育",
"ARTICLES_TITLE": "最易让人生病的八种心理情绪",
"CJSJ": 1572253623000,
"ID": "2c9065246df6837f016e119e63b6002a",
"IMAGE": "/images/rmwz02.jpg",
"INFO": " 生活中总是伴随着各种情绪,反映着我们的喜怒哀乐。不过丰富的情绪并不是件好事,有时还会影响我们的身心健康。下面是男人常见的八种心理情绪,小心这些情绪也会让你生病! 恶劣情绪NO.1:敌意 这是个讲究TEAMWORK的社会,不能和他人积极合作更容易引发敌意。专家发现:“敌视情",
"pv": 996
},
{
"SOURCE": "十方智育",
"ARTICLES_TITLE": "成人磨牙暗示着心理压力大",
"CJSJ": 1572253453000,
"ID": "2c9065246df6837f016e119bccf90029",
"IMAGE": "/images/rmwz03.jpg",
"INFO": "在入睡后磨牙,医学上称为“磨牙症”,磨牙症多见于儿童。不过成年磨牙也逐渐增多趋势,据了解,这与成人的心理状况有关,属于潜意识中的心理压力。 磨牙意味潜意识中的压力 口腔生理学与心理学认为,口腔是人体首先兴奋的源点,是与外界交流的渠道,且口腔具有表示紧张、悲观等情绪的功能。当今人",
"pv": 38
},
{
"SOURCE": "十方智育",
"ARTICLES_TITLE": "职场解压的15个心理技巧",
"CJSJ": 1572253333000,
"ID": "2c9065246df6837f016e1199f6e80028",
"IMAGE": "/images/rmwz04.jpg",
"INFO": "练习日常用来减压的技巧职场人士必须学会用简单方法放松自己,这是能够有效地减轻各种压力所导致的紧张不安的一种重要途径。 下面列出了日常放松自己或者减轻压力的一些简单方法,只要你稍加练习就可以掌握。 1、当面对繁重压力时,小睡一会。打盹被认为是减少和预防压力最有效的办法之一。 2",
"pv": 10
},
{
"SOURCE": "十方智育",
"ARTICLES_TITLE": "从性格判断你的健康状况",
"CJSJ": 1572253131000,
"ID": "2c9065246df6837f016e1196e18c0027",
"IMAGE": "/images/rmwz05.jpg",
"INFO": "从一个人的性格能判断其健康状况吗?答案是“能”,而且性格还会很大程度上影响到人的健康。健康心理学家表示,人的个性受到遗传基因和生活环境的双重影响。个性基本上可以分为以下八类,同时它们也能分别映射出不同疾病。虽然人们不能绝对对号入座,但它至少能提醒我们身边存在的潜在风险。 1",
"pv": 1088
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "这个救赎,因校园霸凌而起",
"CJSJ": 1547801589000,
"ID": "2c90652467500e6801686029f76b006e",
"IMAGE": "/images/rmwz06.jpg",
"INFO": "继《你的名字》之后,日本又出现了一个现象级的动漫电影---《声之形》。《你的名字》讲述关于爱情的缘分与奇妙,《声之形》则引起对友谊和成长的人性思考。 这是一个有关于听觉障碍的少女和曾经伤害过她的少年石田将也的成长故事。 作为小学转校生的女主角西宫硝子来到了男主角石田将也的班上,由"
,"pv": 1188
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "张韶涵从落魄走向开挂:所谓自由,就是被人讨厌",
"CJSJ": 1547801545000,
"ID": "2c90652467500e68016860294c97006d",
"IMAGE": "/images/rmwz07.jpg",
"INFO": "前几天看了一本书《被讨厌的勇气》,关于阿德勒的个体心理学,看完以后感触颇多。 书的副标题是:“所谓的自由,就是被人讨厌”。像裴多菲说的那样:生命诚可贵,爱情价更高,若为自由故,两者皆可抛,这个时代的每个人更是都在捶胸顿足的渴望着自由。 他们是上学的孩子、上班的职员、已婚的父母、有"
,"pv": 18
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "在你不知道的时候,你已经被美食毒害了",
"CJSJ": 1547801504000,
"ID": "2c90652467500e6801686028ac13006c",
"IMAGE": "/images/rmwz08.jpg",
"INFO": "是不是有点奇怪,为什么你会一直吃零食,根本管不住自己的嘴?实际上,你可能是能管住自己的。但是我想你一定已经看过了电视纪录片里讲的有些人管不住自己的嘴,哪怕他们已经胖得没法出门,仍然无法控制自己。为什么会这样?他们就是所谓的食物成瘾者?或者说这些食物成瘾者没有足够的意志力?你是怎么"
,"pv": 112
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "原生家庭的苦,怎样才能不白受?",
"CJSJ": 1547801446000,
"ID": "2c90652467500e6801686027ca0c006b",
"IMAGE": "/images/rmwz09.jpg",
"INFO": "培养安全依恋需要父母的热情、稳定和心理健康,那么,被原生家庭伤害过的人能不能培养安全依恋的孩子呢? -01-“妈妈酗酒、爸爸躁郁症,但我没有疯” 丽的妈妈酗酒,爸爸有躁郁症,她从来无法确定每天家中会是什么状态,也许妈妈会暴跳如雷,爸爸会拒绝服药,一会忧郁、一会躁狂。 但是,丽并没"
,"pv": 96
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "优秀的你,是不是个优秀的家长",
"CJSJ": 1547801396000,
"ID": "2c90652467500e680168602705c8006a",
"IMAGE": "/images/rmwz10.jpg",
"INFO": "在怎么教养孩子这方面,没有人可以给出来标准答案。每个孩子都不一样,做的少了怕不够,做得多了怕太过。 之前有一个朋友问我:是不是所有的父母都是爱他们的孩子的? 我告诉他,是的,确实所有的父母都爱他们的孩子,但不是所有的父母都是无条件爱孩子的。会有家长说:你要学习好,有才艺,要听话…"
,"pv": 168
},
{
"SOURCE": "十方智育",
"ARTICLES_TITLE": "永不消失的爱",
"CJSJ": 1547801366000,
"ID": "2c90652467500e68016860268e210069",
"IMAGE": "/images/rmwz11.jpg",
"INFO": "听一个女孩儿讲她与父母的事,我却觉得,我们每个人的父母也是如此。 如果你觉得岁月静好,那一定是有人为你负重前行。 01 在我还没有开始工作的时候,我总觉得我是家里最累的那个人——每天都在上课,走的最早,回的最晚,在家还要写作业到半夜。我理所当然的觉得家里的事情就应该是父母在操心,"
,"pv": 54
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "抑郁症与抑郁情绪",
"CJSJ": 1547801334000,
"ID": "2c90652467500e680168602612d80068",
"IMAGE": "/images/rmwz12.jpg",
"INFO": "什么是抑郁症? 抑郁症是一种常见的精神疾病,主要表现为情绪低落,兴趣减低,悲观,思维迟缓,缺乏主动性,自责自罪,饮食、睡眠差,担心自己患有各种疾病,感到全身多处不适,严重者可出现自杀念头和行为。主要表现为:心境低落主要表现为显著而持久的情感低落,抑郁悲观。轻者闷闷不乐、无愉快感、"
,"pv": 99
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "研究生被导师压迫跳楼:“人际弱势者”如何自救?",
"CJSJ": 1547801295000,
"ID": "2c90652467500e68016860257c490067",
"IMAGE": "/images/rmwz13.jpg",
"INFO": "这两天看到一条新闻:武汉理工大学,研三的学生陶崇园,长期受到其导师的精神压迫。在长期的压力之下,陶崇园最终不堪重负,选择了跳楼自杀。看到这个新闻我非常的痛心。为陶崇园在重负之下选择终结自己的生命,感到非常的惋惜。但陶崇园绝非个例,这世上还有不知多少如陶崇园一样的人,在承受着来自别"
,"pv": 9
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "心理咨询的作用之一——在情绪中存活",
"CJSJ": 1547801256000,
"ID": "2c90652467500e6801686024e1dd0066",
"IMAGE": "/images/rmwz14.jpg",
"INFO": "当我们意外的掉入一条河里,这时候我们可能会先让自己浮出水面,深呼吸让自己镇定下来,观察下周围最近的岸边,是否需要喊人帮忙……有读者会说了,这种情况是基于你会游泳,没错。如果你在水里处在一个沉溺淹没的状态,我们根本不可能做出更多思考,以及采取对自己最有利的选择。 有时候我们甚至都没"
,"pv": 20
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "心理史上最大骗局:“星座测试太准啦!”",
"CJSJ": 1547801193000,
"ID": "2c90652467500e6801686023ec1c0065",
"IMAGE": "/images/rmwz15.jpg",
"INFO": "-01- “他要和我分手,嫌弃我是个处女!”He Broke Up With Me Coz I'm a Virgin话说,电视剧《龙门镖局》里有个四处留情的风流男子 —— 恭叔。这一天,镖局来了个恭叔的前女友 —— 露露。镖局的小伙伴们都在八卦:“你和恭叔当初是为啥分手哒?”下面"
,"pv": 618
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "小心!微表情泄露了你的秘密",
"CJSJ": 1547801105000,
"ID": "2c90652467500e680168602295500064",
"IMAGE": "/images/rmwz16.jpg",
"INFO": "小心!微表情泄露了你的秘密当下,随着许许多多影视资源的问世,越来越多的人将目光投向了心理学中的微表情。在众多影视剧中,微表情表现得神秘、莫测,仿佛掌握了微表情就征服了全世界。很多人慢慢开始崇拜掌握着这一技之长的人。那么,什么是微表情?你对微表情究竟了解多少?下面,就让我们一起走进"
,"pv": 982
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "我们为什么说脏话",
"CJSJ": 1547800979000,
"ID": "2c90652467500e6801686020a8020063",
"IMAGE": "/images/rmwz17.jpg",
"INFO": "这是一篇脏话百科全书,不谢,我也知道今天我巨他妈好看! 脏话,一种神奇的语言系统你能想象,一个没有脏话的世界,将如何生存吗?反正我不能。脏话,现在已经成为中国语言中非常发达的一项语言分支,它可以用来简化语言,规避歧义,提高语言效率。比如,“这个解释他妈的不清楚”和“这个他妈的解释"
,"pv": 138
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "为什么上班都是坐着,还会感觉疲惫不堪?",
"CJSJ": 1547800887000,
"ID": "2c90652467500e680168601f41010062",
"IMAGE": "/images/rmwz18.jpg",
"INFO": "有很多人上班疲惫回家之后就躺在沙发上休息看电视或者玩手机;在午后或者下午三四点之后分心注意力难以集中接着就走出去抽一口烟又或者刷刷微信放松一下,这些方式都无法解除大脑的疲劳。所以这一次跟焦糖Pan选择了这本日本畅销榜上的《最高休息法》,用正确的方式让大脑得到休息。如果大脑得到休息"
,"pv": 962
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "为什么你记不住别人的名字",
"CJSJ": 1547800736000,
"ID": "2c90652467500e680168601cf49c0061",
"IMAGE": "/images/rmwz19.jpg",
"INFO": "我们经常在聚会或是会议上听到别人说:“我擅长记人的脸,但是记不住人的名字。”这种常见的说法正确吗?现在,让我们开始一场关于记忆心理的旅程。我要告诉你,我们关于脸部、名字的记忆,并不像它看起来的那么简单。人类确实是识别面孔的专家。我们中的大都数人都能识别出成千上万张的脸,一切都是这"
,"pv": 28
}, {
"SOURCE": "十方智育",
"ARTICLES_TITLE": "完美主义与自杀风险 ▎无法满足的期望与标准",
"CJSJ": 1547800627000,
"ID": "2c90652467500e680168601b4aba0060",
"IMAGE": "/images/rmwz20.jpg",
"INFO": "根据世界卫生组织(WHO)的统计,每45秒就有一个人自杀。为了防止悲剧发生,我们需要了解更多影响某些个体容易产生自杀想法以及自杀行为的因素。其中一个风险因素就是完美主义:一种强迫自己时刻达到超过自身能力标准的倾向或/和满足或超越他人过高期望的自我需要。 1995年,心理学家Sid"
,"pv": 118
}
]
hotArticle.wxml代码:
正在加载更多数据
hotArticle.js代码:
// pages/hotArticle/hotArticle.js
// 获取应用实例
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
baseUrl: "",
hotArticles: "",
lodingImg:""
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 获取baseUrl,赋值给当前页面的data里面的baseUrl变量
var _this = this;
var baseUrl = app.globalData.baseUrl;
_this.setData({
baseUrl: baseUrl,
lodingImg:"/images/loading.gif"
})
// 获取所有文章
wx.request({
url: baseUrl + "hotArticles",
method: "GET",
header: {
'content-type': 'application/json'
},
success(res) { // res是服务器响应的数据
// 把响应过来的数据的IMAGE的路径之前拼接上baseUrl
for (var i = 0; i < res.data.length; i++) {
res.data[i].IMAGE = baseUrl + res.data[i].IMAGE;
}
_this.setData({
hotArticles: res.data
})
}
})
},
})
hotArticle.wxss代码:
/* 引入模版所需样式 */
@import '/pages/template/articleTemplate/articleTemplate.wxss';
/* 文章列表区域*/
#hotArticleView{
padding: 0 22rpx;
}
/* 正在加载样式 */
#loadingView{
text-align: center;
height: 88rpx;
background: #F0EFF5;
line-height: 88rpx;
}
#loadingView > image{
width: 48rpx;
height: 48rpx;
vertical-align: middle;
}
#loadingView > text{
font-size: 28rpx;
vertical-align: middle;
}
1、打开精选文章页面,我们要显示一部分数据;假定打开精选文章页面,我们要先显示8条数据;无非就是向后台发送请求,获取文章的前8条数据;_page=1&_limit=8
2、在上提加载函数里面,发送请求去获取第x页的数据(上提加载的时候,要查询的_page要动态改变),但是我们获取的数据是要累加的,而不是覆盖;怎么实现:在hotArticles的基础上进行数据的追加;
// pages/hotArticle/hotArticle.js
// 获取应用实例
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
baseUrl: "",
hotArticles: [],
lodingImg:"",
// pageNum变量: 要请求的页码
pageNum: 1
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 获取baseUrl,赋值给当前页面的data里面的baseUrl变量
var _this = this;
var baseUrl = app.globalData.baseUrl;
_this.setData({
baseUrl: baseUrl,
lodingImg:"/images/loading.gif"
})
// 肯定不能一次性获取所有文章,应该是初始显示部分数据,上提的时候再加载更多数据
// 显示第一页的数据
wx.request({
url: baseUrl + "hotArticles?_page="+_this.data.pageNum+"&_limit=8",
method: "GET",
header: {
'content-type': 'application/json'
},
success(res) { // res是服务器响应的数据
console.log("第"+_this.data.pageNum+"页的数据:",res.data);
// 把响应过来的数据的IMAGE的路径之前拼接上baseUrl
for (var i = 0; i < res.data.length; i++) {
res.data[i].IMAGE = baseUrl + res.data[i].IMAGE;
}
_this.setData({
hotArticles: _this.data.hotArticles.concat(res.data)
})
}
})
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
var _this = this;
var baseUrl = _this.data.baseUrl;
// 每次上提,原有的页码+1,pageNum + 1
_this.setData({
pageNum: _this.data.pageNum + 1
})
wx.request({
url: baseUrl + "hotArticles?_page="+_this.data.pageNum+"&_limit=8",
method: "GET",
header: {
'content-type': 'application/json'
},
success(res) { // res是服务器响应的数据
console.log("第"+_this.data.pageNum+"页的数据:",res.data);
// 把响应过来的数据的IMAGE的路径之前拼接上baseUrl
for (var i = 0; i < res.data.length; i++) {
res.data[i].IMAGE = baseUrl + res.data[i].IMAGE;
}
_this.setData({
hotArticles: _this.data.hotArticles.concat(res.data)
})
}
})
},
})
3、代码重用性;
// 封装请求数据的代码,提高代码复用性
// getData里面需要this对象,那么我们通过that参数传递进来
function getData(that){
// 通过参数that获取baseUrl和pageNum
var baseUrl = that.data.baseUrl;
var pageNum = that.data.pageNum;
wx.request({
url: baseUrl + "hotArticles?_page="+pageNum+"&_limit=8",
method: "GET",
header: {
'content-type': 'application/json'
},
success(res) { // res是服务器响应的数据
console.log("第"+pageNum+"页的数据:",res.data);
// 把响应过来的数据的IMAGE的路径之前拼接上baseUrl
for (var i = 0; i < res.data.length; i++) {
res.data[i].IMAGE = baseUrl + res.data[i].IMAGE;
}
that.setData({
hotArticles: that.data.hotArticles.concat(res.data)
})
}
})
}
// 在onload 和 onReachBottom分别调用getData(this)
4、最下面:友好的提示
需求:
1、如果服务器还没有反馈回来数据,提示:正在加载更多数据...
2、如果没有更多数据,提示:已经是最后一页啦!
实现:
1、默认情况下,正在加载数据...和已经是最后一页啦!,都是隐藏起来的;
2、上提的时候,向服务器获取数据,让正在加载数据...显示,数据返回了,让正在加载数据...隐藏;
3、如果没有数据了,那么显示已经是最后一页啦! 先获取得到总数量,当我们每次请求的时候,判断data里面的hotArticles是否和总数量相等,如果相等,则不再发送请求获取数据,显示最后一页;
注:在实际开发环境里面,后台会把总数量和当前页的数据都封装给你,但是在json-server里面,必须得发送请求单独获取总数量;
正在加载更多数据
已经是最后一页啦!
// pages/hotArticle/hotArticle.js
// 获取应用实例
const app = getApp()
// 封装请求数据的代码,提高代码复用性
// getData里面需要this对象,那么我们通过that参数传递进来
function getData(that){
// 通过参数that获取baseUrl和pageNum
var baseUrl = that.data.baseUrl;
var pageNum = that.data.pageNum;
// 获取总数量
var count = that.data.count;
// 判断是否到最后一页
if(count == that.data.hotArticles.length){
that.setData({
isLoading: false,
noData: true
})
}else{
wx.request({
url: baseUrl + "hotArticles?_page="+pageNum+"&_limit=8",
method: "GET",
header: {
'content-type': 'application/json'
},
success(res) { // res是服务器响应的数据
console.log("第"+pageNum+"页的数据:",res.data);
// 把响应过来的数据的IMAGE的路径之前拼接上baseUrl
for (var i = 0; i < res.data.length; i++) {
res.data[i].IMAGE = baseUrl + res.data[i].IMAGE;
}
that.setData({
hotArticles: that.data.hotArticles.concat(res.data),
isLoading: false
})
}
})
}
}
Page({
/**
* 页面的初始数据
*/
data: {
baseUrl: "",
hotArticles: [],
lodingImg:"",
// pageNum变量: 要请求的页码
pageNum: 1,
isLoading:false,
noData:false,
count:""
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 获取baseUrl,赋值给当前页面的data里面的baseUrl变量
var _this = this;
var baseUrl = app.globalData.baseUrl;
_this.setData({
baseUrl: baseUrl,
lodingImg:"/images/loading.gif"
})
// 肯定不能一次性获取所有文章,应该是初始显示部分数据,上提的时候再加载更多数据
// 获取总数量: 获取所有文章,通过数组长度得到总数量;
wx.request({
url: baseUrl + "hotArticles",
method: "GET",
header: {
'content-type': 'application/json'
},
success(res) { // res是服务器响应的数据
_this.setData({
count: res.data.length
})
// 显示第一页的数据
getData(_this);
}
})
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
var _this = this;
// 每次上提,原有的页码+1,pageNum + 1
_this.setData({
pageNum: _this.data.pageNum + 1,
isLoading: true
})
getData(this);
},
})
1、本页面开启下拉刷新;
{
"usingComponents": {},
"navigationBarTitleText": "精选文章",
"enablePullDownRefresh":true
}
2、每次下拉页面,都会触发onPullDownRefresh函数,在onPullDownRefresh函数进行数据重置即可;
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
var _this = this;
// 正常情况下,需要重新获取一次count,但是我们这里就不写
_this.setData({
hotArticles: [],
pageNum: 1,
isLoading:false,
noData:false
})
// 获取第一页的数据
getData(_this);
},