<template> <view class="container" :style="appThemeStyle"> <mescroll-body ref="mescrollRef" :sticky="true" @init="mescrollInit" :down="{ native: true }" @down="downCallback" :up="upOption" @up="upCallback"> <!-- tab栏 --> <!-- <u-tabs :list="tabs" :is-scroll="false" :current="curTab" :active-color="appTheme.mainBg" :duration="0.2" @change="onChangeTab" /> --> <view class="container"> <view class="classify-list"> <view class="list" v-for="(item,index) in tabs" :class="{'action':curTab==index}" @click="onChangeTab(index)" :key="index"> <text>{{item.name}}</text> <text class="line" v-show="curTab==index"></text> </view> </view> </view> <!-- 退款/售后单 --> <view class="widget-list"> <view class="widget-detail" v-if="list.data.length>0" v-for="(item, index) in list.data" :key="index"> <view class="row-block dis-flex flex-y-center"> <view class="flex-box">{{ item.create_time }}</view> <view class="flex-box t-r"> <text class="col-m">{{ item.state_text }}</text> </view> </view> <view class="detail-goods row-block dis-flex" @click.stop="handleTargetDetail(item.order_refund_id)"> <view class="goods-image"> <image class="image" :src="item.orderGoods.goods_image" mode="aspectFit"></image> </view> <view class="goods-right flex-box"> <view class="goods-name"> <text class="twoline-hide">{{ item.orderGoods.goods_name }}</text> </view> <view class="goods-props clearfix"> <view class="goods-props-item" v-for="(props, idx) in item.orderGoods.goods_props" :key="idx"> <text>{{ props.value.name }}</text> </view> </view> <view class="goods-num t-r"> <text class="f-26 col-8">×{{ item.orderGoods.total_num }}</text> </view> </view> </view> <view class="detail-order row-block"> <view class="item dis-flex flex-x-end flex-y-center"> <text class="">付款金额:</text> <text class="col-m">¥{{ item.orderGoods.total_pay_price }}</text> </view> </view> <view class="detail-operate row-block dis-flex flex-x-end flex-y-center"> <view class="detail-btn btn-detail" @click.stop="handleTargetDetail(item.order_refund_id)">查看详情 </view> </view> </view> <u-empty text="暂无数据显示哦~" v-else mode="list"></u-empty> </view> </mescroll-body> </view> </template> <script> import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins' import { getEmptyPaginateObj, getMoreListData } from '@/core/app' import * as RefundApi from '@/api/refund' // 每页记录数量 const pageSize = 15 // tab栏数据 const tabs = [{ name: '全部', value: -1 }, { name: '待处理', value: 0 }] export default { mixins: [MescrollMixin], data() { return { // 订单列表数据 list: getEmptyPaginateObj(), // tabs栏数据 tabs, // 当前标签索引 curTab: 0, // 上拉加载配置 upOption: { // 首次自动执行 auto: true, // 每页数据的数量; 默认10 page: { size: pageSize }, // 数量要大于2条才显示无更多数据 noMoreSize: 2, // 空布局 empty: { tip: '亲,暂无售后单记录' } }, // 控制首次触发onShow事件时不刷新列表 canReset: false, } }, onUnload() { uni.switchTab({ url: '/pages/user/index' // targetTab 为目标 tab 页的路径 }) }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { }, /** * 生命周期函数--监听页面显示 */ onShow() { this.canReset && this.onRefreshList() this.canReset = true }, methods: { /** * 上拉加载的回调 (页面初始化时也会执行一次) * 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 * @param {Object} page */ upCallback(page) { const app = this // 设置列表数据 app.getRefundList(page.num) .then(list => { const curPageLen = list.data.length const totalSize = list.data.total app.mescroll.endBySize(curPageLen, totalSize) }) .catch(() => app.mescroll.endErr()) }, // 获取退款/售后单列表 getRefundList(pageNo = 1) { const app = this return new Promise((resolve, reject) => { RefundApi.list({ state: app.getTabValue(), page: pageNo }, { load: false }) .then(result => { // 合并新数据 const newList = result.data.list app.list.data = getMoreListData(newList, app.list, pageNo) resolve(newList) }) }) }, // 切换标签项 onChangeTab(index) { console.log(index) const app = this // 设置当前选中的标签 app.curTab = index // 刷新售后单列表 app.onRefreshList() }, // 刷新订单列表 onRefreshList() { this.list = getEmptyPaginateObj() setTimeout(() => { this.mescroll.resetUpScroll() }, 120) }, // 获取当前标签项的值 getTabValue() { return this.tabs[this.curTab].value }, // 跳转到售后单详情页 handleTargetDetail(orderRefundId) { this.$navTo('pages/refund/detail', { orderRefundId }) }, } } </script> <style lang="scss" scoped> ::v-deep .u-empty { padding: 100rpx 0; } .classify-list { white-space: nowrap; width: 100%; height: 100rpx; overflow-x: auto; overflow-y: hidden; .list { position: relative; display: inline-block; width: 50%; height: 100%; line-height: 100rpx; text-align: center; text { font-size: 28rpx; color: #3B3B3B; } .line { position: absolute; left: 50%; bottom: 10rpx; // width: 60%; // height: 8rpx; background: linear-gradient(to right, #f8f893, #fe9d00); // border-radius: 10rpx; transform: translate(-50%, 0); width: 60upx; height: 8upx; background: #FF6257; border-radius: 29px 29px 29px 29px; opacity: 1; } } .action { text { font-size: 32rpx; opacity: 1; } } } .widget-detail { box-sizing: border-box; background: #fff; margin: 20rpx 20rpx 0 20rpx; border-radius: 24rpx; .row-block { padding: 0 20rpx; min-height: 70rpx; } .detail-goods { padding: 20rpx; .goods-image { margin-right: 20rpx; .image { display: block; width: 200rpx; height: 200rpx; } } .goods-right { padding: 15rpx 0; } .goods-name { margin-bottom: 10rpx; } .goods-props { margin-top: 14rpx; height: 40rpx; color: #ababab; font-size: 24rpx; overflow: hidden; .goods-props-item { display: inline-block; margin-right: 14rpx; padding: 4rpx 16rpx; border-radius: 12rpx; background-color: #F5F5F5; width: auto; } } } .detail-operate { padding-bottom: 20rpx; .detail-btn { border-radius: 4px; border: 1rpx solid #ccc; padding: 8rpx 20rpx; font-size: 28rpx; color: #555; margin-left: 10rpx; } } .detail-order { padding: 10rpx 20rpx; font-size: 28rpx; height: 50rpx; display: flex; align-items: center; .item { margin-bottom: 10rpx; &:last-child { margin-bottom: 0; } } } } </style>