feat: 初始化
This commit is contained in:
8
uni_modules/lime-shared/selectAllComponent/index.ts
Normal file
8
uni_modules/lime-shared/selectAllComponent/index.ts
Normal file
@ -0,0 +1,8 @@
|
||||
// @ts-nocheck
|
||||
// #ifdef UNI-APP-X
|
||||
export * from './uvue.uts'
|
||||
// #endif
|
||||
|
||||
// #ifndef UNI-APP-X
|
||||
export * from './vue.ts'
|
||||
// #endif
|
39
uni_modules/lime-shared/selectAllComponent/uvue.uts
Normal file
39
uni_modules/lime-shared/selectAllComponent/uvue.uts
Normal file
@ -0,0 +1,39 @@
|
||||
// @ts-nocheck
|
||||
import { type ComponentPublicInstance } from 'vue';
|
||||
|
||||
type SelectOptions = {
|
||||
context : ComponentPublicInstance,
|
||||
needAll : boolean | null,
|
||||
|
||||
}
|
||||
|
||||
export function selectAllComponent(selector : string, options : UTSJSONObject) : ComponentPublicInstance[]|null {
|
||||
const context = options.get('context')! as ComponentPublicInstance;
|
||||
let needAll = options.get('needAll') as boolean;
|
||||
let result:ComponentPublicInstance[] = []
|
||||
|
||||
if(needAll == null) { needAll = true };
|
||||
|
||||
if(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
|
||||
}
|
151
uni_modules/lime-shared/selectAllComponent/vue.ts
Normal file
151
uni_modules/lime-shared/selectAllComponent/vue.ts
Normal file
@ -0,0 +1,151 @@
|
||||
// @ts-nocheck
|
||||
interface SelectOptions {
|
||||
context?: any
|
||||
needAll?: boolean
|
||||
node?: boolean
|
||||
}
|
||||
// #ifdef MP
|
||||
function selectMPComponent(key: string, name: string, context: any, needAll: boolean) {
|
||||
const {proxy, $vm} = context
|
||||
context = $vm || proxy
|
||||
if(!['ref','component'].includes(key)) {
|
||||
const queue = [context]
|
||||
let result = null
|
||||
const selector = (key == 'id' ? '#': '.') + name;
|
||||
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 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(key == 'component' && (child.type?.name === name || child.$?.type?.name === name)) {
|
||||
result.push(child)
|
||||
} else if(child.$refs && child.$refs[name]) {
|
||||
result = child.$refs[name]
|
||||
} else if(nameMap[child.id] === name){
|
||||
result.push(child)
|
||||
} else {
|
||||
child.$children && (queue.push(...child.$children));
|
||||
}
|
||||
if(result.length && !needAll) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
return needAll ? result : result[0]
|
||||
}
|
||||
}
|
||||
// #endif
|
||||
// #ifdef H5
|
||||
function selectH5Component(key: string, name: string, context: any, needAll: boolean) {
|
||||
const {_, component } = context
|
||||
const child = {component: _ || component || context, children: null , subTree: null, props: null}
|
||||
let result = []
|
||||
let queue = [child]
|
||||
while(queue.length > 0 ) {
|
||||
const child = queue.shift()
|
||||
const {component, children , props, subTree} = child
|
||||
if(key === 'component' && component?.type?.name == name) {
|
||||
result.push(component)
|
||||
} else if(key === 'ref' && component && (props?.ref == name || component[key][name])) {
|
||||
if(props?.ref == name) {
|
||||
//exposed
|
||||
result.push(component)
|
||||
} else if(component[key][name]) {
|
||||
result.push(component[key][name])
|
||||
}
|
||||
} else if(key !== 'ref' && component?.exposed && new RegExp(`\\b${name}\\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 selectAPPComponent(key: string, name: string, context: any, needAll: boolean, node: boolean) {
|
||||
let result = []
|
||||
// const {_, component} = context
|
||||
// const child = {component: _ || component || context, children: null, props: null, subTree: null}
|
||||
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(key == 'component' && child.type && child.type.name === name) {
|
||||
result.push(component)
|
||||
} else if(props?.[key] === name && node) {
|
||||
result.push(child)
|
||||
} else if(key === 'ref' && isComp && (props.ref === name || props.ref_key === name)) {
|
||||
// exposed
|
||||
result.push(component)
|
||||
} else if(key !== 'ref' && isComp && new RegExp(`\\b${name}\\b`).test(props[key])) {
|
||||
// exposed
|
||||
result.push(component)
|
||||
}
|
||||
// else if(component && component.subTree && Array.isArray(component.subTree.children)){
|
||||
// queue.push(...component.subTree.children)
|
||||
// }
|
||||
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
|
||||
export function selectAllComponent(selector: string, options: SelectOptions = {}) {
|
||||
// . class
|
||||
// # id
|
||||
// $ ref
|
||||
// @ component name
|
||||
const reg = /^(\.|#|@|\$)([a-zA-Z_0-9\-]+)$/;
|
||||
if(!reg.test(selector)) return null
|
||||
let { context, needAll = true, node} = options
|
||||
const [,prefix, name] = selector.match(reg)
|
||||
const symbolMappings = {'.': 'class', '#': 'id', '$':'ref', '@':'component'}
|
||||
|
||||
const key = symbolMappings [prefix] //prefix === '.' ? 'class' : prefix === '#' ? 'id' : 'ref';
|
||||
// #ifdef MP
|
||||
return selectMPComponent(key, name, context, needAll)
|
||||
// #endif
|
||||
// #ifdef H5
|
||||
return selectH5Component(key, name, context, needAll)
|
||||
// #endif
|
||||
// #ifdef APP
|
||||
return selectAPPComponent(key, name, context, needAll, node)
|
||||
// #endif
|
||||
}
|
Reference in New Issue
Block a user