微信小程序最全Tab选项卡,你要的功能都在这里啦

最近在学习微信小程序,所以把一些重点给记录下来
废话不多说,先来一波效果图:
在这里插入图片描述
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();


}
发布了49 篇原创文章 · 获赞 72 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yuhang01/article/details/105014400