合同小程序前端代码仓库
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.
 
 
 
 
 

149 lines
4.7 KiB

// @ts-nocheck
// #ifdef MP
function findChildren(selector : string, context : ComponentPublicInstance, needAll : boolean) {
const { proxy, $vm } = context
context = $vm || proxy
if ((selector.startsWith('.') || selector.startsWith('#'))) {
const queue = [context]
let result = null
while (queue.length > 0) {
const child = queue.shift();
const flag = child?.selectComponent(selector)
if (flag) {
if (!needAll) { return result = flag.$vm }
return result = child.selectAllComponents(selector).map(item => item.$vm)
} else {
child.$children && (queue.push(...child.$children));
}
}
return result
} else {
const { $templateRefs } = context.$
const selectorValue = /#|\.|@|$/.test(selector) ? selector.substring(1) : selector
const nameMap = {}
for (var i = 0; i < $templateRefs.length; i++) {
const item = $templateRefs[i]
nameMap[item.i] = item.r
}
let result = []
if (context.$children.length) {
const queue = [...context.$children]
while (queue.length > 0) {
const child = queue.shift();
if (child.type?.name === selectorValue || child.$?.type?.name === selectorValue) {
result.push(child)
} else if (child.$refs && child.$refs[selectorValue]) {
result = child.$refs[selectorValue]
} else if (nameMap[child.id] === selectorValue) {
result.push(child)
} else {
child.$children && (queue.push(...child.$children));
}
if (result.length && !needAll) {
return;
}
}
}
return needAll ? result : result[0]
}
}
// #endif
// #ifdef H5
function findChildren(selector : string, context : ComponentPublicInstance, needAll : boolean){
const {_, component } = context
const child = {component: _ || component || context, children: null , subTree: null, props: null}
let result = []
let queue = [child]
const selectorValue = /#|\.|@|$/.test(selector) ? selector.substring(1) : selector
while(queue.length > 0 ) {
const child = queue.shift()
const {component, children , props, subTree} = child
if(component?.type?.name == selectorValue) {
result.push(component)
} else if(selector.startsWith('$') && component && (props?.ref == selectorValue || component[key][selectorValue])) {
if(props?.ref == selectorValue) {
//exposed
result.push(component)
} else if(component[key][selectorValue]) {
result.push(component[key][selectorValue])
}
} else if(!selector.startsWith('$') && component?.exposed && new RegExp(`\\b${selectorValue}\\b`).test(component.attrs[key])) {
// exposed
result.push(component)
} else if(children && Array.isArray(children)) {
queue.push(...children)
} else if(!component && subTree) {
queue.push(subTree)
} else if(component?.subTree) {
queue.push(component.subTree)
}
if(result.length && !needAll) {
break
}
}
return needAll ? result : result[0]
}
// #endif
// #ifdef APP
function findChildren(selector : string, context : ComponentPublicInstance, needAll : boolean){
let result = []
const selectorValue = /#|\.|@|$/.test(selector) ? selector.substring(1) : selector
const queue = [context]
while(queue.length > 0) {
const child = queue.shift()
const {component, children, props, subTree} = child
const isComp = component && props && component.exposed && !node
if(child.type && child.type.name === selectorValue) {
result.push(component)
} else if(props?.[key] === selectorValue && node) {
result.push(child)
} else if(selector.startsWith('$') && isComp && (props.ref === selectorValue || props.ref_key === selectorValue)) {
// exposed
result.push(component)
} else if(!selector.startsWith('$') && isComp && new RegExp(`\\b${selectorValue}\\b`).test(props[key])) {
// exposed
result.push(component)
}
else if(subTree) {
queue.push(subTree)
} else if(component && component.subTree){
queue.push(component.subTree)
}
else if(children && Array.isArray(children)) {
queue.push(...children)
}
if(result.length && !needAll) {
break;
}
}
return needAll ? result : result[0]
}
// #endif
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 {
return findChildren(this.selector, this.context, false)
}
findAll() : ComponentPublicInstance[] | null {
return findChildren(this.selector, this.context, true)
}
closest() : ComponentPublicInstance | null {
return null
}
}
export function selectComponent(selector: string) {
return new Query(selector)
}