Files
cmgd-mini-app/uni_modules/nutui-uni/components/_hooks/useSelectorQuery.ts
2026-01-05 12:47:14 +08:00

68 lines
1.8 KiB
TypeScript

import { getCurrentInstance } from 'vue'
import type { ComponentInternalInstance } from 'vue'
export function useSelectorQuery(instance?: ComponentInternalInstance | null) {
let query: UniApp.SelectorQuery | null = null
if (!instance)
instance = getCurrentInstance()
if (!instance)
console.warn('useSelectorQuery', 'useSelectorQuery必须在setup函数中使用')
// #ifndef MP-ALIPAY
query = uni.createSelectorQuery().in(instance)
// #endif
// #ifdef MP-ALIPAY
query = uni.createSelectorQuery().in(null)
// #endif
const getSelectorNodeInfo = (selector: string): Promise<UniApp.NodeInfo> => {
return new Promise((resolve, reject) => {
if (query) {
query
.select(selector)
.boundingClientRect((res) => {
const selectRes: UniApp.NodeInfo = res as UniApp.NodeInfo
if (selectRes)
resolve(selectRes)
else
reject(new Error(`未找到对应节点: ${selector}`))
})
.exec()
}
else {
reject(new Error('未找到对应的SelectorQuery实例'))
}
})
}
const getSelectorNodeInfos = (
selector: string,
): Promise<UniApp.NodeInfo[]> => {
return new Promise((resolve, reject) => {
if (query) {
query
.selectAll(selector)
.boundingClientRect((res) => {
const selectRes: UniApp.NodeInfo[] = res as UniApp.NodeInfo[]
if (selectRes && selectRes.length > 0)
resolve(selectRes)
else
reject(new Error(`未找到对应节点: ${selector}`))
})
.exec()
}
else {
reject(new Error('未找到对应的SelectorQuery实例'))
}
})
}
return {
query,
getSelectorNodeInfo,
getSelectorNodeInfos,
}
}