mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-20 10:16:39 +08:00
81 lines
1.5 KiB
Vue
81 lines
1.5 KiB
Vue
<template>
|
|
<div class="list-box" ref="container">
|
|
<div class="list-inner">
|
|
<div
|
|
class="list-item"
|
|
v-for="(item, index) in items"
|
|
:key="index"
|
|
:style="{width:itemWidth + 'px'}"
|
|
>
|
|
<div class="item-inner" :style="{padding: gap/2+'px'}">
|
|
<div class="item-wrapper">
|
|
<slot :item="item" :index="index" :width="itemWidth"></slot>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
// 列表组件
|
|
import {onMounted, ref} from "vue";
|
|
|
|
// eslint-disable-next-line no-undef
|
|
const props = defineProps({
|
|
items: {
|
|
type: Array,
|
|
required: true
|
|
},
|
|
gap: {
|
|
type: Number,
|
|
default: 12
|
|
},
|
|
width: {
|
|
type: Number,
|
|
default: 240
|
|
}
|
|
});
|
|
|
|
const container = ref(null)
|
|
const itemWidth = ref(props.width)
|
|
|
|
onMounted(() => {
|
|
computeSize()
|
|
})
|
|
|
|
const computeSize = () => {
|
|
const w = container.value.offsetWidth - 10 // 减去滚动条的宽度
|
|
let cols = Math.floor(w / props.width)
|
|
itemWidth.value = Math.floor(w / cols)
|
|
}
|
|
|
|
window.onresize = () => {
|
|
computeSize()
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="stylus">
|
|
|
|
.list-box {
|
|
|
|
.list-inner {
|
|
display flex
|
|
flex-wrap wrap
|
|
|
|
.list-item {
|
|
.item-inner {
|
|
display flex
|
|
|
|
.item-wrapper {
|
|
height 100%
|
|
width 100%
|
|
display flex
|
|
justify-content center
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
</style> |