tdesign-mobile-vue
Version:
tdesign-mobile-vue
1 lines • 6.06 kB
Source Map (JSON)
{"version":3,"file":"render.mjs","sources":["../../src/shared/render.ts"],"sourcesContent":["import { h, ComponentInternalInstance, Slots, VNode, setBlockTracking } from 'vue';\nimport { camelCase } from 'lodash-es';\n\ninterface JSXRenderContext {\n defaultNode?: VNode;\n params?: Record<string, any>;\n}\n\n/**\n * 渲染 TNode,props 和 插槽同时处理。与 renderTNodeJSX 区别在于 属性值为 undefined 时会渲染默认节点\n * @param instance 组件示例\n * @param name 插槽和属性名称\n * @param options 缺省插槽内容\n * @example renderTNode(getCurrentInstance(), 'closeBtn')\n * @example renderTNode(getCurrentInstance(), 'closeBtn', <t-icon-close />)。this.closeBtn 为空时,则兜底渲染 <t-icon-close />\n */\nexport const renderTNode = (\n instance: ComponentInternalInstance | null,\n name: string,\n options?: Slots | JSXRenderContext,\n): any => {\n if (instance === null) {\n return h('', null);\n }\n\n const params = typeof options === 'object' && 'params' in options ? options.params : null;\n const defaultNode = typeof options === 'object' && 'defaultNode' in options ? options.defaultNode : options;\n let propsNode: any;\n if (name in instance.props || camelCase(name) in instance.props) {\n propsNode = instance.props[name] || instance.props[camelCase(name)];\n }\n // if (propsNode === false) return;\n\n // 同名优先处理插槽\n if (instance.slots[name]) {\n return instance.slots[name]?.call(params);\n }\n\n if (propsNode === true && defaultNode) {\n return instance.slots[name] ? instance.slots[name]?.call(params) : defaultNode;\n }\n\n if (typeof propsNode === 'function') {\n setBlockTracking(-1);\n const vnode = propsNode(h, params);\n setBlockTracking(1);\n return vnode;\n }\n\n const isPropsEmpty = [undefined, params, ''].includes(propsNode);\n if (isPropsEmpty && instance.slots[name]) return instance.slots[name]?.call(params);\n return propsNode;\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 = (\n instance: ComponentInternalInstance | null,\n name1: string,\n name2: string,\n options?: VNode | JSXRenderContext,\n): any => {\n if (instance === null) {\n return h('', null);\n }\n const params = typeof options === 'object' && 'params' in options ? options.params : null;\n const defaultNode = typeof options === 'object' && 'defaultNode' in options ? options.defaultNode : options;\n const toParams = params ? { params } : undefined;\n const node1 = renderTNode(instance, name1, toParams);\n const node2 = renderTNode(instance, name2, toParams);\n const r = [undefined, null, ''].includes(node1) ? node2 : node1;\n return [undefined, null, ''].includes(r) ? defaultNode : r;\n};\n"],"names":["renderTNode","instance","name","options","_instance$slots$name3","h","params","_typeof","defaultNode","propsNode","props","camelCase","slots","_instance$slots$name","call","_instance$slots$name2","setBlockTracking","vnode","isPropsEmpty","includes","renderContent","name1","name2","toParams","node1","node2","r"],"mappings":"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"}