<template> <view class="containers" :style="viewColor"> <view class="header"> <view class="title"> <text :class="isActive == 0 ? 'on' : ''" @click="tabs(0)">已购</text> <text :class="isActive == 1 ? 'on' : ''" @click="tabs(1)">收藏</text> <text :class="isActive == 2 ? 'on' : ''" @click="tabs(2)">浏览</text> </view> <view class="search"> <text class="iconfont icon-xiazai5"></text> <input type="text" placeholder="请输入商品名称" v-model="searchVal" @input="setValue" confirm-type="search" @confirm="searchBut()" placeholder-class='placeholder'> </view> <view class="sub_title">{{isActive == 0 ? '已购宝贝' : isActive == 1 ?'收藏宝贝' : '浏览记录'}}</view> <text class="iconfont icon-guanbi5" @click="close"></text> </view> <view class="main"> <scroll-view scroll-y="true"> <block v-if="isActive == 0"> <view v-if="bought.length" @touchmove="onTouchmove" id="goods"> <view class="picTxt acea-row" v-for="(item, index) in bought" :key="index"> <view class="checkbox"> <text @click.stop="goodsCheck(item,index)" v-if="item.check" class="iconfont icon-xuanzhong1"></text> <text @click.stop="goodsCheck(item,index)" v-else :class="checkedArr.length >=5 ? 'disabled': ''" class="iconfont icon-weixuanzhong"></text> </view> <view class='pictrue'> <image :src='item.image'></image> </view> <view class='text'> <view class='line2 name'>{{item.store_name}}</view> <view class='money'>¥<text>{{item.price}}</text></view> </view> </view> </view> <view v-else class="empty"> <image src="/static/images/no_thing.png"></image> <text>暂无内容哦~</text> </view> </block> <block v-if="isActive == 1"> <view v-if="collect.length" id="collect" @touchmove="onTouchmove1"> <view class="picTxt acea-row" v-for="(item, index) in collect" :key="index"> <view class="checkbox"> <text @click.stop="goodsCheck(item,index)" v-if="item.check" class="iconfont icon-xuanzhong1"></text> <text @click.stop="goodsCheck(item,index)" v-else :class="checkedArr.length >=5 ? 'disabled': ''" class="iconfont icon-weixuanzhong"></text> </view> <view class='pictrue'> <image :src='item.image'></image> </view> <view class='text'> <view class='line2 name'>{{item.store_name}}</view> <view class='money'>¥<text>{{item.price}}</text></view> </view> </view> </view> <view v-else class="empty"> <image src="/static/images/no_thing.png"></image> <text>暂无内容哦~</text> </view> </block> <block v-if="isActive == 2"> <view v-if="browse.length" id="browse" @touchmove="onTouchmove2"> <view class="picTxt acea-row" v-for="(item, index) in browse" :key="index"> <view class="checkbox"> <text @click.stop="goodsCheck(item,index)" v-if="item.check" class="iconfont icon-xuanzhong1"></text> <text @click.stop="goodsCheck(item,index)" v-else :class="checkedArr.length >=5 ? 'disabled': ''" class="iconfont icon-weixuanzhong"></text> </view> <view class='pictrue'> <image :src='item.image'></image> </view> <view class='text'> <view class='line2 name'>{{item.store_name}}</view> <view class='money'>¥<text>{{item.price}}</text></view> </view> </view> </view> <view v-else class="empty"> <image src="/static/images/no_thing.png"></image> <text>暂无内容哦~</text> </view> </block> </scroll-view> <view class="foot_bar"> <button class="confirm_btn" @click="submit">确定({{checkedArr.length}})</button> </view> </view> </view> </template> <script> import Loading from '@/components/Loading/index.vue'; import { boughtLstApi, collectLstApi, browseLstApi } from "@/api/community"; import { mapGetters } from "vuex"; export default { props: { checkedObj: { type: Array, default: [] } }, computed: mapGetters(['viewColor']), components: { Loading }, data() { return { isActive: 0, loadedb: false, loadingb: false, loadedc: false, loadingc: false, loadeds: false, loadings: false, whereb: { page: 1, limit: 10, keyword: '', }, wherec: { page: 1, limit: 10, keyword: '', }, wheres: { page: 1, limit: 10, keyword: '', }, searchVal: "", checked: [], list: [], collect: [], bought: [], browse: [], checkedArr: [], }; }, watch: { checkedObj: { handler(n) { // this.checkedArr = n }, deep: true } }, mounted() { this.checkedArr = this.checkedObj this.getBounht(); this.getCollect(); this.getBrowse(); }, methods: { // 点击关闭按钮 close() { this.$emit('close'); }, tabs(index) { this.isActive = index this.$set(this.whereb, 'keyword', ''); this.$set(this.wherec, 'keyword', ''); this.$set(this.wheres, 'keyword', ''); this.searchVal = '' this.searchBut() }, onTouchmove(e) { if (this.loadendb) return; if (this.loadingb) return; const query = uni.createSelectorQuery().in(this); query.select('#goods').boundingClientRect(data => { if (data.bottom < 1500 && data.top < 0) { this.getBounht(); } }).exec(); // 模拟触底刷新 }, onTouchmove1(e) { if (this.loadendc) return; if (this.loadingc) return; const query = uni.createSelectorQuery().in(this); query.select('#collect').boundingClientRect(data => { if (data.bottom < 1500 && data.top < 0) { this.getCollect(); } }).exec(); // 模拟触底刷新 }, onTouchmove2(e) { if (this.loadends) return; if (this.loadings) return; const query = uni.createSelectorQuery().in(this); query.select('#browse').boundingClientRect(data => { if (data.bottom < 1500 && data.top < 0) { this.getBrowse(); } }).exec(); // 模拟触底刷新 }, setValue: function(event) { this.$set(this.whereb, 'keyword', event.detail.value); this.$set(this.wherec, 'keyword', event.detail.value); this.$set(this.wheres, 'keyword', event.detail.value); }, searchBut() { this.loadingb = this.loadingc = this.loadings = this.loadedb = this.loadedc = this.loadeds = false this.whereb.page = this.wherec.page = this.wheres.page = 1 this.bought = this.collect = this.browse = [] this.isActive == 0 ? this.getBounht() : this.isActive == 1 ? this.getCollect() : this.getBrowse() }, getBounht() { var that = this; if (that.loadingb || that.loadedb) return; that.loadingb = true; boughtLstApi(that.whereb).then( res => { that.loadingb = false; that.loadedb = res.data.list.length < that.whereb.limit; that.bought.push.apply(that.bought, res.data.list); that.whereb.page = that.whereb.page + 1; that.getInitchecked(that.bought); }, error => { that.$util.Tips({ title: error.msg }) } ); }, getCollect() { var that = this; if (that.loadingc || that.loadedc) return; that.loadingc = true; collectLstApi(that.wherec).then( res => { that.loadingc = false; that.loadedc = res.data.list.length < that.wherec.limit; that.collect.push.apply(that.collect, res.data.list); that.wherec.page = that.wherec.page + 1; that.getInitchecked(that.collect); }, error => { that.$util.Tips({ title: error.msg }) } ); }, getBrowse() { var that = this; if (that.loadings || that.loadeds) return; that.loadings = true; browseLstApi(that.wheres).then( res => { that.loadings = false; that.loadeds = res.data.list.length < that.wheres.limit; that.browse.push.apply(that.browse, res.data.list); that.wheres.page = that.wheres.page + 1; that.getInitchecked(that.browse); }, error => { that.$util.Tips({ title: error.msg }) } ); }, /*获取初始化选中的数据*/ getInitchecked(arr) { let that = this; arr.forEach((item, index) => { that.$set(item, 'check', false); that.checkedArr.forEach((val, i) => { if ((item.spu_id == (val.spu && val.spu.spu_id)) || (item.spu_id == val.spu_id)) { that.$set(item, 'check', true); } }) }) }, /*已选中的商品打钩*/ getCheckedGoods() { this.checked = [] this.checkedArr.forEach((item, index) => { this.check.push(item) }) }, /*点击选中与否*/ goodsCheck(item, index) { this.$set(item, 'check', !item.check); if (item.check) { this.checkedArr.push(item) } else { this.checkedArr.splice(this.checkedArr.findIndex(itemn => ((itemn.spu_id == item.spu_id) || (item.spu_id == ( itemn.spu && itemn.spu.spu_id)))), 1) } }, /*确定提交*/ submit() { this.$emit('getProduct', this.checkedArr); }, } } </script> <style lang="scss" scoped> .containers { background: #ffffff; border-radius: 16rpx 16rpx 0 0; padding: 40rpx 0; position: relative; .header { position: relative; padding: 0 30rpx; .title { width: 100%; text-align: center; text { position: relative; margin: 0 50rpx; color: #999999; font-size: 30rpx; &.on { color: #333333; font-weight: bold; font-size: 34rpx; &::after { content: ""; display: inline-block; width: 40rpx; height: 5rpx; background: var(--view-theme); position: absolute; bottom: -10rpx; left: 10rpx; } } } } .search { margin-top: 44rpx; background: #F5F5F5; border-radius: 30rpx; padding: 12rpx 30rpx 12rpx 66rpx; position: relative; .iconfont { font-size: 24rpx; color: #939393; position: absolute; top: 20rpx; left: 30rpx; } .placeholder { color: #999999; font-size: 26rpx; } } .sub_title { color: #282828; font-size: 26rpx; margin-top: 30rpx; } .iconfont { color: #8A8A8A; font-size: 28rpx; position: absolute; top: 0; right: 30rpx; } } scroll-view { height: 650rpx; } .main { height: 650rpx; margin: 40rpx 0 80rpx; padding: 0 30rpx; } } .picTxt { width: 100%; padding: 25rpx 0; position: relative; align-items: center; justify-content: space-between; margin-bottom: 10rpx; .checkbox { margin-right: 30rpx; .iconfont { font-size: 38rpx; color: #CCCCCC; } .icon-xuanzhong1 { color: var(--view-theme); } .disabled { pointer-events: none; cursor: default; opacity: 0.3; } } .pictrue { width: 160rpx; height: 160rpx; image { width: 100%; height: 100%; border-radius: 8rpx; } } .text { width: 430rpx; margin-left: 30rpx; font-size: 28rpx; color: #282828; position: relative; height: 160rpx; .name { color: #282828; font-size: 28rpx; } .money { position: absolute; bottom: 0; left: 0; color: var(--view-priceColor); font-size: 22rpx; font-weight: bold; text { font-size: 26rpx; } } } } .foot_bar { width: 100%; position: fixed; // bottom: 54px; left: 0; padding: 20rpx 0; z-index: 5; .confirm_btn { width: 710rpx; height: 86rpx; line-height: 86rpx; color: #ffffff; text-align: center; font-size: 32rpx; background: var(--view-theme); border-radius: 43rpx; margin: 0 auto; } } .empty { margin: 130rpx 0 150rpx; text-align: center; image, uni-image { display: inline-block; width: 414rpx; height: 305rpx; } text { display: block; color: #999999; font-size: 26rpx; } } </style>