import { ref, onMounted } from 'vue';
export function useCalculateSwiperHeight(headerSelector: string = '.header-search', tabsWrapperSelector: string = '.u-tabs .u-tabs__wrapper') {
const swiperHeight = ref<number>(0);
const getSystemInfo = () => {
return new Promise<UniApp.GetSystemInfoResult>((resolve) => {
uni.getSystemInfo({ success: resolve });
});
};
const getRect = (selector: string) => {
return new Promise<UniNamespace.NodeInfo | null>((resolve) => {
uni
.createSelectorQuery()
.select(selector)
.boundingClientRect((res) => {
const result = Array.isArray(res) ? res[0] : res;
resolve(result as UniNamespace.NodeInfo);
})
.exec();
});
};
const calculateHeight = async () => {
try {
const [searchRect, tabsRect, sysInfo] = await Promise.all([getRect(headerSelector), getRect(tabsWrapperSelector), getSystemInfo()]);
if (!searchRect || !tabsRect || !sysInfo) {
console.error('未能获取到必要的布局信息');
return;
}
swiperHeight.value = sysInfo.windowHeight - (searchRect.height || 0) - (tabsRect.height || 0);
} catch (error) {
console.error('计算高度时发生错误:', error);
}
};
onMounted(() => {
calculateHeight();
});
return {
swiperHeight,
recalculate: calculateHeight
};
}
import { useCalculateSwiperHeight } from '@/hooks/useCalculateSwiperHeight';
const { swiperHeight } = useCalculateSwiperHeight('.header-search', '.u-tabs .u-tabs__wrapper');
const { swiperHeight } = useCalculateSwiperHeight('.header-search', '.u-tabs >>> .u-tabs__wrapper');