xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 5.6 kB
Source Map (JSON)
{"version":3,"file":"render-tnode.mjs","sources":["../../src/utils/render-tnode.ts"],"sourcesContent":["import { h, ComponentPublicInstance, VNode, isVNode } from 'vue';\nimport isEmpty from 'lodash/isEmpty';\nimport isString from 'lodash/isString';\nimport isFunction from 'lodash/isFunction';\nimport isObject from 'lodash/isObject';\nimport camelCase from 'lodash/camelCase';\nimport kebabCase from 'lodash/kebabCase';\n\nexport interface JSXRenderContext {\n defaultNode?: VNode | string;\n params?: Record<string, any>;\n slotFirst?: boolean;\n silent?: boolean;\n}\n\nexport type OptionsType = VNode | JSXRenderContext | string;\n\nexport function getDefaultNode(options?: OptionsType) {\n let defaultNode;\n if (isObject(options) && 'defaultNode' in options) {\n defaultNode = options.defaultNode;\n } else if (isVNode(options) || isString(options)) {\n defaultNode = options;\n }\n\n return defaultNode;\n}\n\nexport function getParams(options?: OptionsType) {\n return isObject(options) && 'params' in options ? options.params : {};\n}\n\nexport function getSlotFirst(options?: OptionsType) {\n return isObject(options) && 'slotFirst' in options ? options.slotFirst : {};\n}\n\n// example:value-display 和 valueDisplay\nexport function handleSlots(instance: ComponentPublicInstance, params: Record<string, any>, name: string) {\n // 检查是否存在 驼峰命名 的插槽\n let node = instance.$slots[camelCase(name)]?.(params);\n if (node) return node;\n // 检查是否存在 中划线命名 的插槽\n node = instance.$slots[kebabCase(name)]?.(params);\n if (node) return node;\n return null;\n}\n\n/**\n * @param vm \n * @param name \n * @param options \n * @example renderTNodeJSX(this, 'closeBtn') \n * @example renderTNodeJSX(this, 'closeBtn', <close-icon />)\n * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <close-icon />, params })\n */\nexport const renderTNodeJSX = (instance: ComponentPublicInstance, name: string, options?: OptionsType) => {\n // assemble params && defaultNode\n const params = getParams(options);\n const defaultNode = getDefaultNode(options);\n\n // 处理 props 类型的Node\n let propsNode;\n if (name in instance) {\n propsNode = instance[name];\n }\n\n\n if (propsNode === false) return;\n if (propsNode === true && defaultNode) {\n return handleSlots(instance, params, name) || defaultNode;\n }\n\n // 同名 props 和 slot 优先处理 props\n if (isFunction(propsNode)) return propsNode(h, params);\n const isPropsEmpty = [undefined, params, ''].includes(propsNode);\n // Props 为空,但插槽存在\n if (isPropsEmpty && (instance.$slots[camelCase(name)] || instance.$slots[kebabCase(name)])) {\n return handleSlots(instance, params, name);\n }\n return propsNode;\n};\n\n/**\n * @param vm \n * @param name \n * @example renderTNodeJSX(this, 'closeBtn')\n * @example renderTNodeJSX(this, 'closeBtn', <close-icon />)\n * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <close-icon />, params })\n */\nexport const renderTNodeJSXDefault = (vm: ComponentPublicInstance, name: string, options?: OptionsType) => {\n const defaultNode = getDefaultNode(options);\n return renderTNodeJSX(vm, name, options) || defaultNode;\n};\n\n/**\n * @param vm \n * @param name1 \n * @param name2 \n * @param defaultNode \n * @example renderContent(this, 'default', 'content')\n * @example renderContent(this, 'default', 'content', '')\n * @example renderContent(this, 'default', 'content', { defaultNode: '', params })\n */\nexport const renderContent = (vm: ComponentPublicInstance, name1: string, name2: string, options?: OptionsType) => {\n const params = getParams(options);\n const defaultNode = getDefaultNode(options);\n\n const toParams = params ? { params } : undefined;\n\n const node1 = renderTNodeJSX(vm, name1, toParams);\n const node2 = renderTNodeJSX(vm, name2, toParams);\n\n const res = isEmpty(node1) ? node2 : node1;\n return isEmpty(res) ? defaultNode : res;\n};\n"],"names":["defaultNode","isObject","propsNode","params","isEmpty"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,SAAA,cAAA,CAAA,OAAA,EAAA;AACD,EAAA,IAAA,WAAA,CAAA;;;;AAIYA,IAAAA,WAAAA,GAAAA,OAAAA,CAAAA;AAChB,GAAA;AAEO,EAAA,OAAA,WAAA,CAAA;AACT,CAAA;AAEO,SAAA,SAAA,CAAA,OAAA,EAAA;AACL,EAAA,OAAAC,UAAA,CAAA,OAAA,CAAA,IAAA,QAAA,IAAA,OAAA,GAAA,OAAA,CAAA,MAAA,GAAA,EAAA,CAAA;AACF,CAAA;AAEO,SAAA,YAAA,CAAA,OAAA,EAAA;AACL,EAAA,OAAAA,UAAA,CAAA,OAAA,CAAA,IAAA,WAAA,IAAA,OAAA,GAAA,OAAA,CAAA,SAAA,GAAA,EAAA,CAAA;AACF,CAAA;AAGO,SAAA,WAAA,CAAA,QAAA,EAAA,MAAA,EAAA,IAAA,EAAA;AAAmG,EAAA,IAAA,qBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,iBAAA,CAAA;;;;;AAOjG,EAAA,OAAA,IAAA,CAAA;AACT,CAAA;AAUO,IAAA,cAAA,GAAA,SAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAA,OAAA,EAAA;AAEC,EAAA,IAAA,MAAA,GAAA,SAAA,CAAA,OAAA,CAAA,CAAA;AACA,EAAA,IAAA,WAAA,GAAA,cAAA,CAAA,OAAA,CAAA,CAAA;AAGF,EAAA,IAAA,SAAA,CAAA;;AAEFC,IAAAA,SAAAA,GAAAA,QAAAA,CAAAA,IAAAA,CAAAA,CAAAA;AACF,GAAA;;AAII,EAAA,IAAA,SAAA,KAAA,IAAA,IAAA,WAAA,EAAA;;AAEJ,GAAA;;AAIA,EAAA,IAAA,YAAA,GAAA,CAAA,KAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,CAAA,QAAA,CAAA,SAAA,CAAA,CAAA;;AAGS,IAAA,OAAA,WAAA,CAAA,QAAA,EAAA,MAAA,EAAA,IAAA,CAAA,CAAA;AACT,GAAA;AACO,EAAA,OAAA,SAAA,CAAA;AACT,EAAA;AASO,IAAA,qBAAA,GAAA,SAAA,qBAAA,CAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA;AACC,EAAA,IAAA,WAAA,GAAA,cAAA,CAAA,OAAA,CAAA,CAAA;;AAER,EAAA;AAWO,IAAA,aAAA,GAAA,SAAA,aAAA,CAAA,EAAA,EAAA,KAAA,EAAA,KAAA,EAAA,OAAA,EAAA;AACC,EAAA,IAAA,MAAA,GAAA,SAAA,CAAA,OAAA,CAAA,CAAA;AACA,EAAA,IAAA,WAAA,GAAA,cAAA,CAAA,OAAA,CAAA,CAAA;;AAEsBC,IAAAA,MAAAA,EAAAA,MAAAA;;;;;AAMrB,EAAA,OAAAC,SAAA,CAAA,GAAA,CAAA,GAAA,WAAA,GAAA,GAAA,CAAA;AACT;;;;"}