54 lines
995 B
Vue
54 lines
995 B
Vue
![]() |
<template>
|
||
|
<view
|
||
|
class="cl-waterfall-column"
|
||
|
:style="{
|
||
|
margin,
|
||
|
width,
|
||
|
}"
|
||
|
>
|
||
|
<slot></slot>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script lang="ts">
|
||
|
import { getCurrentInstance, computed, defineComponent, nextTick } from "vue";
|
||
|
import { getParent } from "/@/cool/utils";
|
||
|
|
||
|
export default defineComponent({
|
||
|
name: "cl-waterfall-column",
|
||
|
|
||
|
setup() {
|
||
|
const { proxy }: any = getCurrentInstance();
|
||
|
|
||
|
// cl-waterfall
|
||
|
const parent = getParent("cl-waterfall", ["column", "gutter"], ["getRect"]);
|
||
|
|
||
|
// 宽度
|
||
|
const width = computed(
|
||
|
() => `calc(${100 / parent.value.column}% - ${parent.value.gutter}rpx)`,
|
||
|
);
|
||
|
|
||
|
// 间距
|
||
|
const margin = computed(() => `0 ${parent.value.gutter / 2}rpx`);
|
||
|
|
||
|
function getRect() {
|
||
|
return new Promise((resolve) => {
|
||
|
nextTick(() => {
|
||
|
uni.createSelectorQuery()
|
||
|
.in(proxy)
|
||
|
.select(`.cl-waterfall-column`)
|
||
|
.boundingClientRect(resolve)
|
||
|
.exec();
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
width,
|
||
|
margin,
|
||
|
getRect,
|
||
|
};
|
||
|
},
|
||
|
});
|
||
|
</script>
|