依据我的项目需要;写的一个内外循环的全选与反选;遇到问题:因为是分页,抉择全选,当上拉加载时;新加载的数据并没有被选中等问题,都被解决;如果有其余些问题;欢送提出。
留神:这只我我的项目中的页面;有些全局援用的例如提醒或是一些组件;应用的时候能够删除;并不影响次要性能;获取数据时;因为后盾传的是认为数组;但理论须要的二维数据;上面获取数据的接口曾经过解决;依据你们返回的数据格式可自行更改;咱们我的项目中有一键换色;牵扯到色彩变量的可删除;写成固定色彩
以下是具体代码:
Html:<template>
<view>
<view class="record" :style="colorStyle" v-if="visitList.length">
<view class="nav acea-row row-between-wrapper">
<view class="left"> 以后共 <text class="num">{{count}}</text> 件商品 </view>
<view class="font-num" v-if="!isShowChecked" @click="switchTap"> 治理 </view>
<view v-else @click="switchTap"> 勾销 </view>
</view>
<view class="list">
<checkbox-group @change="checkboxChange">
<view class="item" v-for="(item,index) in visitList" :key="index">
<view class="title">
<checkbox v-if="isShowChecked" :value="item.time" :checked="item.checked" />
<text>{{item.time}}</text>
</view>
<checkbox-group @change="(e)=>{picCheckbox(e,index)}">
<view class="picList acea-row row-middle">
<view class="picTxt" v-for="(j,jindex) in item.picList" :key="jindex" @click.stop="goDetails(j)">
<view class="pictrue">
<image :src="j.image"></image>
<checkbox v-if="isShowChecked" :value="(j.id).toString()" :checked="j.checked" class="checkbox" />
</view>
<view class="money">¥<text class="num">{{j.product_price}}</text></view>
</view>
</view>
</checkbox-group>
</view>
</checkbox-group>
<view class='loadingicon acea-row row-center-wrapper'>
<text class='loading iconfont icon-jiazai' :hidden='loading==false'></text>{{loadTitle}}
</view>
</view>
<view class="footer acea-row row-between-wrapper" v-if="isShowChecked">
<checkbox-group @change="checkboxAllChange">
<checkbox value="all" :checked="isAllSelect" />
<text class='checkAll'> 全选 </text>
</checkbox-group>
<view class="acea-row row-middle">
<view class="bnt acea-row row-center-wrapper" @click="collect"> 珍藏 </view>
<view class="bnt on acea-row row-center-wrapper" @click="del"> 删除 </view>
</view>
</view>
</view>
<view class='noCommodity' v-else-if="!visitList.length && page == 1">
<view class='pictrue'>
<image src='../../../static/images/noCollection.png'></image>
</view>
<recommend :hostProduct="hostProduct"></recommend>
</view>
<home v-if="navigation"></home>
</view>
</template>
Js:<script>
import {
getVisitList,
getProductHot,
deleteVisitList,
collectAdd
} from '@/api/store.js';
import {mapGetters} from "vuex";
import {toLogin} from '@/libs/login.js';
import recommend from '@/components/recommend';
// #ifdef MP
import authorize from '@/components/Authorize';
// #endif
import home from '@/components/home';
import colors from '@/mixins/color.js'
export default {
components: {
recommend,
// #ifdef MP
authorize,
// #endif
home
},
mixins: [colors],
data() {
return {
isShowChecked: 0,
count: 0,
times: [],
isAllSelect: false,
hostProduct: [],
loadTitle: '加载更多',
loading: false,
loadend: false,
visitList: [],
limit: 21,
page: 1,
isAuto: false, // 没有受权的不会主动受权
isShowAuth: false, // 是否暗藏受权
hotScroll: false,
hotPage: 1,
hotLimit: 10,
isItemAll: []};
},
computed: mapGetters(['isLogin']),
onLoad() {if (this.isLogin) {
this.loadend = false;
this.page = 1;
this.visitList = [];
this.get_user_visit_list();
this.get_host_product();} else {toLogin();
}
},
onShow() {this.times = [];
this.loadend = false;
this.page = 1;
this.visitList = [];
this.get_user_visit_list();},
methods: {goDetails(item){if(this.isShowChecked) return false;
uni.navigateTo({url: '/pages/goods_details/index?id=' + item.product_id})
},
switchTap(){this.isShowChecked = !this.isShowChecked;},
collect(){let ids = [];
this.visitList.forEach(item=>{
item.picList.forEach(j=>{if(j.checked){ids.push(j.id)
}
})
})
if(!ids.length){
return this.$util.Tips({title: '请抉择珍藏商品'});
}
collectAdd(ids).then(res=>{
return this.$util.Tips({title: res.msg});
})
},
del(){let ids = [];
this.visitList.forEach(item=>{
item.picList.forEach(j=>{if(j.checked){ids.push(j.id)
}
})
})
if(!ids.length){
return this.$util.Tips({title: '请抉择删除商品'});
}
deleteVisitList(ids).then(res=>{this.times = [];
this.loadend = false;
this.page = 1;
this.$set(this, 'visitList', []);
this.get_user_visit_list();
return this.$util.Tips({title: res.msg});
})
},
picCheckbox(event, index) {
let that = this,
picTime = event.detail.value;
that.visitList[index].picList.forEach(j => {if (picTime.indexOf(j.id + '') !== -1) {j.checked = true;} else {j.checked = false;}
})
if(that.visitList[index].picList.length == picTime.length){that.visitList[index].checked = true;
}else{that.visitList[index].checked = false;
}
let visitObj = [];
that.visitList.forEach(item=>{if(item.checked){visitObj.push(item.time)
}else{if(visitObj.indexOf(item.time) !== -1){visitObj.remove(item.time);
}
}
})
if(visitObj.length == that.visitList.length){that.isAllSelect = true;}else{that.isAllSelect = false;}
},
checkboxChange(event) {
let that = this,
timeList = event.detail.value;
that.isItemAll = timeList;
that.visitList.forEach((item, index) => {if (timeList.indexOf(item.time) !== -1) {item.checked = true;} else {item.checked = false;}
item.picList.forEach(j => {if (item.checked) {j.checked = true;} else {j.checked = false;}
})
})
if (timeList.length === that.visitList.length) {that.isAllSelect = true;} else {that.isAllSelect = false;}
},
forGoods(val) {
let that = this;
if (!that.visitList.length) return
that.visitList.forEach((item) => {if (val) {item.checked = true;} else {item.checked = false;}
item.picList.forEach(j => {if (val) {j.checked = true;} else {j.checked = false;}
})
})
},
checkboxAllChange(event) {
let value = event.detail.value;
if (value.length) {
this.isAllSelect = true;
this.forGoods(1)
} else {
this.isAllSelect = false;
this.forGoods(0)
}
},
// 受权敞开
authColse: function(e) {this.isShowAuth = e},
/**
* 获取珍藏产品
*/
get_user_visit_list: function() {
let that = this;
if (this.loading) return;
if (this.loadend) return;
that.loading = true;
that.loadTitle = "";
getVisitList({
page: that.page,
limit: that.limit
}).then(res => {
this.count = res.data.count;
for (let i = 0; i < res.data.time.length; i++) {if (this.times.indexOf(res.data.time[i]) == -1) {this.times.push(res.data.time[i])
this.visitList.push({time: res.data.time[i],
picList: []})
}
}
for (let x = 0; x < this.times.length; x++) {this.visitList[x].checked = this.isAllSelect ? true : false;
for (let j = 0; j < res.data.list.length; j++) {if (this.times[x] === res.data.list[j].time_key) {if (this.isAllSelect) {res.data.list[j].checked = true;
} else {res.data.list[j].checked = false;
}
this.visitList[x].picList.push(res.data.list[j])
}
}
}
let loadend = res.data.list.length < that.limit;
that.loadend = loadend;
that.loadTitle = loadend ? '没有更多内容啦~' : '加载更多';
that.page = that.page + 1;
that.loading = false;
}).catch(err => {
that.loading = false;
that.loadTitle = "加载更多";
});
},
/**
* 获取我的举荐
*/
get_host_product: function() {
let that = this;
if (that.hotScroll) return
getProductHot(
that.hotPage,
that.hotLimit,
).then(res => {
that.hotPage++
that.hotScroll = res.data.length < that.hotLimit
that.hostProduct = that.hostProduct.concat(res.data)
});
}
},
onReachBottom() {if (this.visitList.length) {this.get_user_visit_list();
} else {this.get_host_product();
}
}
}
</script>
Css:<style lang="scss">
page {background-color: #fff;}
.record .pictrue /deep/checkbox .uni-checkbox-input {background-color: rgba(0, 0, 0, 0.16);
}
.record .pictrue /deep/checkbox .wx-checkbox-input {background-color: rgba(0, 0, 0, 0.16);
}
.record {
.footer {
box-sizing: border-box;
padding: 0 30rpx;
width: 100%;
height: 96rpx;
box-shadow: 0px -4px 20px 0px rgba(0, 0, 0, 0.06);
background-color: #fff;
position: fixed;
bottom: 0;
z-index: 30;
padding-bottom: constant(safe-area-inset-bottom); /// 兼容 IOS<11.2/
padding-bottom: env(safe-area-inset-bottom); /// 兼容 IOS>11.2/
.bnt {
width: 160rpx;
height: 60rpx;
border-radius: 30rpx;
border: 1rpx solid #ccc;
color: #666666;
&.on {border: 1rpx solid var(--view-theme);
margin-left: 16rpx;
color: var(--view-theme);
}
}
}
.nav {
border-bottom: 1rpx solid #eee;
color: #999999;
font-size: 28rpx;
height: 74rpx;
padding: 0 30rpx;
.left {
color: #333;
.num {color: var(--view-theme);
margin: 0 10rpx;
}
}
}
.list {
padding-top: 32rpx;
padding-bottom: 96rpx;
.item {
.title {
padding: 0 30rpx;
margin-bottom: 34rpx;
font-size: 34rpx;
font-weight: 600;
}
.picList {
padding: 0 30rpx 0 12rpx;
.picTxt {
margin-left: 18rpx;
margin-bottom: 48rpx;
.pictrue {
width: 218rpx;
height: 218rpx;
border-radius: 10rpx;
position: relative;
image {
width: 100%;
height: 100%;
border-radius: 10rpx;
}
.checkbox {
position: absolute;
right: 10rpx;
top: 14rpx;
}
}
.money {
font-size: 24rpx;
color: var(--view-theme);
font-weight: 600;
margin-top: 15rpx;
.num {
font-size: 32rpx;
margin-left: 6rpx;
}
}
}
}
}
}
}
</style>
最初
如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star:http://github.crmeb.net/u/defu 不胜感激!
收费获取源码地址:http://www.crmeb.com
PHP 学习手册:https://doc.crmeb.com
技术交换论坛:https://q.crmeb.com