41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
|
|
import { getCurrentInstance, nextTick, ref } from 'vue';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* useRect - 获取元素的位置信息(响应式,原生实现)
|
|||
|
|
* @param selector 选择器(如 #id 或 .class)
|
|||
|
|
* @param all 是否获取所有匹配元素
|
|||
|
|
* @returns rect 响应式的节点信息,refresh 主动刷新方法
|
|||
|
|
*/
|
|||
|
|
export function useRect(selector: string | null = null, all = false) {
|
|||
|
|
const rect = ref<any>(all ? [] : null);
|
|||
|
|
const instance = getCurrentInstance();
|
|||
|
|
|
|||
|
|
async function getRect(realSelector: string | null = null, delay = 0): Promise<any> {
|
|||
|
|
realSelector = realSelector || selector;
|
|||
|
|
if (!realSelector) return rect.value;
|
|||
|
|
await nextTick();
|
|||
|
|
return new Promise(resolve => {
|
|||
|
|
setTimeout(() => {
|
|||
|
|
uni.createSelectorQuery()
|
|||
|
|
.in(instance?.proxy)
|
|||
|
|
[all ? 'selectAll' : 'select'](realSelector as string)
|
|||
|
|
.boundingClientRect((res: any) => {
|
|||
|
|
rect.value = res;
|
|||
|
|
resolve(res);
|
|||
|
|
})
|
|||
|
|
.exec();
|
|||
|
|
}, delay);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function refresh(selector?: string | null, delay?: number): Promise<any> {
|
|||
|
|
return getRect(selector, delay);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
rect,
|
|||
|
|
getRect,
|
|||
|
|
refresh
|
|||
|
|
};
|
|||
|
|
}
|