// @ts-nocheck
|
|
import { type ComponentPublicInstance } from 'vue';
|
|
// #ifdef APP
|
|
function findChildren(selector: string, context: ComponentPublicInstance, needAll: boolean): ComponentPublicInstance [] | null{
|
|
let result:ComponentPublicInstance[] = []
|
|
|
|
if(context !== null && context.$children.length > 0) {
|
|
const queue:ComponentPublicInstance[] = [...context.$children];
|
|
while(queue.length > 0) {
|
|
const child = queue.shift();
|
|
const name = child?.$options?.name;
|
|
if(name == selector) {
|
|
result.push(child as ComponentPublicInstance)
|
|
} else {
|
|
const children = child?.$children
|
|
if(children !== null) {
|
|
queue.push(...children)
|
|
}
|
|
}
|
|
if(result.length > 0 && !needAll) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if(result.length > 0) {
|
|
return result
|
|
}
|
|
return null
|
|
}
|
|
|
|
class Query {
|
|
context : ComponentPublicInstance | null = null
|
|
selector : string = ''
|
|
// components : ComponentPublicInstance[] = []
|
|
constructor(selector : string, context : ComponentPublicInstance | null) {
|
|
this.selector = selector
|
|
this.context = context
|
|
}
|
|
in(context : ComponentPublicInstance) : Query {
|
|
return new Query(this.selector, context)
|
|
}
|
|
find(): ComponentPublicInstance | null {
|
|
const selector = this.selector
|
|
if(selector == '') return null
|
|
const component = findChildren(selector, this.context!, false)
|
|
return component != null ? component[0]: null
|
|
}
|
|
findAll():ComponentPublicInstance[] | null {
|
|
const selector = this.selector
|
|
if(selector == '') return null
|
|
return findChildren(selector, this.context!, true)
|
|
}
|
|
closest(): ComponentPublicInstance | null {
|
|
const selector = this.selector
|
|
if(selector == '') return null
|
|
let parent = this.context!.$parent
|
|
let name = parent?.$options?.name;
|
|
while (parent != null && (name == null || selector != name)) {
|
|
parent = parent.$parent
|
|
if (parent != null) {
|
|
name = parent.$options.name
|
|
}
|
|
}
|
|
return parent
|
|
}
|
|
}
|
|
|
|
export function selectComponent(selector: string): Query{
|
|
return new Query(selector, null)
|
|
}
|
|
// #endif
|
|
|
|
// selectComponent('selector').in(this).find()
|
|
// selectComponent('selector').in(this).findAll()
|
|
// selectComponent('selector').in(this).closest()
|