UNPKG

tdesign-mobile-vue

Version:
1 lines 9.75 kB
{"version":3,"file":"render-tnode.mjs","sources":["../../src/hooks/render-tnode.ts"],"sourcesContent":["import { h, ComponentPublicInstance, VNode, isVNode, Fragment } from 'vue';\nimport { camelCase, kebabCase, isArray, isEmpty, isFunction, isString, isObject } from 'lodash-es';\n\nexport interface JSXRenderContext {\n defaultNode?: VNode | string;\n params?: Record<string, any>;\n slotFirst?: boolean;\n // 是否不打印 LOG\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 getChildren(content: VNode[]) {\n const childList: VNode[] = [];\n const innerGetChildren = (content: VNode[]) => {\n if (!isArray(content)) return;\n content.forEach((item: VNode) => {\n if (item.children && isArray(item.children)) {\n if (item.type !== Fragment) return;\n innerGetChildren(item.children as VNode[]);\n } else {\n childList.push(item);\n }\n });\n return childList;\n };\n\n return innerGetChildren(content);\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 : false;\n}\n\n// 同时支持驼峰命名和中划线命名的插槽,示例: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 * 通过JSX的方式渲染 TNode,props 和 插槽同时处理,也能处理默认值为 true 则渲染默认节点的情况\n * @param vm 组件实例\n * @param name 插槽和属性名称\n * @param options 值可能为默认渲染节点,也可能是默认渲染节点和参数的集合\n * @example renderTNodeJSX(this, 'closeBtn') 优先级 props function 大于 插槽\n * @example renderTNodeJSX(this, 'closeBtn', <close-icon />)。 当属性值为 true 时则渲染 <close-icon />\n * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <close-icon />, params })。 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 // const isSilent = Boolean(isObject(options) && 'silent' in options && options.silent);\n // // 同名插槽和属性同时存在,则提醒用户只需要选择一种方式即可\n // if (instance.$slots[name] && propsNode && propsNode !== true && !isSilent) {\n // console.warn(`Both $slots.${name} and $props.${name} exist, $props.${name} is preferred`);\n // }\n\n // propsNode 为 false 不渲染\n if (propsNode === false || propsNode === null) 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 * 通过JSX的方式渲染 TNode,props 和 插槽同时处理。与 renderTNodeJSX 区别在于 属性值为 undefined 时会渲染默认节点\n * @param vm 组件实例\n * @param name 插槽和属性名称\n * @example renderTNodeJSX(this, 'closeBtn')\n * @example renderTNodeJSX(this, 'closeBtn', <close-icon />)。this.closeBtn 为空时,则兜底渲染 <close-icon />\n * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <close-icon />, params }) 。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 * 用于处理相同名称的 TNode 渲染\n * @param vm 组件实例\n * @param name1 第一个名称,优先级高于 name2\n * @param name2 第二个名称\n * @param defaultNode 默认渲染内容:当 name1 和 name2 都为空时会启动默认内容渲染\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":["getDefaultNode","options","defaultNode","isObject","isVNode","isString","getChildren","content","childList","innerGetChildren","isArray","forEach","item","children","type","Fragment","push","getParams","params","getSlotFirst","slotFirst","handleSlots","instance","name","_instance$$slots$came","_instance$$slots","_instance$$slots$keba","_instance$$slots2","node","$slots","camelCase","call","kebabCase","renderTNodeJSX","propsNode","isFunction","h","isPropsEmpty","includes","renderTNodeJSXDefault","vm","renderContent","name1","name2","toParams","node1","node2","res","isEmpty"],"mappings":"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"}