最近在学习微信小程序,所以把一些重点给记录下来
废话不多说,先来一波效果图:
gif动图太小了 这边再来几张图片
重点说明 本接口数据来源于玩Android开放api
地址:https://www.wanandroid.com/
详细功能介绍:
上边是一个可滑动的横向分类栏 下面是点击分类栏切换到的界面以及下边可滑动改变当前页面数据,以及数据在请求数据时加载时间过长,所以将已加载过的数据进行本地化存储,向左滑动时就不用再发送请求
代码:(Own.wxml)
<view class="tab">
<scroll-view class="nav" scroll-x="true" scroll-left="{{scrollLeft}}">
<block wx:for="{{allTitle}}" wx:for-index="idx" wx:key="idex">
<view class="nav-item {{currentIndex==idx ? 'active' : ''}}" data-current="{{idx}}" bindtap="changeTitle">{{item.title}}</view>
</block>
</scroll-view>
</view>
<swiper class="content-container" current="{{currentIndex}}" circular="{{false}}" bindchange="changeContent">
<block wx:for="{{allTitle}}" wx:key="id">
<swiper-item class="content">
<x-my playlist="{{playlist}}"></x-my>
</swiper-item>
</block>
</swiper>
Own.wxss
page{
width: 100%;
height: 100%;
}
.tab {
width: 100%;
height: 100%;
display: flex;
/* 竖直排列 */
flex-direction: column;
}
.nav {
height: 80rpx;
width: 100%;
overflow: hidden;
/* 段落中的文本不进行换行 */
white-space: nowrap;
line-height: 80rpx;
font-size: 26rpx;
/* 固定定位 不会随着屏幕滚动而滚动 */
position: fixed;
top: 0;
left: 0;
/* 显示的层级 负值时在最底层 正值越大 越先看得见 */
z-index: 99;
}
.nav-item {
width: 25%;
display: inline-block;
text-align: center;
}
.active {
color: #FF6471;
position: relative;
}
.active:after{
content: "";
display: block;
width:100%;
height: 5rpx;
border-radius: 8rpx;
background: #FF6471;
position: absolute;
bottom: 0;
}
.content-container {
padding-top: 80rpx;
height: 90%;
width: 100%;
}
swiper-item{
overflow: scroll;
}
/* 隐藏滚动条 */
::-webkit-scrollbar {
width: 0;
height: 0;
color: transparent;
}
Own.js
let id =294
let shared = []
Page({
/**
* 页面的初始数据
*/
data: {
allTitle: [
{ id: 294, title: '完整项目' },
{ id: 402, title: '跨平台应用' },
{ id: 367, title: '资源聚合类' },
{ id: 323, title: '动画' },
{ id: 314, title: 'RV列表动效' },
{ id: 358, title: '项目基础功能' },
{ id: 328, title: '网络文件下载' },
{ id: 331, title: 'TextView' },
{ id: 336, title: '键盘' },
{ id: 337, title: '快应用' },
{ id: 338, title: '日历时钟' }
],
currentIndex: 0, //当前选中标题的下标
scrollLeft: 0, //tab滚动条的位置
playlist:[],
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this._initdata()
},
_initdata(){//初始化分类下的文章数据
if (wx.getStorageSync(id.toString()) != ''){
this.setData({
playlist: wx.getStorageSync(id.toString())
})
}else{
wx.showLoading({
title: '加载中...',
})
wx.cloud.callFunction({
name:'test',
data:{
id,
$url:'type',
}
}).then((res)=>{
this.setData({
playlist:res.result.datas,
})
wx.hideLoading()
shared = res.result.datas
wx.setStorageSync(id.toString(), shared)
})
//直接将playlist值赋值给新数组 先判断新数组是否有当前数据
}
},
//点击切换标题
changeTitle(event) {
let index = event.target.dataset.current;//当前点击标题的index
this.setData({
currentIndex: index
})
},
//滑动切换内容
changeContent(event) {
let current = event.detail.current;
//获取系统可使用窗口宽度
let singleNavWidth = wx.getSystemInfoSync().windowWidth / 4;
this.setData({
playlist:[],
currentIndex: current,
scrollLeft: (current - 2) * singleNavWidth //当scrollLeft为负值时无变化 当前scrollLeft移动了n个singleNavWidth 横向滚动条就移动几个n
});
id = this.data.allTitle[current].id
console.log(id)
this._initdata()
}
,
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
我的云函数网络请求 这里你也可以直接发送请求 不用按照我写的操作
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init(
{
traceUser: true,
env: 'guard-5znfa'
}
)
const db = cloud.database();//云数据库初始化
const rp = require('request-promise')
const TcbRouter = require('tcb-router')
const LINK = 'https://www.wanandroid.com/project/list/1/' //项目分类下的文章
// 云函数入口函数
exports.main = async (event, context) => {
const app = new TcbRouter({ event });
app.router('type',async(ctx,next)=>{
return ctx.body = await rp(LINK + `json?cid=${event.id}`).then((res)=>{
return JSON.parse(res).data
})
})
return app.serve();
}