微信小程序最全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();


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章