<!--
|
* @Author: 秦少卫
|
* @Date: 2024-06-11 16:17:17
|
* @LastEditors: 秦少卫
|
* @LastEditTime: 2024-06-12 15:43:54
|
* @Description: 列表组件
|
-->
|
|
<template>
|
<div class="material-type">
|
<div class="item" v-for="item in materialTypeList" :key="item.id">
|
<div class="top">
|
<h3>{{ item.name }}</h3>
|
<Button type="text" size="small" @click="emit('selectType', item.id)">查看更多</Button>
|
</div>
|
<div class="img-box">
|
<div class="img-item" v-for="info in item.list" :key="info.id">
|
<Image
|
lazy
|
:src="info.src"
|
@click="(e) => emit('click', { info, e })"
|
@dragend="(e) => emit('dragend', { info, e })"
|
fit="contain"
|
width="100%"
|
height="100%"
|
:alt="info.name"
|
/>
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script name="ImportJson" setup>
|
const baseURL = import.meta.env.APP_APIHOST;
|
|
const emit = defineEmits(['click', 'dragend']);
|
|
const props = defineProps({
|
typeApi: {
|
type: Function,
|
},
|
typeListApi: {
|
type: Function,
|
},
|
typeKey: {
|
type: String,
|
},
|
formatData: {
|
type: Function,
|
},
|
});
|
|
// 素材分类
|
const materialTypeList = ref([]);
|
const getMaterialTypesHandler = async () => {
|
const res = await props.typeApi();
|
materialTypeList.value = res.data.data.map((item) => {
|
return {
|
name: item.attributes.name,
|
id: item.id,
|
list: [],
|
};
|
});
|
};
|
|
const getMaterialsByTypeHandler = async () => {
|
materialTypeList;
|
let i = 0;
|
for (const item of materialTypeList.value) {
|
const res = await props.typeListApi({
|
populate: {
|
img: '*',
|
},
|
filters: {
|
[props.typeKey]: {
|
$eq: item.id,
|
},
|
},
|
pagination: {
|
page: 1,
|
pageSize: 8,
|
},
|
});
|
materialTypeList.value[i].list = props.formatData(res.data.data);
|
|
i++;
|
}
|
};
|
|
onMounted(async () => {
|
await getMaterialTypesHandler();
|
await getMaterialsByTypeHandler();
|
});
|
</script>
|
<style scoped lang="less">
|
.item {
|
.top {
|
display: flex;
|
width: 100%;
|
justify-content: space-between;
|
align-items: center;
|
padding: 10px 0;
|
}
|
}
|
|
.img-box {
|
background: #f1f2f4;
|
display: grid;
|
padding: 8px;
|
display: grid;
|
grid-template-columns: repeat(4, 60px);
|
grid-template-rows: repeat(2, 70px);
|
grid-row-gap: 10px;
|
justify-content: space-between;
|
padding: 8px;
|
background: #f1f2f4;
|
border-radius: 10px;
|
margin-bottom: 10px;
|
.img-item {
|
border-radius: 5px;
|
padding: 5px;
|
cursor: pointer;
|
&:hover {
|
background: #bababa;
|
}
|
}
|
}
|
</style>
|