263 lines
6.0 KiB
Vue
263 lines
6.0 KiB
Vue
<template>
|
|
<view class="pre-wrapper" :class="{ 'preview-two': props.preStyle == 'one', 'preview-one': props.preStyle == 'two' }">
|
|
<view v-if="activeBox" class="active-box" :class="{ disabled: disabled, active: active }" @tap="emits('activeClick')">
|
|
<image :src="imageList[disabled ? 0 : 1]" mode="scaleToFill" />
|
|
</view>
|
|
<view
|
|
class="preview-list"
|
|
:class="{
|
|
'last-list': isLast,
|
|
|
|
'last-none': props.borderNone,
|
|
}"
|
|
@tap="emits('click')"
|
|
>
|
|
<view class="content-box">
|
|
<image :src="props.img" class="img" />
|
|
<view class="content-describe">
|
|
<text class="title single-text-beyond">{{ props.title }}
|
|
<slot name="titleTag"/>
|
|
</text>
|
|
<text>{{ props.qrcId }}</text>
|
|
</view>
|
|
|
|
<slot>
|
|
<view class="content-state">
|
|
<view class="top">
|
|
<view class="spot" :style="{ backgroundColor: props.spot }"></view>
|
|
<view class="status">{{ props.status }}</view>
|
|
</view>
|
|
<text></text>
|
|
</view>
|
|
</slot>
|
|
</view>
|
|
|
|
<!-- 组件下部具名插槽 默认填充内容,图标,描述,号码 -->
|
|
<slot name="bottom">
|
|
<view class="info" v-if="mchName || mchNo">
|
|
<image src="@/static/equipmentImg/mch-little.svg" mode="aspectFit" class="mch-img" />
|
|
<view class="name">{{ props.mchName }}</view>
|
|
<view class="number">{{ props.mchNo }}</view>
|
|
</view>
|
|
</slot>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
/*
|
|
列表预览组件
|
|
默认插槽放到最右边
|
|
具名插槽在下部
|
|
*/
|
|
import { ref, reactive, nextTick, watchEffect } from 'vue'
|
|
const emits = defineEmits(['activeClick', 'click'])
|
|
const vdata = reactive({
|
|
infoIsShow: false, // info板块是否展示
|
|
})
|
|
|
|
const props = defineProps({
|
|
img: { type: String, default: '/static/equipmentImg/code-open.svg' },
|
|
title: { type: String, default: '' },
|
|
qrcId: { type: String, default: '' },
|
|
spot: { type: String, default: '#fff' },
|
|
status: { type: String, default: '' },
|
|
mchName: { type: String, default: '' },
|
|
mchNo: { type: String, default: '' },
|
|
isLast: { type: Boolean, default: false }, // 最后一个列表,下划线通底
|
|
borderNone: { type: Boolean, default: false }, // 最后一个下划线隐藏
|
|
preStyle: { type: String, default: '' }, // 预制的主题颜色,在最下方
|
|
disabled: { type: Boolean, default: false }, //是否禁用默认否
|
|
active: { type: Boolean, default: false }, //是否选中默认未选中
|
|
activeBox: { type: Boolean, default: false }, // 是否显示 勾选框 默认不显示
|
|
})
|
|
|
|
const imageList = ['/static/iconImg/icon-disabled.svg', '/static/iconImg/icon-active.svg']
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.pre-wrapper {
|
|
display: flex;
|
|
align-items: center;
|
|
background-color: #fff;
|
|
padding: 30rpx;
|
|
position: relative;
|
|
box-sizing: border-box;
|
|
.active-box {
|
|
flex-shrink: 0;
|
|
flex-grow: 0;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
margin-right: 30rpx;
|
|
width: 36rpx;
|
|
height: 36rpx;
|
|
border-radius: 6rpx;
|
|
border: 2rpx solid #d9d9d9;
|
|
|
|
image {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
}
|
|
.active {
|
|
background-color: #2980fd;
|
|
}
|
|
.disabled {
|
|
background-color: #f2f2f2;
|
|
}
|
|
}
|
|
.preview-list {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
// 下边框线
|
|
&::after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: 0;
|
|
right: 0;
|
|
height: 1px;
|
|
width: calc(100% - 30rpx);
|
|
background-color: #d9d9d9;
|
|
transform: scaleY(0.5);
|
|
}
|
|
|
|
// 纯图片
|
|
.img {
|
|
flex-grow: 0;
|
|
flex-shrink: 0;
|
|
width: 93rpx;
|
|
height: 93rpx;
|
|
margin-right: 25rpx;
|
|
}
|
|
|
|
// 左侧内容
|
|
.content-box {
|
|
flex: 1;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
|
|
.content-describe {
|
|
flex: 1;
|
|
color: #8c8c8c;
|
|
font-size: 25rpx;
|
|
// width: 100%;
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
line-height: 35rpx;
|
|
.title {
|
|
width: 380rpx;
|
|
font-size: 33rpx;
|
|
color: #000;
|
|
line-height: 46rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 右侧内容 默认为状态点以及文字
|
|
.content-state {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
.top {
|
|
display: flex;
|
|
align-items: center;
|
|
.spot {
|
|
width: 10rpx;
|
|
height: 10rpx;
|
|
border-radius: 50%;
|
|
margin-right: 16rpx;
|
|
background-color: #000;
|
|
}
|
|
.status {
|
|
font-size: 30rpx;
|
|
line-height: 46rpx;
|
|
white-space: nowrap;
|
|
color: #666;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 底部样式
|
|
.info {
|
|
width: 100%;
|
|
display: flex;
|
|
justify-content: center;
|
|
padding: 20rpx;
|
|
box-sizing: border-box;
|
|
background-color: #f7f7f7;
|
|
border-radius: 10rpx;
|
|
margin-top: 20rpx;
|
|
|
|
.mch-img {
|
|
width: 40rpx;
|
|
height: 40rpx;
|
|
flex-shrink: 0;
|
|
}
|
|
.name {
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
margin: 0 10rpx;
|
|
color: #000;
|
|
font-size: 28rpx;
|
|
flex-grow: 1;
|
|
}
|
|
.number {
|
|
white-space: nowrap;
|
|
color: #8c8c8c;
|
|
font-size: 28rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.last-list {
|
|
// 下边框线
|
|
&::after {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: 0;
|
|
right: 0;
|
|
height: 1rpx;
|
|
width: 100%;
|
|
background-color: #e5e5e5;
|
|
}
|
|
}
|
|
|
|
.last-none {
|
|
// 下边框线
|
|
&::after {
|
|
height: 0;
|
|
}
|
|
}
|
|
|
|
// 预制样式1 开启状态 标题白色 id 白色0.6
|
|
.preview-one {
|
|
background: rgba(0, 0, 0, 0.1);
|
|
.content-box {
|
|
.content-describe {
|
|
color: rgba(255, 255, 255, 0.6);
|
|
.title {
|
|
color: #ffffff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 预制样式2 关闭状态 标题白色 id 白色0.6
|
|
.preview-two {
|
|
background: rgba(0, 0, 0, 0.1) !important;
|
|
.content-box {
|
|
.content-describe {
|
|
color: rgba(255, 255, 255, 0.5);
|
|
.title {
|
|
color: rgba(255, 255, 255, 0.5);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|