mrr.sj.front/components/filterCard/filterCard.vue

122 lines
2.6 KiB
Vue

<template>
<view class="filter-popup__content__right__items" :id="`filter_${info.id}`">
<view class="filter-popup__content__right__items__title">{{
info.title
}}</view>
<view
v-for="(detailItem, index) in info.details"
:key="detailItem.id"
class="filter-popup__content__right__items__item"
:class="{ active: detailLists.includes(detailItem.value) }"
@click="selectDetail(detailItem)"
>
{{ detailItem.name }}
</view>
<slot></slot>
</view>
</template>
<script>
/**
* selectDetail 块被点击
* isSingle 是否单选
*/
export default {
name: "filterCard",
props: {
info: {
type: Object,
default: () => ({}),
},
//是否单选
isSingle: {
type: Boolean,
default: false,
},
// 选中的详情列表
infoDetailList: {
type: Array,
default: () => [],
},
},
data() {
return {
detailLists: [], // 选中的详情列表
};
},
created() {
},
computed: {
},
watch: {
infoDetailList: {
handler(newVal, oldVal) {
// 当父组件传入的 infoDetailList 变化时,执行此处逻辑
if(newVal.value=[]){
this.detailLists = newVal;
}
},
deep: true, // 若 infoDetailList 是复杂数组/对象(含嵌套),需要深度监听
immediate: true // 初始化时立即执行一次(获取初始值)
}
},
methods: {
selectDetail(detail) {
if (this.detailLists.includes(detail.value)) {
//如果已经存在删除存在的字段
this.detailLists = this.detailLists.filter(
(item) => item !== detail.value
);
} else {
if (this.isSingle) {
//如果是单选,清空之前的选择
this.detailLists = [];
}
this.detailLists = [...this.detailLists, detail.value];
}
this.$emit("selectDetail", this.detailLists);
},
reset() {
this.detailLists = [];
},
},
};
</script>
<style scoped lang="less">
.filter-popup__content__right__items {
display: flex;
flex-wrap: wrap;
gap: 10rpx;
margin-bottom: 40rpx;
&__title {
width: 100%;
font-weight: 500;
font-size: 26rpx;
color: #333333;
line-height: 37rpx;
text-align: left;
font-style: normal;
margin-bottom: 14rpx;
}
&__item {
width: 178rpx;
height: 78rpx;
background: #f3f6f8;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
border: 1rpx solid #f3f6f8;
}
.active {
background: rgba(252, 67, 124, 0.1);
color: #E8101E;
border: 1rpx solid #E8101E;
}
}
</style>