合同小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

75 lines
2.1 KiB

// @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()