68 lines
1.8 KiB
TypeScript
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,
|
|
}
|
|
}
|