zoukankan      html  css  js  c++  java
  • 小程序的tab切换和上拉加载下拉刷新swiper swiper-item scroll-view

    <view>
      <!-- 搜索框 -->
        <view class="inp-box">
            <van-search value="{{ searchVal }}" placeholder="请输入名称" use-action-slot bind:change="searchInp">
                <view style="color: #ff6700;" slot="action" bind:tap="searchClick">搜索</view>
            </van-search>
        </view>
      <!-- tab切换 -->
        <view class="node-tab">
            <view class="tab-item {{currentTab == 0 ? 'active' : ''}}" data-current="0" bindtap="changeNav">全部</view>
            <view class="tab-item {{currentTab == 1 ? 'active' : ''}}" data-current="1" bindtap="changeNav">我参与</view>
            <view class="tab-item {{currentTab == 2 ? 'active' : ''}}" data-current="2" bindtap="changeNav">我发布</view>
        </view>
        <swiper class="tab-content" current="{{currentTab}}" duration="300" bindchange="changeTab" style="height:{{winHeight}}rpx">
            <!-- 全部 -->
            <swiper-item>
                <scroll-view scroll-y="true" class="new-list-box" bindscrolltolower="allLoadMore" scroll-top='{{scrollTop}}' scroll-with-animation refresher-enabled="{{true}}" refresher-threshold="{{80}}" refresher-default-style="white" refresher-background="#ff6700" refresher-triggered="{{triggered}}" bindrefresherrefresh="onAllRefresh">
                    <block wx:if="{{allTabList.length > 0}}">
                        <view class="new-list-item" wx:for="{{allTabList}}" wx:key="index">
                            <view class="item-content" data-posid="{{item.id}}" catchtap="goDetails">
                                <view class="content-left">
                                    <view class="dis-flex-between">
                                        <view class="content-title">{{item.name}}</view>
                                        <view style="min- 130rpx;">
                                            <view class="list-tag-item">{{item.status}}</view>
                                        </view>
                                    </view>
                                    <view class="content-des elli_psis">{{item.remark}}</view>
                                </view>
                            </view>
                            <view class="item-tag dis-flex-between">
                                <view class="content-deadline">发起人:{{item.providerName}}</view>
                                <view class="content-deadline">总金额:{{item.amount}}</view>
                                <view class="content-deadline">共{{item.count || 0}}人参与</view>
                                <!-- participationState; //0 为不可参与,隐藏按钮,1为可以参与,2为过期或者未到期置灰 -->
                                <view wx:if="{{item.participationState === 1}}" class="content-right" data-posid="{{item.id}}" catchtap="joinTask">参与任务</view>
                                <view wx:if="{{item.participationState === 2}}" class="content-right content-right-is-no">参与任务</view>
                            </view>
                        </view>
                    </block>
                    <view wx:if="{{allTabList.length >= recordCount}}" class="no-data-txt" bindtap="pScrollTo">没有更多数据了</view>
                </scroll-view>
            </swiper-item>
            <!-- 我参与 -->
            <swiper-item>
                <scroll-view scroll-y="true" class="new-list-box" bindscrolltolower="allLoadMore" scroll-top='{{scrollTop}}' scroll-with-animation refresher-enabled="{{true}}" refresher-threshold="{{80}}" refresher-default-style="white" refresher-background="#ff6700" refresher-triggered="{{triggered}}" bindrefresherrefresh="onAllRefresh">
                    <block wx:if="{{myAttendList.length > 0}}">
                        <view class="new-list-item" wx:for="{{myAttendList}}" wx:key="index">
                            <view class="item-content" data-posid="{{item.id}}" catchtap="toNodeDetails">
                                <view class="content-left">
                                    <view class="dis-flex-between">
                                        <view class="content-title">{{item.name}}</view>
                                        <view style="min- 130rpx;">
                                            <view class="list-tag-item">{{item.status}}</view>
                                        </view>
                                    </view>
                                    <view class="content-des elli_psis">{{item.remark}}</view>
                                </view>
                            </view>
                            <view class="item-tag dis-flex-between">
                                <view class="content-deadline">发起人:{{item.providerName}}</view>
                                <view class="content-deadline">总金额:{{item.amount}}</view>
                                <view class="content-deadline">共{{item.count || 0}}人参与</view>
                            </view>
                        </view>
                    </block>
                    <view wx:if="{{myAttendList.length >= recordCount}}" class="no-data-txt" bindtap="pScrollTo">没有更多数据了</view>
                </scroll-view>
            </swiper-item>
            <!-- 我发布 -->
            <swiper-item>
                <scroll-view scroll-y="true" class="new-list-box" bindscrolltolower="allLoadMore" scroll-top='{{scrollTop}}' scroll-with-animation refresher-enabled="{{true}}" refresher-threshold="{{80}}" refresher-default-style="white" refresher-background="#ff6700" refresher-triggered="{{triggered}}" bindrefresherrefresh="onAllRefresh">
                    <block wx:if="{{myPublishList.length > 0}}">
                        <view class="new-list-item" wx:for="{{myPublishList}}" wx:key="index">
                            <view class="item-content" data-posid="{{item.id}}" catchtap="toNodeDetails">
                                <view class="content-left">
                                    <view class="dis-flex-between">
                                        <view class="content-title">{{item.name}}</view>
                                        <view style="min- 130rpx;">
                                            <view class="list-tag-item">{{item.status}}</view>
                                        </view>
                                    </view>
                                    <view class="content-des elli_psis">{{item.remark}}</view>
                                </view>
                            </view>
                            <view class="item-tag dis-flex-between">
                                <view class="content-deadline">发起人:{{item.providerName}}</view>
                                <view class="content-deadline">总金额:{{item.amount}}</view>
                                <view class="content-deadline">共{{item.count || 0}}人参与</view>
                                <view wx:if="{{item.participationState === 1}}" class="content-right" data-posid="{{item.id}}" catchtap="joinTask">参与任务</view>
                                <view wx:if="{{item.participationState === 2}}" class="content-right content-right-is-no">参与任务</view>
                            </view>
                        </view>
                    </block>
                    <view wx:if="{{myPublishList.length >= recordCount}}" class="no-data-txt" bindtap="pScrollTo">没有更多数据了</view>
                </scroll-view>
            </swiper-item>
        </swiper>
    
    </view>
    let app = getApp();
    let startPoint;
    let tabName = ['allTabList', 'myAttendList', 'myPublishList']; // 列表名称
    Page({
      onShow() {
        this.getTabBar().init();
      },
      data: {
        triggered: false,
        searchVal: '', // 搜索
        winHeight: "",// 窗口高度
        currentTab: 0, // 当前所在滑块的 index
        allTabList:[], // 全部
        myAttendList:[], // 我参与
        myPublishList:[], // 我发布
        scrollTop: 0, // 设置竖向滚动条位置
        windowHeight: '',
        windowWidth: '',
        recordCount: 0, //列表总条数
        pageNo: 1 //页码
      },
      onLoad: function(options) {
        // 计算drawer高度,占满window
        let that = this;
        //  高度自适应
        wx.getSystemInfo({
          success: function (res) {
            let clientHeight = res.windowHeight,
              clientWidth = res.windowWidth,
              rpxR = 750 / clientWidth;
            let calc = (clientHeight - 50 - 54) * rpxR - 130;
            // console.log(calc)
            that.setData({
              windowHeight:  res.windowHeight,
              windowWidth:  res.windowWidth,
              winHeight: calc
            });
          }
        });
        this._requestPageList(true);
      },
      // 参数
      _requestPageList(isLoadMore = false, callback) {
        // isLoadMore 为true是上拉加载,不需要置空数组
        if(!isLoadMore){
          this.setData({
            allTabList:[], // 全部
            myAttendList:[], // 我参与
            myPublishList:[], // 我发布
            pageNo: 1
          });
        }
        let opt = {
          name: this.data.searchVal,
          number: "", //任务编号
          searchType: this.data.currentTab == 0 ? null : this.data.currentTab * 2,  //  null 全部 2我参与的 4我发布的
        }
        this._requestPageListCom("virtualTaskList", opt, callback);
      },
      // 列表接口
      _requestPageListCom(url, params, callback) {
        let opt = Object.assign({}, params, {
          pageData: {
            pageNo: this.data.pageNo,
            pageSize: 10
          },
        })
        app.$request.post(app.$config[url], opt).then(res => {
          if (res.returnResult === 200) {
            let oldList = [];
            if(this.data.currentTab == 0){
              oldList = this.data.allTabList;
            } else if(this.data.currentTab == 1){
              oldList = this.data.myAttendList;
            } else if(this.data.currentTab == 2){
              oldList = this.data.myPublishList;
            }
            const newGoodsList = res.returnData.data
            const allData = [...oldList, ...newGoodsList]
            console.log(allData,'allData')
            let newData = {}; // 新变更数据
            for(let i in allData){
              newData[`${tabName[this.data.currentTab]}[${i}]`] = allData[i];
            }
            this.setData(newData); // 赋值列表数据
            console.log(newData,'newData')
            this.setData({
              recordCount: res.returnData.recordCount
            })
            if(callback && typeof callback === 'function'){
              callback()
            }
          }
        })
      },
      // 输入搜索 event.detail 为当前输入的值
      searchInp(e) {
        this.setData({
          searchVal: e.detail
        })
      },
      // 搜索
      searchClick(){
        this._requestPageList();
      },
      // tip: 如果在 bindchange 的事件回调函数中使用 setData 改变 current 值,则有可能导致 setData 被不停地调用,
      // 因而通常情况下请在改变 current 值前检测 source 字段来判断是否是由于用户触摸引起 event.detail = {current, source}
      // 滚动切换标签样式
      changeTab: function (e) {
        console.log(e,e.detail.current,'e') // 0 1 2 
        this.setData({
          currentTab: e.detail.current
        });
        this._requestPageList();
      },
      // 点击标题切换当前页时改变样式
      changeNav: function (e) {
        let currentIndex = e.target.dataset.current;
        if (this.data.currentTaB == currentIndex) {
          return false;
        } else {
          this.setData({
            currentTab: currentIndex
          })
        }
      },
      // 参与任务
      joinTask:function(events){
        let opt = {
          id: events.currentTarget.dataset.posid
        }
        app.$request.post(app.$config.virtualTaskCheckIn, opt).then(res => {
          if (res.returnResult === 200) {
            wx.showToast({
              title: '参与成功',
              icon: 'none',
              duration: 3000
            })
            // this._requestPageList();
          }
        })
      },
      // 详情
      goDetails:function(events){
        let meetId = events.currentTarget.dataset.posid;
        wx.navigateTo({
          url: `../../taskDes/taskDes?id=${meetId}`
        })
      },
      // 上拉加载  滚动到底部/右边时触发
      allLoadMore(e){
        let _self = this;
        if (this._allLoadMore || _self.data[tabName[this.data.currentTab]].length >= _self.data.recordCount || _self.data.recordCount === 0) return
        this._allLoadMore = true;
        this.setData({
          pageNo: ++_self.data.pageNo
        });
        this._requestPageList(true, () => {
          _self._allLoadMore = false;
        });
      },
      // 下拉刷新接口
      onAllRefresh() {
        if (this._allFreshing) return
        this._allFreshing = true
        this._requestPageList(false, () => {
          // 当处理完数据刷新后,wx.stopPullDownRefresh可以停止当前页面的下拉刷新
          this.setData({
            triggered: false
          })
          this._allFreshing = false
        });
      },
      pScrollTo(){
        // 返回顶部
        this.setData({
          scrollTop:0
        });
      }
    })
    {
      "navigationBarBackgroundColor": "#ff6700",
      "navigationBarTextStyle": "white",
      "backgroundColor": "#ff6700",
      "backgroundTextStyle":"light",
      "navigationBarTitleText": "任务",
      "usingComponents": {
        "van-popup": "@vant/weapp/popup/index",
        "van-button": "@vant/weapp/button/index",
        "van-search": "@vant/weapp/search/index"
      }
    }
    page{
      background-color: #f3f6fb;
    }
    /* .inp-box{
      padding:10rpx 20rpx 10rpx;
      box-sizing: border-box;
      position:relative;
      background-color: #ffffff;
    } */
    .node-tab{
      background-color: #ffffff;
      height:88rpx;
      font-size:28rpx;
      line-height: 88rpx;
      display: flex;
    }
    .node-tab .tab-item{
      flex:1;
      text-align: center;
      color: #666;
    }
    .node-tab .active{
      color: #ff6700;
      position: relative;
    }
    .node-tab .active::before{
      position:absolute;
      content: " ";
      bottom:10rpx;
      left: 50%;
      transform: translateX(-50%);
      width: 30rpx;
        height: 6rpx;
        background-color: #ff6700;
        border-radius: 3rpx;
    }
    .tab-content{
      margin-top:20rpx;
    }
    
    .no-data{
      text-align: center;
      box-sizing: border-box;
      padding-top:230rpx;
      color: #999999;
    }
    
    /* 更新样式 */
    .node-tab {
      position: relative;
    }
    .new-list-box {
      height: 100%;
    } 
    .new-list-item {
      box-sizing:border-box;
      /* height:260rpx; */
      position: relative;
      background-color: #fff;
      margin-bottom: 20rpx;
      padding: 20rpx 30rpx 0;
    }
    
    .new-list-item:last-child {
      margin-bottom: 0;
    }
    
    .new-list-item view {
      box-sizing: border-box;
    }
    
    .item-content {
      display: flex;
      justify-content: space-between;
      border-bottom: 1rpx solid #eaeaea;
      align-items: center;
      position: relative;
    }
    
    .content-left {
      width: 100%;
      padding-bottom: 30rpx;
    }
    
    .content-left .content-title {
      font-size: 32rpx;
      color: #333;
    }
    
    .content-left .content-des {
      font-size: 28rpx;
      color: #666;
      margin-top: 10rpx;
    }
    
    .content-deadline {
      font-size: 24rpx;
      color: #999;
    }
    
    .content-right {
      width: 130rpx;
      flex-shrink: 0;
      height: 48rpx;
      border: 1rpx solid #ff6700;
      color: #ff6700;
      border-radius: 8rpx;
      font-size: 24rpx;
      text-align: center;
      line-height: 48rpx;
    }
    
    .content-right-is-no {
      opacity: 0.8;
      border-color: #999;
      color: #999;
    }
    
    .item-tag {
      padding: 10rpx 0 10rpx;
      font-size: 24rpx;
    }
    
    .list-tag-item {
      padding: 5rpx 12rpx;
      text-align: center;
      background-color: #e5efff;
      border-radius: 4rpx;
      margin-right: 10rpx;
      color: #ff6700;
      border-radius: 8rpx;
      margin-bottom: 10rpx;
      font-size: 24rpx;
    }
    
    .content-right.bg-green {
      background-color:#e6ffca;
      border-color: #e6ffca;
      color:#ff6700;
      margin-right: 20rpx;
    }
    
    .exchange-btn{
      text-align: center;
      margin: 10px 0 0;
    }
    
    .dialog-box{
      font-size: 28rpx;
      padding: 30rpx 30rpx 0;
    }
    
    .textarea_css{
      margin-top: 15rpx;
      color: #333;
      height: 160px;
      border: 1px solid #999;
      border-radius: 6rpx;
      padding: 20rpx;
    }
    /**app.wxss**/
    .container {
      height: 100%;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: space-between;
      padding: 200rpx 0;
      box-sizing: border-box;
    } 
    
    .elli_psis{
      overflow:hidden;
      text-overflow:ellipsis;
      white-space:nowrap;
    }
    
    .dis-flex-between{
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    
    .dis-flex-center{
      display: flex;
      justify-content: center;
      align-items: center;
    }
    
    .dis-flex-start{
      display: flex;
      justify-content: center;
    }
    
    .dis-flex-items{
      display: flex;
      align-items: center;
    }
    
    .dis-flex-column{
      display: flex;
      flex-direction:column;
      justify-content: center;
    }
    
    .no-data-txt{
      color: #ff6700;
      font-size: 12px;
      text-align: center;
      margin: 10px 0;
    }
  • 相关阅读:
    nodeName,nodeValue未知 xml 入库方案 The ElementTree iterparse Function
    如何:执行大型 XML 文档的流式转换 大XML文件解析入库的一个方法
    python curl_get-pip.py Installing with get-pip.py
    iptables List the rules in a chain or all chains
    goroutine 分析 协程的调度和执行顺序 并发写 run in the same address space 内存地址 闭包 存在两种并发 确定性 非确定性的 Go 的协程和通道理所当然的支持确定性的并发方式(
    数据库业界
    The MEAN stack is a modern replacement for the LAMP (Linux, Apache, MySQL, PHP/Python) stack
    Using Groovy To Import XML Into MongoDB
    虚拟机网络模式 桥接 网桥 交换机
    防止有内存泄漏并尽可能快地释放所有内存是内存管理的重要组成部分 长时间运行进程的内存泄漏
  • 原文地址:https://www.cnblogs.com/lhl66/p/13231620.html
Copyright © 2011-2022 走看看