<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-width: 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-width: 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-width: 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;
}
内容原创,转载请注明出处!!!!谢谢合作!