glhcp/pc/components/coupons-list.vue

244 lines
7.9 KiB
Vue

<template>
<div class="coupons-list flex">
<template v-for="(item, index) in couponsList">
<div v-show="item.isShow" class="item" :key="index" @click.capture="onHandle(item.id, item.is_get)">
<div :class="[
'info white',
{ gray: type == 2 || type == 1 || item.is_get },
]">
<div class="info-hd flex">
<div>
<price-formate :price="item.money" :first-size="38" :second-size="38" />
</div>
<div class="m-l-8 flex1">
<div class="line1">{{ item.name }}</div>
<div class="xs line1">{{ item.condition_type_desc }}</div>
</div>
</div>
<div class="info-time xs">{{ item.user_time_desc }}</div>
</div>
<div class="tips flex row-between" @click.stop="onShowTips(index)">
<div class="muted xs">{{ item.use_scene_desc }}</div>
<div v-if="item.use_goods_type != 1 && (type == 1 || type == 2 || type == 0)">
<i :class="
showTips[index] ? 'el-icon-arrow-up' : 'el-icon-arrow-down'
"></i>
<div class="tips-con xs lighter" v-if="item.use_scene_desc != '全场通用' && showTips[index]">
{{ item.use_goods_desc }}
</div>
</div>
<div class="primary sm" v-if="type == 3 && !item.is_get">
立即领取
</div>
</div>
<img v-if="item.is_get" class="receice" src="~/static/images/coupons_img_receive.png" alt="" />
<div class="choose xs" v-if="type == 4 && id == item.id">已选择</div>
</div>
</template>
<div class="more muted" v-if="showMore && list.length > 4" @click="changeShow">
{{ isMore ? '收起' : '更多' }}
<i :class="isMore ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
</div>
</div>
</template>
<script>
import {
mapActions
} from "vuex";
export default {
props: {
list: {
type: Array,
default: () => [],
},
type: {
type: Number,
},
showMore: {
type: Boolean,
default: false,
},
},
data() {
return {
showTips: [],
couponsList: [],
id: "",
isMore: false,
};
},
methods: {
...mapActions(["getPublicData"]),
onHandle(id, isGet) {
this.id = id;
const {
type
} = this;
switch (type) {
case 0:
// 可使用
break;
case 1:
break;
// 使用
case 2:
break;
//不可以用
case 3:
// 领券
if(!isGet) {
this.getCoupon();
}
break;
case 4:
//使用
if (this.selectId == id) {
this.id = "";
}
this.$emit("use", this.id);
this.selectId = this.id;
break;
}
},
async getCoupon() {
const {
msg,
code
} = await this.$post("coupon/getCoupon", {
coupon_id: this.id,
});
if (code == 1) {
this.$message({
message: msg,
type: "success",
});
this.getPublicData();
this.$emit("reflash");
}
},
onShowTips(index) {
const {
showTips
} = this;
this.showTips[index] = showTips[index] ? 0 : 1;
// 拷贝数组
this.showTips = Object.assign([], this.showTips);
},
changeShow() {
this.isMore = !this.isMore;
this.list.forEach((item, index) => {
item.isShow = true;
if (!this.isMore && index >= 4) {
item.isShow = false;
}
});
this.couponsList = [...this.list];
},
},
watch: {
list: {
handler: function(val) {
if (val.length) {
// 默认选中第一张
if (this.type == 4) {
this.id = val[0].id;
this.selectId = this.id;
this.$emit("use", this.id);
}
}
let arr = val.map((item) => {
return 0;
});
this.showTips = arr;
this.list.forEach((item, index) => {
item.isShow = true;
if (this.showMore) {
if (index >= 4) {
item.isShow = false;
}
}
});
this.couponsList = this.list;
},
immediate: true,
deep: true,
},
},
};
</script>
<style lang="scss" scoped>
.coupons-list {
padding: 0 18px;
flex-wrap: wrap;
position: relative;
.item {
margin-bottom: 20px;
margin-right: 16px;
position: relative;
cursor: pointer;
.info {
padding: 0 10px;
background: url("~/static/images/bg_coupon_s.png") no-repeat;
width: 240px;
height: 80px;
background-size: 100%;
&.gray {
background-image: url("~/static/images/bg_coupon.png");
}
.info-hd {
overflow: hidden;
}
}
.tips {
position: relative;
background-color: #f2f2f2;
height: 30px;
padding: 0 8px;
.tips-con {
width: 100%;
left: 0;
background-color: #f2f2f2;
position: absolute;
top: 30px;
padding: 10px;
z-index: 99;
}
}
.receice {
position: absolute;
top: 0;
right: 0;
width: 58px;
height: 45px;
}
.choose {
position: absolute;
top: 0;
right: 0;
background-color: #ffe72c;
color: $--color-primary;
padding: 1px 5px;
}
}
.more {
position: absolute;
bottom: 20px;
cursor: pointer;
right: 30px;
}
}
</style>