第五章 “我要点爆”微信小程序云开发实例之从云端获取数据制作首页
下面我们来实现从云端获取数据,完成首页世界页面index的制作,首页分为4个数据列表导航页面,页面具体内容如下:
推荐:为用户推荐最新的点爆信息,它包含文本点爆内容和语音点爆内容。
文爆:筛选出文字点爆内容,只显示文字点爆内容。
音爆:筛选出语音点爆内容,只显示语音点爆内容。
爆榜:将点爆内容取出前20名进入排行。
【实现页面内数据列表的滚动和导航切换后,每个导航下数据列表都在顶部】
由于我们使用的头部导航栏是通过数据绑定在同一页面进行切换,所以当一个页面内数据列表向下滚动后,切换导航后页面的scroolTop值已经改变,所以当从一个滚动过的导航数据列表切换到到另一个导航数据列表时,不能保持当前导航下数据列表在顶部,而会包含一个scroolTop值,下面我们就来实现导航切换后,数据列表为顶部位置。
在wxml中使用可滚动试图区域scrool-view组件做为数据列表的容器,wxml中设置组件scroll-y="true"为y轴滚动,同时通过数据绑定scroll-top="{{scrollTop}}"设置竖向滚动条位置,设置组件绝对定位样式。
<scroll-view scroll-y="true" scroll-top="{{scrollTop}}" style="position:absolute; top:0; left:0; right:0; bottom:0;">
</scroll-view>
在js中,我们给scrollTop设置初值为0,让页面打开时滚动条就在顶部
data: {
scrollTop: 0,
}
在每一次导航切换时,都将scrollTop的值重新赋值为0,保证当前导航页面滚动条在顶部。
this.setData({
scrollTop: 0
})
【实现数据列表加载功能】
在组件中使用wx:for进行控制属性绑定一个数组,使用数组中各项的数据重复渲染该组件。
wx:for-item制定数组当前元素变量名,将数据的id赋值给wx:key以便提高渲染效率,同时将数据的id赋值给id属性,方便跳转到详情页面。
block标签,使用block标签来进行条件渲染, 并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。使用block标签来进行条件渲染是一个很好的选择。
<view class="content_item" wx:for="{{tarray}}"
wx:for-item="recommend" wx:key="{{recommend._id}}" id="{{recommend._id}}">
<block wx:if="{{recommend.text}}">
<text>{{recommend.text}}</text>
</block>
</view>
当然,我们也可以直接在组件中使用wx:if,例如在文爆中控制只显示文本类爆文
<view class="content_item" bindtap="goopen" wx:for="{{tarray}}"
wx:for-item="textbao" wx:key="{{textbao._id}}" id="{{textbao.detailId}}"
wx:if="{{textbao.text}}">
</view>
在data中初始化一个数组tarray,用于保存从数据库中获取到的推荐爆文数据
data: {
tarray: [],
}
orderBy指定按照时间逆序排序,limit指定查询结果集数量上限为20,即最开始只从数据库获取20条数据,通过上拉加载来获取更多的数据
// 推荐数据
db.collection('bao').orderBy('time', 'desc').limit(20)
.get();
上拉加载,设置一个lnum1变量来记录当前页面有多少条数据,每次上拉获取10条数据,使用skip实现上拉加载更多,skip指定返回结果从指定序列后的结果开始返回
// 推荐数据
db.collection('bao').orderBy('wtime', 'desc').skip(lnum1).limit(10)
.get();
index.wxml完整代码
<!--index.wxml-->
<view class="header">
<label>
<input type="text" bindtap="search"/>
</label>
<view class="navbar">
<text class="item {{currentTab==index ? 'active' : ''}}" wx:for="{{navber}}"
data-index="{{index}}" wx:key="unique" bindtap="navbarTap">{{item}}</text>
</view>
</view>
<scroll-view class="content" scroll-y="true" scroll-top="{{scrollTop}}"
bindscrolltolower="thebottom" style="position:absolute; top:0; left:0; right:0; bottom:0;">
<view class="content_box">
<!-- 推荐数据列表 -->
<view class="recommend {{currentTab==0 ? 'show' : 'hide'}}">
<view class="content_item" bindtap="goopen" wx:for="{{tarray}}"
wx:for-item="recommend" wx:key="{{recommend._id}}" id="{{recommend._id}}">
<view class="citem_left">
<image src="/images/tou1.png"></image>
</view>
<block wx:if="{{recommend.text}}">
<view class="citem_mid">
<text>{{recommend.text}}</text>
<text>点爆方式:</text><text>{{recommend.wway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{recommend.temperature}}</text>
</view>
</block>
<block wx:if="{{recommend.filename}}">
<view class="citem_mid">
<image src="/images/yuyin.png"></image>
<text>点爆方式:</text><text>{{recommend.yway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{recommend.temperature}}</text>
</view>
</block>
</view>
</view>
<!-- 文爆 -->
<view class="textbao {{currentTab==1 ? 'show' : 'hide'}}">
<view class="content_item" bindtap="goopen" wx:for="{{tarray}}"
wx:for-item="textbao" wx:key="{{textbao._id}}" id="{{textbao.detailId}}" wx:if="{{textbao.text}}">
<view class="citem_left">
<image src="/images/tou1.png"></image>
</view>
<view class="citem_mid">
<text>{{textbao.text}}</text>
<text>点爆方式:</text><text>{{textbao.wway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{textbao.temperature}}</text>
</view>
</view>
</view>
<!-- 音爆 -->
<view class="voicebao {{currentTab==2 ? 'show' : 'hide'}}">
<view class="content_item" bindtap="goopen" wx:for="{{tarray}}"
wx:for-item="voicebao" wx:key="{{voicebao._id}}" id="{{voicebao.detailId}}" wx:if="{{voicebao.filename}}">
<view class="citem_left">
<image src="/images/tou1.png"></image>
</view>
<view class="citem_mid">
<image src="/images/yuyin.png"></image>
<text>点爆方式:</text><text>{{voicebao.yway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{voicebao.temperature}}</text>
</view>
</view>
</view>
<!-- 爆榜 -->
<view class="rankings {{currentTab==3 ? 'show' : 'hide'}}">
<view class="content_item" bindtap="goopen" wx:for="{{barray}}"
wx:for-item="rankings" wx:key="{{rankings._id}}" id="{{rankings._id}}">
<view class="number">
{{index+1}}
</view>
<view class="citem_left">
<image src="/images/tou1.png"></image>
</view>
<block wx:if="{{rankings.text}}">
<view class="citem_mid">
<text>{{rankings.text}}</text>
<text>点爆方式:</text><text>{{rankings.wway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{rankings.temperature}}</text>
</view>
</block>
<block wx:if="{{rankings.filename}}">
<view class="citem_mid">
<image src="/images/yuyin.png"></image>
<text>点爆方式:</text><text>{{rankings.yway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{rankings.temperature}}</text>
</view>
</block>
</view>
</view>
</view>
</scroll-view>
index.js完整代码
//index.js
//获取应用实例
const app = getApp()
Page({
data: {
navber: ['推荐', '文爆', '音爆', '爆榜'],
currentTab: 0,
tarray: [],
barray: [],
lnum1: 20,//记录当前已有数据数量
stext: '',
scrollTop: 0,
},
//上导航切换
navbarTap: function (e) {
this.setData({
scrollTop: 0
})
this.setData({
currentTab: e.currentTarget.dataset.index
})
},
search: function (e) {
wx.navigateTo({
url: '../search/search'
})
},
onLoad: function () {
wx.showLoading({
title: '加载中',
mask: true
})
const db = wx.cloud.database()
// 推荐数据
db.collection('bao').orderBy('time', 'desc').limit(20)
.get({
success: res => {
this.setData({
tarray: res.data
})
}
});
// 排行数据
db.collection('bao').orderBy('temperature', 'desc').limit(20)
.get({
success: res => {
this.setData({
barray: res.data
})
}
});
//模拟加载
setTimeout(function () {
wx.hideLoading()
}, 1500);
},
goopen: function (e) {
//获取当前内容的标识id,保存,方便进入查询
var id = e.currentTarget.id
wx.setStorageSync('id', id)
wx.navigateTo({
url: '../detail/detail',
});
},
//下拉刷新
onPullDownRefresh: function () {
wx.showNavigationBarLoading() //在标题栏中显示加载
wx.showLoading({
title: '加载中',
mask: true
})
const db = wx.cloud.database()
// 推荐数据
db.collection('bao').orderBy('time', 'desc').limit(20)
.get({
success: res => {
this.setData({
tarray: res.data
})
}
});
// 排行数据
db.collection('bao').orderBy('temperature', 'desc').limit(20)
.get({
success: res => {
this.setData({
barray: res.data
})
}
});
//模拟加载
setTimeout(function () {
// complete
wx.hideNavigationBarLoading() //完成停止加载
wx.stopPullDownRefresh() //停止下拉刷新
wx.hideLoading()
}, 1500);
},
//上拉加载
thebottom: function () {
var lnum1 = this.data.lnum1
const db = wx.cloud.database()
if (this.data.currentTab == 0) {
// 显示加载图标
wx.showLoading({
title: '玩命加载中',
})
// 推荐数据
db.collection('bao').orderBy('wtime', 'desc').skip(lnum1).limit(10)
.get({
success: res => {
this.setData({
tarray: this.data.tarray.concat(res.data),
lnum1: lnum1 + 10
})
// 隐藏加载框
wx.hideLoading()
}
});
}
}
})
运行效果图:


搜索框搜索页面的实现
app.json中加入search页面路径,编写搜索页面样式
search.wxml
<view class="header">
<label>
<input type="text" bindconfirm="search" bindinput="content"
confirm-type="search" focus="true"/>
<icon type="search" size="25" bindtap="search"/>
</label>
</view>
<view class="content">
<text class="nohave {{bol ? 'show' : 'hide'}}">你搜的什么吖,我莫得!</text>
<view class="searchArray">
<view class="content_item" bindtap="goopen" wx:for="{{tarray}}"
wx:for-item="searchArray" wx:key="{{searchArray._id}}" id="{{searchArray._id}}">
<view class="citem_left">
<image src="/images/tou1.png"></image>
</view>
<block wx:if="{{searchArray.text}}">
<view class="citem_mid">
<text>{{searchArray.text}}</text>
<text>点爆方式:</text><text>{{searchArray.wway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{searchArray.temperature}}</text>
</view>
</block>
<block wx:if="{{searchArray.filename}}">
<view class="citem_mid">
<image src="/images/yuyin.png"></image>
<text>点爆方式:</text><text>{{searchArray.yway}}</text>
</view>
<view class="citem_right">
<image src="/images/re.png"></image>
<text>{{searchArray.temperature}}</text>
</view>
</block>
</view>
</view>
</view>
db.RegExp介绍:数据库支持正则表达式查询,开发者可以在查询语句中使用 JavaScript 原生正则对象或使用 db.RegExp 方法来构造正则对象然后进行字符串匹配。在查询条件中对一个字段进行正则匹配即要求该字段的值可以被给定的正则表达式匹配,注意正则表达式不可用于 db.command 内(如 db.command.in)。
使用db.RegExp方法构造正则对象然后进行字符串匹配,通过在对bao集合中text内容进行查询时,给text赋值一个db.RegExp正则对象,这样就实现了对text的模糊查询。
db.collection('bao').where({
//使用正则查询,实现对搜索的模糊查询
text: db.RegExp({
regexp: value,
//从搜索栏中获取的value作为规则进行匹配。
options: 'im',
//大小写不区分
})
}).get()
search.js完整代码
// pages/search/search.js
Page({
data: {
tarray: [],
stext: '',
bol: false,
},
search: function () {
wx.showLoading({
title: '玩命加载中',
})
this.setData({
tarray: []
})
//连接数据库
const db = wx.cloud.database()
var that = this
var value = this.data.stext
db.collection('bao').where({
//使用正则查询,实现对搜索的模糊查询
text: db.RegExp({
regexp: value,
//从搜索栏中获取的value作为规则进行匹配。
options: 'im',
//大小写不区分
})
}).get({
success: res => {
console.log(res)
if (res.data.length == 0) {
that.setData({
bol: true
})
} else {
that.setData({
tarray: res.data
})
}
wx.hideLoading()
}
})
},
content: function (e) {
this.setData({
stext: e.detail.value
})
},
goopen: function (e) {
//获取当前内容的标识id,保存,方便进入查询
var id = e.currentTarget.id
wx.setStorageSync('id', id)
wx.navigateTo({
url: '../detail/detail',
});
},
})
运行效果图

至此,首页就制作完成了,可以说小程序的主体已经差不多了,云开发的便利我们也都尝试了。那么大家就快进行实践吧!
第五章 “我要点爆”微信小程序云开发实例之从云端获取数据制作首页的更多相关文章
- 第六章 “我要点爆”微信小程序云开发实例之爆文详情页制作
爆文详情页制作 从首页中数据列表打开相应详情页面的方法: 给数据列表中每个数据项加一个点击事件,同时将当前数据项的id暂时记录在本地,然后跳转到详情页面detail goopen: function ...
- 第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现
第一章 “我要点爆”微信小程序云开发之项目建立与我的页面功能实现 开发环境搭建 使用自己的AppID新建小程序项目,后端服务选择小程序·云开发,点击新建,完成项目新建. 新建成功后跳转到开发者工具界面 ...
- “我要点爆”微信小程序云开发实例
使用云开发进行微信小程序“我要点爆”的制作 下一章:“我要点爆”微信小程序云开发之项目建立与我的页面功能实现 接下来我将对“我要点爆”微信小程序进行完整的开源介绍 小程序名称: 我要点爆 查看方式:从 ...
- 第四章 “我要点爆”微信小程序云开发之疯狂点击与糖果点爆页面制作
疯狂点击点爆方式页面制作 疯狂点击为用户提供一个60秒的按钮点击时间,同时点击过程中有背景音乐,系统根据用户点击按钮的此时来进行热度值的计算. <view class="the_hea ...
- 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
点爆方式选择页面制作 在app.json中配置页面路径增加selectbao点爆方式选择,编译创建页面文件,点爆方式选择页面通过单选按钮组选择跳转到相应的点爆页面. <view class=&q ...
- 第二章 "我要点爆"微信小程序点爆页面的实现与云函数和云存储的应用
点爆页面的实现与云函数和云存储的应用以及录音功能讲解 点爆页面制作 点爆页面主要提供文字记录和语音记录两种爆文记录方式,在本页面内输入文字或录入语音后选择心情点击点爆按钮,跳转到点爆方式选择界面. 首 ...
- 微信小程序云开发-数据库-查询满足条件的数据
一.查询价格大于10的商品 1.wxml文件 2.js文件 where条件语句:.where({price:db.command.gt(10)}) 3.查询结果 二.查询价格大于等于10的商品 js文 ...
- 技本功丨收藏!斜杠青年与你共探微信小程序云开发(下篇)
2019年2月26日,人们为了一个杯子疯了一天. 星巴克猫爪杯,一场已经与猫无关了的“圣杯战争“.网上的倒卖价格,已炒至近千元! 求而不得,舍而不能,得而不惜.这是人最大的悲哀... 所以,请珍惜以下 ...
- 微信小程序云开发-从0打造云音乐全栈小程序
第1章 首门小程序“云开发”课程,你值得学习本章主要介绍什么是小程序云开发以及学习云开发的重要性,并介绍项目的整体架构,真机演示项目功能,详细介绍整体课程安排.课程适用人群以及需要掌握的前置知识.通过 ...
随机推荐
- redis的主从复制和哨兵支持的主从切换
1 主从复制的目的是为了读写分离 master写,然后同步到slave,slave只管读. 2 哨兵存在的目的 是为了主从切换,如果master挂了,那么一个slave成为master,重启之后的ma ...
- 面试算法爱好者书籍/OJ推荐
面试算法爱好者书籍/OJ推荐 这个书单也基本适用于准备面试. 一.教科书 基本上一般的算法课本介绍的范围都不会超出算法导论和算法引论的范围.读完这两本书,其它的算法课本大致翻翻也就知道是什么货色了. ...
- 13.JavaScript 类
JavaScript 类 JavaScript 是面向对象的语言,但 JavaScript 不使用类. 在 JavaScript 中,不会创建类,也不会通过类来创建对象(就像在其他面向对象的语言中那样 ...
- Appnium安装-Mac平台
Appium的安装-MAC平台 其实Appium的安装方式主要有两种: 1)自己安装配置nodejs的环境,然后通过npm进行appium的安装 2)直接下载官网提供的dmg进行安装,dmg里面已 ...
- Shell之内容匹配与格式输出
对于大文本或者有些特定格式的文本,有时我们要查找特定内容或定位指定的区域,这样就需要内容匹配. 关于内容匹配,我们常使用的有几个命令: grep,支持正则,查找包含有匹配项的行. cut,提取指定的列 ...
- vue路由的两种模式,hash与history
对于Vue 这类渐进式前端开发框架,为了构建SPA(单页面应用),需要引入前端路由系统,这也就是Vue-router存在的意义.前端路由的核心,就在于——— 改变视图的同时不会向后端发出请求. 一.为 ...
- UVA11892 ENimEN —— 博弈
题目链接:https://vjudge.net/problem/UVA-11892 题意: 两人玩游戏,有n堆石子,每堆有ai块石子,两人轮流取,要求一次只能选择一堆石子取任意块.最后取完的获胜. 题 ...
- phpcms 内容模块PC标签调用
PHPcms 调用命令的基本格式: 开始:{pc:content action="模块操作名" catid="调用栏目ID" num="数据调用数量& ...
- hdu 1205 吃糖果(抽屉原理)
题意:N种糖果,不能把一样的放在一起吃,即第一次吃一种,下一次吃另一种. 思路:找到个数最多的糖果种类(最大的数目记作 ma,该糖果种类记为a),首先把这n个糖果放到n个抽屉里面,然后把剩余的N-1种 ...
- 使用geolocation
The geolocation object geolocation API建立在navigator.geolocation 上. 如果对象存在,才可以使用定位服务. if ("geoloc ...