znyg-frontend-common 1.0.97 → 1.0.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/components/znFormV2/src/components/ZnFormV2Item.vue2.mjs +1 -1
- package/es/components/znFormV2/src/components/ZnFormV2Item.vue2.mjs.map +1 -1
- package/es/components/znFormV2/src/index.vue2.mjs +10 -10
- package/es/components/znFormV2/src/index.vue2.mjs.map +1 -1
- package/es/components/znFormV2/src/interface/index.mjs.map +1 -1
- package/es/index.mjs +1 -1
- package/es/index.mjs.map +1 -1
- package/lib/components/znFormV2/src/components/ZnFormV2Item.vue2.js +1 -1
- package/lib/components/znFormV2/src/components/ZnFormV2Item.vue2.js.map +1 -1
- package/lib/components/znFormV2/src/index.vue2.js +8 -8
- package/lib/components/znFormV2/src/index.vue2.js.map +1 -1
- package/lib/components/znFormV2/src/interface/index.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import{defineComponent as e,useModel as l,ref as n,unref as o,computed as r,inject as t,markRaw as a,createVNode as u,createTextVNode as s,resolveComponent as i,h as c,createElementBlock as m,openBlock as p,Fragment as d,createCommentVNode as f,toDisplayString as y,createElementVNode as v,createBlock as E,normalizeStyle as h,mergeProps as _,mergeModels as b}from"vue";import"./Tree.vue.mjs";import{hyphenToCamelCase as g,getFormProp as L,setFormProp as R}from"../helper/index.mjs";import{getComponent as C}from"../helper/componentMap.mjs";import{formEnumMapKey as V,ComponentNameEnum as w}from"../interface/index.mjs";import{useRenderCheckbox as D}from"./useRenderCheckbox.mjs";import{useRenderComponent as S}from"./useRenderComponent.mjs";import{useRenderRadio as T}from"./useRenderRadio.mjs";import{useRenderSelect as $}from"./useRenderSelect.mjs";import{useLocalStorage as O}from"@vueuse/core";import x from"./Tree.vue2.mjs";var j=Object.defineProperty,M=(e,l)=>j(e,"name",{value:l,configurable:!0});const I={key:1,style:{display:"flex","align-items":"center","min-height":"32px",transition:"opacity 0.3s ease",opacity:"0.6"}},k={style:{display:"flex","align-items":"center",gap:"8px"}},N={style:{color:"#999","font-size":"12px"}};var F=e({name:"ZnFormV2Item",__name:"ZnFormV2Item",props:b({column:{type:Object,required:!0},style:{required:!1},isView:{type:Boolean,skipCheck:!0,required:!1,default:!1},isLazyLoading:{type:Boolean,required:!1,default:!1},isReady:{type:Boolean,required:!1,default:!0}},{modelValue:{required:!0},modelModifiers:{}}),emits:["update:modelValue"],setup(b){const j=b,F=O("znyg",{dictMap:{}}),P=l(b,"modelValue"),A=new Map,U=n(""),Y=M((()=>{const{prop:e,el:l,render:n,renderInView:r}=j.column,t=o(j.isView),a=P.value[e];return`${e}_${l}_${t}_${JSON.stringify(a)}_${!!n}_${!!r}`}),"getRenderCacheKey"),B=(r((()=>{const e=Y(),l=e!==U.value;return l&&(U.value=e),l})),r((()=>{const{dictCode:e}=j.column;let l=j.column.fieldNames?.label??"label",n=j.column.fieldNames?.value??"value";return e&&(l="name",n="code"),{label:l,value:n,children:j.column.fieldNames?.children??"children",disabled:j.column.fieldNames?.disabled??"disabled"}}))),K=t(V,n(new Map)),q=t("componentRefsCollector",null),z=r((()=>j.column.enum)),H=r((()=>{const{useEnumMap:e,enumKey:l,prop:n,el:r,dictCode:t}=j.column,a=o(K),u=o(z);let s;if(t&&F&&F.value?.dictMap&&(s=F.value.dictMap[t?.toString()]??[]),e)if("function"==typeof e)s=e(a);else{const n=a.get(e);s=n?l?n[l]||[]:n:[]}if(!s)if(Array.isArray(u)&&u.length>0)s=u;else{let e=a.get(n);s=e?g(r)===w.EL_SELECT_V2?e.map((e=>({...e,label:e[o(B).label],value:e[o(B).value]}))):l?e[l]||[]:e:[]}return s||[]})),J=r((()=>{const e=o(B).label,l=o(B).value,n=o(B).children,r=g(j.column?.el);let t=j.column.props??{};const a={};for(const[e,l]of Object.entries(t))e.startsWith("on")&&"function"==typeof l||(a[e]="function"==typeof l?l(o(P)):l);let u={};return r===w.EL_TREE_SELECT&&(u={props:{label:e,children:n},nodeKey:l}),r===w.EL_CASCADER&&(u={props:{label:e,value:l,children:n}}),r===w.EL_DATE_PICKER&&(u="datetime"===a.type?{valueFormat:"YYYY-MM-DD HH:mm:ss"}:(a.type,{valueFormat:"YYYY-MM-DD"})),r===w.EL_TIME_PICKER&&(u={valueFormat:"HH:mm:ss"}),{...u,...a}})),W=r((()=>{const e=j.column.props??{},l={};for(const[n,o]of Object.entries(e))n.startsWith("on")&&"function"==typeof o&&(l[n]=(...e)=>o(...e));return l})),G=r((()=>{const{props:{type:e,isRange:l,placeholder:n,notDefaultPlaceholder:o}={},el:r}=j.column?.props?j.column:{props:{},el:j.column?.el},t=`placeholder_${r}_${e}_${l}_${n}_${o}`;if(A.has(t))return A.get(t);let a;if(!["datetimerange","daterange","monthrange"].includes(e)&&!l||o){a={placeholder:n??(g(r)?.includes(w.EL_INPUT)?"请输入":"请选择")}}else a={rangeSeparator:"至",startPlaceholder:"开始时间",endPlaceholder:"结束时间"};return A.set(t,a),a})),X=r((()=>{const{props:{clearable:e}={},defaultValue:l}=j.column;return e??null==l})),Z=r((()=>{const{render:e,renderInView:l}=j.column,n=o(j.isView);if(j.isLazyLoading&&!j.isReady)return!1;if(n){return!(!l&&!e)}return!!e})),Q=M((()=>{const{disabled:e}=j.column;return"boolean"==typeof e?e:"function"==typeof e&&e(o(P))}),"isDisabled"),ee=a(e({name:"RenderSlots",props:["style","column","isView"],setup(e){const l=e.column.prop,r=n(""),t=n(null);return()=>{if(j.isLazyLoading&&!j.isReady)return u("div",{style:"min-height: 32px; opacity: 0.5;"},[s("Loading...")]);const{render:n,renderInView:a}=e.column,i=o(e.isView);let c=null;if(c=i&&a||n,!c)return null;const m=L(o(P),e.column.prop),p=o(H),d=c.toString(),f=d.includes("JSON.stringify"),y=d.includes("scope.model.")&&!d.includes(`scope.model.${l}`),v=d.match(/model\.(\w+)/g)||[],E=[...new Set(v.map((e=>e.replace("model.",""))))],h=E.length>1,_=(E.some((e=>e!==l)),d.includes("isView.value")),b=d.includes("formData.");let g={modelValue:m,isView:i,enumData:p};if(f||// 序列化整个scope,需要监听所有
|
|
2
2
|
y||// 访问scope.model的其他字段
|
|
3
|
-
h)g.fullModel=o(P);else{if(_&&(g.isView=i),b){const e=d.match(/formData\.(\w+)/g);e&&(g.formDataFields={},e.forEach((e=>{const l=e.replace("formData.","");g.formDataFields[l]=o(P)[l]})))}const e=E.filter((e=>e!==l));e.length>0&&(g.modelFields={},e.forEach((e=>{g.modelFields[e]=o(P)[e]})))}const R=JSON.stringify(g);if(r.value===R&&null!==t.value)return t.value;0;try{const e=c({model:o(P),data:m,enumData:p});return t.value=e,r.value=R,e}catch(l){return console.error(`Render error for ${e.column.prop}:`,l),null}}}})),le=M((()=>{const e=L(o(P),j.column.prop),l=g(j.column.el);if(l!==w.EL_SELECT&&l!==w.EL_SELECT_V2)return e;const n=o(B),r=o(H);if(j.column.props?.multiple){return r.filter((l=>e?.includes(l[n.value]))).map((e=>e[n.label])).join(",")}{const l=r.find((l=>l[n.value]===e));return l?l[n.label]:e}}),"getShowValue"),ne=a(e({name:"RenderElComponents",props:["column"],setup:e=>()=>{if(o(j.isView))return u("span",null,[le()]);const l=e.column.el,n=g(l);let r=C(l);if(!r&&n&&(r=C(n)),!r)return console.warn(`未找到组件: ${l} (也尝试了 ${n})`),null;switch(n){case w.EL_SELECT:case w.EL_SELECT_V2:return $(r,o(P),e.column,{...o(J),...o(W),ref:M((l=>{l&&q&&q.setComponentRef(e.column.prop,l)}),"ref")},o(G),o(X),o(J).disabled??Q(),o(H),o(B));case w.EL_RADIO_GROUP:case w.EL_RADIO:case w.EL_RADIO_BUTTON:return T(r,o(P),e.column,{...o(J),...o(W),ref:M((l=>{l&&q&&q.setComponentRef(e.column.prop,l)}),"ref")},o(J).disabled??Q(),o(H),o(B));case w.EL_CHECKBOX_GROUP:case w.EL_Checkbox:case w.EL_CHECKBOX_BUTTON:return D(r,o(P),e.column,{...o(J),...o(W),ref:M((l=>{l&&q&&q.setComponentRef(e.column.prop,l)}),"ref")},o(J).disabled??Q(),o(H),o(B));default:return S(r,o(P),e.column,{...o(G),clearable:o(X),disabled:Q(),...o(J),
|
|
3
|
+
h)g.fullModel=o(P);else{if(_&&(g.isView=i),b){const e=d.match(/formData\.(\w+)/g);e&&(g.formDataFields={},e.forEach((e=>{const l=e.replace("formData.","");g.formDataFields[l]=o(P)[l]})))}const e=E.filter((e=>e!==l));e.length>0&&(g.modelFields={},e.forEach((e=>{g.modelFields[e]=o(P)[e]})))}const R=JSON.stringify(g),C=!e.column.noCache;if(C&&r.value===R&&null!==t.value)return t.value;0;try{const e=c({model:o(P),data:m,enumData:p});return C&&(t.value=e,r.value=R),e}catch(l){return console.error(`Render error for ${e.column.prop}:`,l),null}}}})),le=M((()=>{const e=L(o(P),j.column.prop),l=g(j.column.el);if(l!==w.EL_SELECT&&l!==w.EL_SELECT_V2)return e;const n=o(B),r=o(H);if(j.column.props?.multiple){return r.filter((l=>e?.includes(l[n.value]))).map((e=>e[n.label])).join(",")}{const l=r.find((l=>l[n.value]===e));return l?l[n.label]:e}}),"getShowValue"),ne=a(e({name:"RenderElComponents",props:["column"],setup:e=>()=>{if(o(j.isView))return u("span",null,[le()]);const l=e.column.el,n=g(l);let r=C(l);if(!r&&n&&(r=C(n)),!r)return console.warn(`未找到组件: ${l} (也尝试了 ${n})`),null;switch(n){case w.EL_SELECT:case w.EL_SELECT_V2:return $(r,o(P),e.column,{...o(J),...o(W),ref:M((l=>{l&&q&&q.setComponentRef(e.column.prop,l)}),"ref")},o(G),o(X),o(J).disabled??Q(),o(H),o(B));case w.EL_RADIO_GROUP:case w.EL_RADIO:case w.EL_RADIO_BUTTON:return T(r,o(P),e.column,{...o(J),...o(W),ref:M((l=>{l&&q&&q.setComponentRef(e.column.prop,l)}),"ref")},o(J).disabled??Q(),o(H),o(B));case w.EL_CHECKBOX_GROUP:case w.EL_Checkbox:case w.EL_CHECKBOX_BUTTON:return D(r,o(P),e.column,{...o(J),...o(W),ref:M((l=>{l&&q&&q.setComponentRef(e.column.prop,l)}),"ref")},o(J).disabled??Q(),o(H),o(B));default:return S(r,o(P),e.column,{...o(G),clearable:o(X),disabled:Q(),...o(J),
|
|
4
4
|
// 用户props放在最后,优先级最高
|
|
5
5
|
...o(W),
|
|
6
6
|
// 事件处理函数最后添加
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZnFormV2Item.vue2.mjs","sources":["../../../../../../../packages/components/znFormV2/src/components/ZnFormV2Item.vue"],"sourcesContent":["<template>\n <!-- 调试信息 -->\n <div v-if=\"false\" style=\"margin: 5px; padding: 5px; border: 1px solid #ccc; color: #999; font-size: 12px\">\n [Debug] {{ column.prop }}: shouldUseCustomRender={{ shouldUseCustomRender }}, el={{ column.el }}, render={{ !!column.render }}, isView={{ isView }},\n isLazyLoading={{ isLazyLoading }}, isReady={{ isReady }}\n </div>\n\n <!-- 懒加载占位符 -->\n <div v-if=\"isLazyLoading && !isReady\" style=\"display: flex; align-items: center; min-height: 32px; transition: opacity 0.3s ease; opacity: 0.6\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n style=\"\n width: 12px;\n height: 12px;\n animation: spin 0.8s linear infinite;\n border: 1px solid #409eff;\n border-top: 1px solid transparent;\n border-radius: 50%;\n \"></div>\n <span style=\"color: #999; font-size: 12px\">{{ column.label || '' }} 加载中...</span>\n </div>\n </div>\n\n <!-- 实际组件内容 -->\n <template v-else>\n <RenderSlots v-if=\"shouldUseCustomRender\" :style=\"style\" :column=\"column\" :is-view=\"isView\" />\n\n <Tree\n v-else-if=\"hyphenToCamelCase(column.el) === ComponentNameEnum.EL_TREE\"\n :data=\"columnEnum\"\n :model-value=\"getFormProp(model, column.prop)\"\n @update:model-value=\"(v) => setFormProp(model, column.prop, v)\"\n v-bind=\"{ ...formProps, ...eventProps }\"\n :ref=\"(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(column.prop, ref)\n }\n }\" />\n\n <RenderElComponents v-else-if=\"hyphenToCamelCase(column.el)?.startsWith('El')\" :column=\"column\" />\n\n <RenderComponent v-else :style=\"style\" :column=\"column\" />\n </template>\n</template>\n\n<script setup lang=\"tsx\">\n import { computed, inject, markRaw, ref, resolveComponent, unref, Ref, shallowRef, nextTick, h, watchEffect, watch } from 'vue'\n\n import Tree from './Tree.vue'\n\n import { getFormProp, hyphenToCamelCase, setComponentSlots, setFormProp } from '../helper'\n import { getComponent } from '../helper/componentMap'\n import { ComponentNameEnum, formEnumMapKey, type ZnFormV2SchemaProps, type PascalCaseComponentName } from '../interface'\n import { useRenderCheckbox } from './useRenderCheckbox'\n import { useRenderComponent } from './useRenderComponent'\n import { useRenderRadio } from './useRenderRadio'\n import { useRenderSelect } from './useRenderSelect'\n import type { Component } from 'vue'\n import { defineComponent } from 'vue'\n import { useLocalStorage } from '@vueuse/core'\n\n defineOptions({ name: 'ZnFormV2Item' })\n\n interface ZnFormV2ItemProps {\n column: ZnFormV2SchemaProps\n style?: CSSStyleDeclaration\n isView?: boolean | Ref<boolean>\n isLazyLoading?: boolean\n isReady?: boolean\n }\n\n const props = defineProps({\n column: { type: Object, required: true },\n style: { required: false },\n isView: { type: Boolean, skipCheck: true, required: false, default: false },\n isLazyLoading: { type: Boolean, required: false, default: false },\n isReady: { type: Boolean, required: false, default: true }\n})\n\n const znygStore = useLocalStorage('znyg', { dictMap: {} })\n\n const model = defineModel<Record<string, any>>({ required: true })\n\n // 缓存计算结果\n const cachedResults = new Map()\n\n // 组件级别的渲染缓存\n const renderCache = new Map()\n const lastRenderKey = ref('')\n\n // 生成渲染缓存key\n const getRenderCacheKey = () => {\n const { prop, el, render, renderInView } = props.column\n const currentIsView = unref(props.isView)\n const modelValue = model.value[prop]\n\n return `${prop}_${el}_${currentIsView}_${JSON.stringify(modelValue)}_${!!render}_${!!renderInView}`\n }\n\n // 检查是否需要重新渲染\n const shouldRerender = computed(() => {\n const currentKey = getRenderCacheKey()\n const needRerender = currentKey !== lastRenderKey.value\n\n if (needRerender) {\n lastRenderKey.value = currentKey\n }\n\n return needRerender\n })\n\n // 判断 fieldNames 设置 label && value && children 的 key 值\n const fieldNames = computed(() => {\n const { dictCode } = props.column\n let label = props.column.fieldNames?.label ?? 'label'\n let value = props.column.fieldNames?.value ?? 'value'\n if (dictCode) {\n label = 'name'\n value = 'code'\n }\n\n return {\n label: label,\n value: value,\n children: props.column.fieldNames?.children ?? 'children',\n disabled: props.column.fieldNames?.disabled ?? 'disabled'\n }\n })\n\n // 接收 enumMap (el 为 select-v 2 需单独处理 enumData)\n const enumMap = inject(formEnumMapKey, ref(new Map()))\n\n // 接收实例引用收集器\n const componentRefsCollector = inject('componentRefsCollector', null)\n\n // 添加对column.enum的直接引用,提高响应性\n const rawEnum = computed(() => props.column.enum)\n\n const columnEnum = computed(() => {\n const { useEnumMap, enumKey, prop, el, dictCode } = props.column\n\n // 确保从enumMap获取最新数据\n const currentEnumMap = unref(enumMap)\n\n // 通过获取原始enum来确保依赖收集\n const currentRawEnum = unref(rawEnum)\n\n let result\n if (dictCode) {\n // 如果存在dictCode,则直接从字典中获取\n if (znygStore && znygStore.value?.dictMap) {\n result = znygStore.value.dictMap[dictCode?.toString()] ?? []\n }\n }\n\n if (useEnumMap) {\n if (typeof useEnumMap === 'function') {\n result = useEnumMap(currentEnumMap)\n } else {\n const data = currentEnumMap.get(useEnumMap)\n if (!data) {\n result = []\n } else if (enumKey) {\n result = data[enumKey] || []\n } else {\n result = data\n }\n }\n }\n\n if (!result) {\n // 如果直接的enum是数组且不为空,优先使用它\n if (Array.isArray(currentRawEnum) && currentRawEnum.length > 0) {\n result = currentRawEnum\n } else {\n // 否则从enumMap中获取\n let enumData = currentEnumMap.get(prop)\n\n if (!enumData) {\n result = []\n } else if (hyphenToCamelCase(el) === ComponentNameEnum.EL_SELECT_V2) {\n result = enumData.map((item: Record<string, any>) => {\n return { ...item, label: item[unref(fieldNames).label], value: item[unref(fieldNames).value] }\n })\n } else if (enumKey) {\n result = enumData[enumKey] || []\n } else {\n result = enumData\n }\n }\n }\n\n return result || []\n })\n\n // 处理透传的 formProps (el 为 tree-select、cascader 的时候需要给下默认 label && value && children)\n const formProps = computed(() => {\n const label = unref(fieldNames).label\n const value = unref(fieldNames).value\n const children = unref(fieldNames).children\n const formEl = hyphenToCamelCase(props.column?.el)\n let userProps = props.column.props ?? {}\n\n // 处理动态属性(函数形式的属性需要实时计算)\n const processedUserProps: Record<string, any> = {}\n for (const [key, val] of Object.entries(userProps)) {\n // 跳过事件处理函数,这些需要单独处理以确保正确的作用域\n if (key.startsWith('on') && typeof val === 'function') {\n continue\n }\n\n if (typeof val === 'function') {\n // 对于函数形式的属性,实时计算其值\n processedUserProps[key] = val(unref(model))\n } else {\n processedUserProps[key] = val\n }\n }\n\n // 基础属性(默认值,优先级最低)\n let baseProps = {}\n\n if (formEl === ComponentNameEnum.EL_TREE_SELECT) {\n baseProps = { props: { label, children }, nodeKey: value }\n }\n\n if (formEl === ComponentNameEnum.EL_CASCADER) {\n baseProps = { props: { label, value, children } }\n }\n\n if (formEl === ComponentNameEnum.EL_DATE_PICKER) {\n if (processedUserProps.type === 'datetime') baseProps = { valueFormat: 'YYYY-MM-DD HH:mm:ss' }\n else if (processedUserProps.type === 'date') baseProps = { valueFormat: 'YYYY-MM-DD' }\n else baseProps = { valueFormat: 'YYYY-MM-DD' }\n }\n\n if (formEl === ComponentNameEnum.EL_TIME_PICKER) baseProps = { valueFormat: 'HH:mm:ss' }\n\n // 合并属性:基础属性在前,用户属性在后(用户属性优先级更高)\n return { ...baseProps, ...processedUserProps }\n })\n\n // 处理事件属性 - 单独处理以确保正确的作用域和参数\n const eventProps = computed(() => {\n const userProps = props.column.props ?? {}\n const events: Record<string, any> = {}\n\n for (const [key, val] of Object.entries(userProps)) {\n if (key.startsWith('on') && typeof val === 'function') {\n // 为每个事件创建一个包装函数,确保正确的参数传递\n events[key] = (...args: any[]) => {\n // 对于 onChange 事件,传递组件的原始参数,而不是整个表单数据\n return val(...args)\n }\n }\n }\n\n return events\n })\n\n // 处理默认 placeholder\n const placeholder = computed(() => {\n const { props: { type, isRange, placeholder, notDefaultPlaceholder } = {}, el } = props.column?.props ? props.column : { props: {}, el: props.column?.el }\n\n // 创建缓存键\n const cacheKey = `placeholder_${el}_${type}_${isRange}_${placeholder}_${notDefaultPlaceholder}`\n\n // 检查缓存\n if (cachedResults.has(cacheKey)) {\n return cachedResults.get(cacheKey)\n }\n\n let result\n if ((['datetimerange', 'daterange', 'monthrange'].includes(type) || isRange) && !notDefaultPlaceholder) {\n result = { rangeSeparator: '至', startPlaceholder: '开始时间', endPlaceholder: '结束时间' }\n } else {\n const placeholderConst = placeholder ?? (hyphenToCamelCase(el)?.includes(ComponentNameEnum.EL_INPUT) ? '请输入' : '请选择')\n result = { placeholder: placeholderConst }\n }\n\n // 缓存结果\n cachedResults.set(cacheKey, result)\n return result\n })\n\n // 是否有清除按钮 (当有默认值时,清除按钮不显示)\n const clearable = computed(() => {\n const { props: { clearable } = {}, defaultValue } = props.column\n return clearable ?? (defaultValue === null || defaultValue === undefined)\n })\n\n // 判断是否应该使用自定义渲染\n const shouldUseCustomRender = computed(() => {\n const { render, renderInView } = props.column\n const currentIsView = unref(props.isView)\n\n // 懒加载状态检查:如果组件未准备好,延迟自定义渲染\n if (props.isLazyLoading && !props.isReady) {\n return false\n }\n\n // 在查看模式下:优先使用 renderInView,如果没有则使用 render\n if (currentIsView) {\n const result = !!(renderInView || render)\n return result\n }\n\n // 在编辑模式下:只使用 render\n const result = !!render\n return result\n })\n\n // 是否禁用 - 检查schema级别的disabled(props中的disabled已在formProps中处理)\n const isDisabled = () => {\n const { disabled } = props.column\n if (typeof disabled === 'boolean') return disabled\n if (typeof disabled === 'function') {\n return disabled(unref(model))\n }\n return false\n }\n\n // 全局渲染计数器,用于调试\n const globalRenderCounters = new Map<string, number>()\n\n // 渲染自定义slot - 使用缓存减少不必要的重复渲染\nconst RenderSlots = markRaw(\n defineComponent({\n name: 'RenderSlots',\n props: ['style', 'column', 'isView'],\n setup(slotProps) {\n const prop = slotProps.column.prop\n\n // 使用简单的缓存机制\n const lastRenderInputs = ref<string>('')\n const cachedResult = ref(null)\n let renderCount = 0\n\n return () => {\n // 检查懒加载状态,如果未准备好则显示占位符\n if (props.isLazyLoading && !props.isReady) {\n return <div style=\"min-height: 32px; opacity: 0.5;\">Loading...</div>\n }\n\n const { render, renderInView } = slotProps.column\n const currentIsView = unref(slotProps.isView)\n\n let renderFunction = null\n\n // 在查看模式下:优先使用 renderInView,如果没有则使用 render\n if (currentIsView) {\n renderFunction = renderInView || render\n } else {\n // 在编辑模式下:只使用 render\n renderFunction = render\n }\n\n if (!renderFunction) return null\n\n // 创建当前渲染输入的快照\n const modelData = getFormProp(unref(model), slotProps.column.prop)\n const enumData = unref(columnEnum)\n\n const renderFuncStr = renderFunction.toString()\n\n // 智能检测render函数的依赖范围\n const usesJsonStringify = renderFuncStr.includes('JSON.stringify')\n const usesScopeModel = renderFuncStr.includes('scope.model.') &&\n !renderFuncStr.includes(`scope.model.${prop}`) // 排除访问自己字段的情况\n const modelFields = renderFuncStr.match(/model\\.(\\w+)/g) || []\n const accessedFields = [...new Set(modelFields.map(field => field.replace('model.', '')))]\n const usesMultipleModelFields = accessedFields.length > 1\n const usesOtherModelFields = accessedFields.some(field => field !== prop) // 访问了其他字段\n\n // 对于简单的外部变量访问(如isView, formData),采用智能缓存策略\n const usesIsViewDirectly = renderFuncStr.includes('isView.value')\n const usesFormDataDirectly = renderFuncStr.includes('formData.')\n const usesSimpleExternalVars = usesIsViewDirectly || usesFormDataDirectly\n\n // 检测依赖策略 - 重新调整优先级\n const accessesComplexDeps = usesJsonStringify || // 序列化整个scope,需要监听所有\n usesScopeModel || // 访问scope.model的其他字段\n usesMultipleModelFields // 访问多个model字段\n\n // 根据不同类型的依赖采用不同的缓存策略\n let cacheInputs: any = {\n modelValue: modelData,\n isView: currentIsView,\n enumData: enumData\n }\n\n if (accessesComplexDeps) {\n // 访问多个字段或复杂依赖,监听整个model\n cacheInputs.fullModel = unref(model)\n } else {\n // 精确监听依赖:只监听真正访问的字段和外部变量\n\n // 添加外部变量依赖\n if (usesIsViewDirectly) {\n cacheInputs.isView = currentIsView\n }\n if (usesFormDataDirectly) {\n // 尝试提取具体访问的formData字段\n const formDataFields = renderFuncStr.match(/formData\\.(\\w+)/g)\n if (formDataFields) {\n cacheInputs.formDataFields = {}\n formDataFields.forEach((field: string) => {\n const fieldName = field.replace('formData.', '')\n ;(cacheInputs.formDataFields as any)[fieldName] = (unref(model) as any)[fieldName]\n })\n }\n }\n\n // 添加其他model字段依赖(不包括自己的字段,因为modelValue已经包含)\n const otherFields = accessedFields.filter(field => field !== prop)\n if (otherFields.length > 0) {\n cacheInputs.modelFields = {}\n otherFields.forEach((fieldName: string) => {\n ;(cacheInputs.modelFields as any)[fieldName] = (unref(model) as any)[fieldName]\n })\n }\n }\n\n const currentInputs = JSON.stringify(cacheInputs)\n\n // 如果输入没有变化,返回缓存的结果\n if (lastRenderInputs.value === currentInputs && cachedResult.value !== null) {\n return cachedResult.value\n }\n\n // 输入有变化,重新渲染\n renderCount++\n\n try {\n const renderScope = {\n model: unref(model),\n data: modelData,\n enumData: enumData\n }\n\n // 执行render函数\n const result = renderFunction(renderScope)\n\n // 缓存结果和输入\n cachedResult.value = result\n lastRenderInputs.value = currentInputs\n\n return result\n } catch (error) {\n console.error(`Render error for ${slotProps.column.prop}:`, error)\n return null\n }\n }\n }\n })\n)\n\n // 计算要显示的值(查看模式用)\n const getShowValue = () => {\n const val = getFormProp(unref(model), props.column.prop)\n const formEl = hyphenToCamelCase(props.column.el)\n\n if (formEl !== ComponentNameEnum.EL_SELECT && formEl !== ComponentNameEnum.EL_SELECT_V2) {\n return val\n }\n\n const currentFieldNames = unref(fieldNames)\n const currentColumnEnum = unref(columnEnum)\n\n if (props.column.props?.multiple) {\n // 多选下拉框\n const selectedItemList = currentColumnEnum.filter((_: any) => val?.includes(_[currentFieldNames.value]))\n return selectedItemList.map((_: any) => _[currentFieldNames.label]).join(',')\n } else {\n const selectedItem = currentColumnEnum.find((_: any) => _[currentFieldNames.value] === val)\n return selectedItem ? selectedItem[currentFieldNames.label] : val\n }\n }\n\n // 渲染Element组件\n const RenderElComponents = markRaw(\n defineComponent({\n name: 'RenderElComponents',\n props: ['column'],\n setup(elProps) {\n return () => {\n // 如果是查看模式,显示纯文本\n if (unref(props.isView)) {\n return <span>{getShowValue()}</span>\n }\n\n const originalEl = elProps.column.el\n const formEl = hyphenToCamelCase(originalEl)\n\n // 首先尝试使用原始格式(kebab-case 优先)\n let componentName = getComponent(originalEl!)\n\n // 如果没找到,尝试转换后的格式\n if (!componentName && formEl) {\n componentName = getComponent(formEl)\n }\n\n if (!componentName) {\n console.warn(`未找到组件: ${originalEl} (也尝试了 ${formEl})`)\n return null\n }\n\n // 根据不同组件类型使用不同的渲染逻辑\n switch (formEl) {\n case ComponentNameEnum.EL_SELECT:\n case ComponentNameEnum.EL_SELECT_V2:\n return useRenderSelect(\n componentName,\n unref(model),\n elProps.column,\n {\n ...unref(formProps),\n ...unref(eventProps),\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n },\n unref(placeholder),\n unref(clearable),\n (unref(formProps) as any).disabled ?? isDisabled(),\n unref(columnEnum),\n unref(fieldNames)\n )\n\n case ComponentNameEnum.EL_RADIO_GROUP:\n case ComponentNameEnum.EL_RADIO:\n case ComponentNameEnum.EL_RADIO_BUTTON:\n return useRenderRadio(\n componentName,\n unref(model),\n elProps.column,\n {\n ...unref(formProps),\n ...unref(eventProps),\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n },\n (unref(formProps) as any).disabled ?? isDisabled(),\n unref(columnEnum),\n unref(fieldNames)\n )\n\n case ComponentNameEnum.EL_CHECKBOX_GROUP:\n case ComponentNameEnum.EL_Checkbox:\n case ComponentNameEnum.EL_CHECKBOX_BUTTON:\n return useRenderCheckbox(\n componentName,\n unref(model),\n elProps.column,\n {\n ...unref(formProps),\n ...unref(eventProps),\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n },\n (unref(formProps) as any).disabled ?? isDisabled(),\n unref(columnEnum),\n unref(fieldNames)\n )\n\n default:\n return useRenderComponent(componentName, unref(model), elProps.column, {\n ...unref(placeholder),\n clearable: unref(clearable),\n disabled: isDisabled(),\n ...unref(formProps), // 用户props放在最后,优先级最高\n ...unref(eventProps), // 事件处理函数最后添加\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n })\n }\n }\n }\n })\n )\n\n // 渲染自定义组件\n const RenderComponent = markRaw(\n defineComponent({\n name: 'RenderComponent',\n props: ['style', 'column'],\n setup(componentProps) {\n return () => {\n const { el } = componentProps.column\n\n try {\n const Component = resolveComponent(el!)\n\n if (!Component) {\n console.warn(`未找到自定义组件: ${el}`)\n return null\n }\n\n return h(Component, {\n modelValue: getFormProp(unref(model), componentProps.column.prop),\n 'onUpdate:modelValue': (val: any) => setFormProp(unref(model), componentProps.column.prop, val),\n style: componentProps.style,\n ...unref(placeholder),\n clearable: unref(clearable),\n disabled: isDisabled(),\n ...unref(formProps), // 用户props放在最后,优先级最高\n ...unref(eventProps), // 事件处理函数最后添加\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(componentProps.column.prop, ref)\n }\n }\n })\n } catch (error) {\n console.error(`渲染自定义组件失败: ${el}`, error)\n return null\n }\n }\n }\n })\n )\n</script>\n"],"names":["props","__props","znygStore","useLocalStorage","dictMap","model","_useModel","cachedResults","Map","lastRenderKey","ref","getRenderCacheKey","__name","prop","el","render","renderInView","column","currentIsView","unref","isView","modelValue","value","JSON","stringify","fieldNames","computed","currentKey","needRerender","dictCode","label","children","disabled","enumMap","inject","formEnumMapKey","componentRefsCollector","rawEnum","enum","columnEnum","useEnumMap","enumKey","currentEnumMap","currentRawEnum","result","toString","data","get","Array","isArray","length","enumData","hyphenToCamelCase","ComponentNameEnum","EL_SELECT_V2","map","item","formProps","formEl","userProps","processedUserProps","key","val","Object","entries","startsWith","baseProps","EL_TREE_SELECT","nodeKey","EL_CASCADER","EL_DATE_PICKER","type","valueFormat","EL_TIME_PICKER","eventProps","events","args","placeholder","isRange","notDefaultPlaceholder","cacheKey","has","includes","EL_INPUT","rangeSeparator","startPlaceholder","endPlaceholder","set","clearable","defaultValue","undefined","shouldUseCustomRender","isLazyLoading","isReady","isDisabled","RenderSlots","markRaw","defineComponent","name","setup","slotProps","lastRenderInputs","cachedResult","_createVNode","style","_createTextVNode","renderFunction","modelData","getFormProp","renderFuncStr","usesJsonStringify","usesScopeModel","modelFields","match","accessedFields","Set","field","replace","usesMultipleModelFields","usesIsViewDirectly","some","usesFormDataDirectly","cacheInputs","fullModel","formDataFields","forEach","fieldName","otherFields","filter","currentInputs","renderCount","error","console","getShowValue","EL_SELECT","currentFieldNames","currentColumnEnum","multiple","selectedItemList","_","join","selectedItem","find","RenderElComponents","elProps","originalEl","componentName","getComponent","warn","useRenderSelect","setComponentRef","EL_RADIO_GROUP","EL_RADIO","EL_RADIO_BUTTON","useRenderRadio","EL_CHECKBOX_GROUP","EL_Checkbox","EL_CHECKBOX_BUTTON","useRenderCheckbox","useRenderComponent","RenderComponent","componentProps","Component","resolveComponent","h","setFormProp"],"mappings":"qjDAuEE,MAAMA,EAAQC,EAQRC,EAAYC,EAAgB,OAAQ,CAAEC,QAAS,CAAA,IAE/CC,EAAQC,EAAmDL,EAAA,cAG3DM,MAAoBC,IAIpBC,EAAgBC,EAAI,IAGpBC,EAA0BC,GAAA,KACxB,MAAAC,KAAEA,EAAAA,GAAMC,EAAAA,OAAIC,EAAAA,aAAQC,GAAiBhB,EAAMiB,OAC3CC,EAAgBC,EAAMnB,EAAMoB,QAC5BC,EAAahB,EAAMiB,MAAMT,GAE/B,MAAO,GAAGA,KAAQC,KAAMI,KAAiBK,KAAKC,UAAUH,QAAiBN,OAAYC,GAAY,GALzEL,qBAqBpBc,GAZiBC,GAAS,KAC9B,MAAMC,EAAahB,IACbiB,EAAeD,IAAelB,EAAca,MAM3CM,OAJHA,IACFnB,EAAca,MAAQK,GAGjBC,CAAAA,IAIUF,GAAS,KACpB,MAAAG,SAAEA,GAAa7B,EAAMiB,OAC3B,IAAIa,EAAQ9B,EAAMiB,OAAOQ,YAAYK,OAAS,QAC1CR,EAAQtB,EAAMiB,OAAOQ,YAAYH,OAAS,QAMvC,OALHO,IACMC,EAAA,OACAR,EAAA,QAGH,CACLQ,QACAR,QACAS,SAAU/B,EAAMiB,OAAOQ,YAAYM,UAAY,WAC/CC,SAAUhC,EAAMiB,OAAOQ,YAAYO,UAAY,WACjD,KAIIC,EAAUC,EAAOC,EAAgBzB,EAAQF,IAAAA,MAGzC4B,EAAyBF,EAAO,yBAA0B,MAG1DG,EAAUX,GAAS,IAAM1B,EAAMiB,OAAOqB,OAEtCC,EAAab,GAAS,KACpB,MAAAc,WAAEA,EAAAA,QAAYC,EAAAA,KAAS5B,EAAAA,GAAMC,EAAAA,SAAIe,GAAa7B,EAAMiB,OAGpDyB,EAAiBvB,EAAMc,GAGvBU,EAAiBxB,EAAMkB,GAEzBO,IAAAA,EAQJ,GAPIf,GAEE3B,GAAaA,EAAUoB,OAAOlB,UAChCwC,EAAS1C,EAAUoB,MAAMlB,QAAQyB,GAAUgB,aAAe,IAI1DL,EACE,GAAsB,mBAAfA,EACTI,EAASJ,EAAWE,OACf,CACCI,MAAAA,EAAOJ,EAAeK,IAAIP,GAIrBM,EAHNA,EAEML,EACAK,EAAKL,IAAY,GAEjBK,EAJA,EAKX,CAIJ,IAAKF,EAEH,GAAII,MAAMC,QAAQN,IAAmBA,EAAeO,OAAS,EAClDP,EAAAA,MACJ,CAEDQ,IAAAA,EAAWT,EAAeK,IAAIlC,GAKvBsC,EAHNA,EAEMC,EAAkBtC,KAAQuC,EAAkBC,aAC5CH,EAASI,KAAmCC,IAC5C,IAAKA,EAAM1B,MAAO0B,EAAKrC,EAAMM,GAAYK,OAAQR,MAAOkC,EAAKrC,EAAMM,GAAYH,WAE/EmB,EACAU,EAASV,IAAY,GAErBU,EARA,EASX,CAIJ,OAAOP,GAAU,EAAC,IAIda,EAAY/B,GAAS,KACnBI,MAAAA,EAAQX,EAAMM,GAAYK,MAC1BR,EAAQH,EAAMM,GAAYH,MAC1BS,EAAWZ,EAAMM,GAAYM,SAC7B2B,EAASN,EAAkBpD,EAAMiB,QAAQH,IAC/C,IAAI6C,EAAY3D,EAAMiB,OAAOjB,OAAS,CAAC,EAGvC,MAAM4D,EAA0C,CAAC,EACjD,IAAA,MAAYC,EAAKC,KAAQC,OAAOC,QAAQL,GAElCE,EAAII,WAAW,OAAwB,mBAARH,IAMjCF,EAAmBC,GAFF,mBAARC,EAEiBA,EAAI3C,EAAMd,IAEVyD,GAK9B,IAAII,EAAY,CAAC,EAmBV,OAjBHR,IAAWL,EAAkBc,iBACnBD,EAAA,CAAElE,MAAO,CAAE8B,QAAOC,YAAYqC,QAAS9C,IAGjDoC,IAAWL,EAAkBgB,cACnBH,EAAA,CAAElE,MAAO,CAAE8B,QAAOR,QAAOS,cAGnC2B,IAAWL,EAAkBiB,iBACyBJ,EAAxB,aAA5BN,EAAmBW,KAAiC,CAAEC,YAAa,wBAC9DZ,EAAmBW,KAA6B,CAAEC,YAAa,gBAItEd,IAAWL,EAAkBoB,iBAA4BP,EAAA,CAAEM,YAAa,aAGrE,IAAKN,KAAcN,EAAmB,IAIzCc,EAAahD,GAAS,KAC1B,MAAMiC,EAAY3D,EAAMiB,OAAOjB,OAAS,CAAC,EACnC2E,EAA8B,CAAC,EAErC,IAAA,MAAYd,EAAKC,KAAQC,OAAOC,QAAQL,GAClCE,EAAII,WAAW,OAAwB,mBAARH,IAE1BD,EAAAA,GAAO,IAAIe,IAETd,KAAOc,IAKbD,OAAAA,CAAAA,IAIHE,EAAcnD,GAAS,KACrB,MAAE1B,OAAOuE,KAAEA,EAAAA,QAAMO,EAASD,YAAAA,EAAAA,sBAAaE,GAA0B,CAAC,EAAAjE,GAAGA,GAAOd,EAAMiB,QAAQjB,MAAQA,EAAMiB,OAAS,CAAEjB,MAAO,CAAC,EAAGc,GAAId,EAAMiB,QAAQH,IAGhJkE,EAAW,eAAelE,KAAMyD,KAAQO,KAAWD,KAAeE,IAGpExE,GAAAA,EAAc0E,IAAID,GACbzE,OAAAA,EAAcwC,IAAIiC,GAGvBpC,IAAAA,EACC,IAAA,CAAC,gBAAiB,YAAa,cAAcsC,SAASX,KAASO,GAAaC,EAE1E,CAEInC,EAAA,CAAEiC,YADcA,IAAgBzB,EAAkBtC,IAAKoE,SAAS7B,EAAkB8B,UAAY,MAAQ,OACtE,MAHhCvC,EAAA,CAAEwC,eAAgB,IAAKC,iBAAkB,OAAQC,eAAgB,QAQrE1C,OADO2C,EAAAA,IAAIP,EAAUpC,GACrBA,CAAAA,IAIH4C,EAAY9D,GAAS,KACnB,MAAE1B,OAASwF,UAAAA,GAAc,CAAC,EAAAC,aAAGA,GAAiBzF,EAAMiB,OACnDuE,OAAAA,GAAAA,MAAcC,CAA0CC,IAI3DC,EAAwBjE,GAAS,KAC/B,MAAAX,OAAEA,EAAAA,aAAQC,GAAiBhB,EAAMiB,OACjCC,EAAgBC,EAAMnB,EAAMoB,QAGlC,GAAIpB,EAAM4F,gBAAkB5F,EAAM6F,QACzB,OAAA,EAIT,GAAI3E,EAAe,CAEV0B,SADW5B,IAAgBD,EAC3B6B,CAKFA,QADU7B,CACV6B,IAIHkD,EAAmBlF,GAAA,KACjB,MAAAoB,SAAEA,GAAahC,EAAMiB,OACvB,MAAoB,kBAAbe,EAA+BA,EAClB,mBAAbA,GACFA,EAASb,EAAMd,GAEjB,GANUyF,cAafC,GAAcC,EACFC,EAAA,CACdC,KAAM,cACNlG,MAAO,CAAC,QAAS,SAAU,UAC3BmG,KAAAA,CAAMC,GACEvF,MAAAA,EAAOuF,EAAUnF,OAAOJ,KAGxBwF,EAAmB3F,EAAY,IAC/B4F,EAAe5F,EAAI,MAGzB,MAAO,KAEL,GAAIV,EAAM4F,gBAAkB5F,EAAM6F,QAChC,OAAAU,EAAA,MAAA,CAAAC,MAAA,mCAAA,CAAAC,EAAA,gBAGI,MAAA1F,OAAEA,EAAAA,aAAQC,GAAiBoF,EAAUnF,OACrCC,EAAgBC,EAAMiF,EAAUhF,QAEtC,IAAIsF,EAAiB,KAUjB,GANFA,EADExF,GACeF,GAGAD,GAGd2F,EAAuB,OAAA,KAG5B,MAAMC,EAAYC,EAAYzF,EAAMd,GAAQ+F,EAAUnF,OAAOJ,MACvDsC,EAAWhC,EAAMoB,GAEjBsE,EAAgBH,EAAe7D,WAG/BiE,EAAoBD,EAAc3B,SAAS,kBAC3C6B,EAAiBF,EAAc3B,SAAS,kBACvB2B,EAAc3B,SAAS,eAAerE,KACvDmG,EAAcH,EAAcI,MAAM,kBAAoB,GACtDC,EAAiB,IAAI,IAAIC,IAAIH,EAAYzD,KAAa6D,GAAAA,EAAMC,QAAQ,SAAU,QAC9EC,EAA0BJ,EAAehE,OAAS,EAIlDqE,GAHuBL,EAAeM,MAAKJ,GAASA,IAAUvG,IAGzCgG,EAAc3B,SAAS,iBAC5CuC,EAAuBZ,EAAc3B,SAAS,aASpD,IAAIwC,EAAmB,CACrBrG,WAAYsF,EACZvF,OAAQF,EACRiC,YAGF,GAX4B2D;AACDC;AACAO,EAWbK,EAAAA,UAAYxG,EAAMd,OACzB,CAOL,GAHIkH,IACFG,EAAYtG,OAASF,GAEnBuG,EAAsB,CAElBG,MAAAA,EAAiBf,EAAcI,MAAM,oBACvCW,IACFF,EAAYE,eAAiB,CAAC,EAC9BA,EAAeC,SAA2BT,IACxC,MAAMU,EAAYV,EAAMC,QAAQ,YAAa,IAC3CK,EAAYE,eAAuBE,GAAc3G,EAAMd,GAAeyH,EAAS,IAErF,CAIF,MAAMC,EAAcb,EAAec,QAAOZ,GAASA,IAAUvG,IACzDkH,EAAY7E,OAAS,IACvBwE,EAAYV,YAAc,CAAC,EAC3Be,EAAYF,SAA+BC,IACvCJ,EAAYV,YAAoBc,GAAc3G,EAAMd,GAAeyH,EAAS,IAElF,CAGIG,MAAAA,EAAgB1G,KAAKC,UAAUkG,GAGrC,GAAIrB,EAAiB/E,QAAU2G,GAAwC,OAAvB3B,EAAahF,MAC3D,OAAOgF,EAAahF,MAItB4G,EAEI,IACF,MAOMtF,EAAS8D,EAPK,CAClBrG,MAAOc,EAAMd,GACbyC,KAAM6D,EACNxD,aAUKP,OAHP0D,EAAahF,MAAQsB,EACrByD,EAAiB/E,MAAQ2G,EAElBrF,QACAuF,GAEA,OADPC,QAAQD,MAAM,oBAAoB/B,EAAUnF,OAAOJ,QAASsH,GACrD,IAAA,EAEX,KAMEE,GAAqBzH,GAAA,KACzB,MAAMkD,EAAM8C,EAAYzF,EAAMd,GAAQL,EAAMiB,OAAOJ,MAC7C6C,EAASN,EAAkBpD,EAAMiB,OAAOH,IAE9C,GAAI4C,IAAWL,EAAkBiF,WAAa5E,IAAWL,EAAkBC,aAClEQ,OAAAA,EAGHyE,MAAAA,EAAoBpH,EAAMM,GAC1B+G,EAAoBrH,EAAMoB,GAE5BvC,GAAAA,EAAMiB,OAAOjB,OAAOyI,SAAU,CAGzBC,OADkBF,EAAkBR,QAAmBlE,GAAAA,GAAKoB,SAASyD,EAAEJ,EAAkBjH,UACxEiC,KAAgBoF,GAAAA,EAAEJ,EAAkBzG,SAAQ8G,KAAK,IAAG,CACvE,CACCC,MAAAA,EAAeL,EAAkBM,MAAMH,GAAWA,EAAEJ,EAAkBjH,SAAWwC,IACvF,OAAO+E,EAAeA,EAAaN,EAAkBzG,OAASgC,CAAAA,IAjB7CuE,gBAsBfU,GAAqB/C,EACTC,EAAA,CACdC,KAAM,qBACNlG,MAAO,CAAC,UACRmG,MAAM6C,GACG,KAED7H,GAAAA,EAAMnB,EAAMoB,QACd,OAAAmF,EAAA,OAAA,KAAA,CAAc8B,OAGVY,MAAAA,EAAaD,EAAQ/H,OAAOH,GAC5B4C,EAASN,EAAkB6F,GAG7BC,IAAAA,EAAgBC,EAAaF,GAOjC,IAJKC,GAAiBxF,IACpBwF,EAAgBC,EAAazF,KAG1BwF,EAEI,OADPd,QAAQgB,KAAK,UAAUH,WAAoBvF,MACpC,KAIT,OAAQA,GACN,KAAKL,EAAkBiF,UACvB,KAAKjF,EAAkBC,aACrB,OAAO+F,EACLH,EACA/H,EAAMd,GACN2I,EAAQ/H,OACR,IACKE,EAAMsC,MACNtC,EAAMuD,GACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBkH,gBAAgBN,EAAQ/H,OAAOJ,KAAMH,EAAG,GAF7DA,QAMRS,EAAM0D,GACN1D,EAAMqE,GACLrE,EAAMsC,GAAmBzB,UAAY8D,IACtC3E,EAAMoB,GACNpB,EAAMM,IAGV,KAAK4B,EAAkBkG,eACvB,KAAKlG,EAAkBmG,SACvB,KAAKnG,EAAkBoG,gBACrB,OAAOC,EACLR,EACA/H,EAAMd,GACN2I,EAAQ/H,OACR,IACKE,EAAMsC,MACNtC,EAAMuD,GACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBkH,gBAAgBN,EAAQ/H,OAAOJ,KAAMH,EAAG,GAF7DA,QAMPS,EAAMsC,GAAmBzB,UAAY8D,IACtC3E,EAAMoB,GACNpB,EAAMM,IAGV,KAAK4B,EAAkBsG,kBACvB,KAAKtG,EAAkBuG,YACvB,KAAKvG,EAAkBwG,mBACrB,OAAOC,EACLZ,EACA/H,EAAMd,GACN2I,EAAQ/H,OACR,IACKE,EAAMsC,MACNtC,EAAMuD,GACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBkH,gBAAgBN,EAAQ/H,OAAOJ,KAAMH,EAAG,GAF7DA,QAMPS,EAAMsC,GAAmBzB,UAAY8D,IACtC3E,EAAMoB,GACNpB,EAAMM,IAGV,QACE,OAAOsI,EAAmBb,EAAe/H,EAAMd,GAAQ2I,EAAQ/H,OAAQ,IAClEE,EAAM0D,GACTW,UAAWrE,EAAMqE,GACjBxD,SAAU8D,OACP3E,EAAMsC;;GACNtC,EAAMuD;;AACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBkH,gBAAgBN,EAAQ/H,OAAOJ,KAAMH,EAAG,GAF7DA,SAKP,KAQPsJ,GAAkBhE,EACNC,EAAA,CACdC,KAAM,kBACNlG,MAAO,CAAC,QAAS,UACjBmG,MAAM8D,GACG,KACC,MAAAnJ,GAAEA,GAAOmJ,EAAehJ,OAE1B,IACIiJ,MAAAA,EAAYC,EAAiBrJ,GAEnC,OAAKoJ,EAKEE,EAAEF,EAAW,CAClB7I,WAAYuF,EAAYzF,EAAMd,GAAQ4J,EAAehJ,OAAOJ,MAC5D,sBAAqCwJ,GAAAA,GAAAA,EAAYlJ,EAAMd,GAAQ4J,EAAehJ,OAAOJ,KAAMiD,IAAnEA,uBACxB0C,MAAOyD,EAAezD,SACnBrF,EAAM0D,GACTW,UAAWrE,EAAMqE,GACjBxD,SAAU8D,OACP3E,EAAMsC;;GACNtC,EAAMuD;;AACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBkH,gBAAgBW,EAAehJ,OAAOJ,KAAMH,EAAG,GAFpEA,UAbE0I,QAAAA,KAAK,aAAatI,KACnB,YAkBFqH,GAEA,OADPC,QAAQD,MAAM,cAAcrH,IAAMqH,GAC3B,IAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"ZnFormV2Item.vue2.mjs","sources":["../../../../../../../packages/components/znFormV2/src/components/ZnFormV2Item.vue"],"sourcesContent":["<template>\n <!-- 调试信息 -->\n <div v-if=\"false\" style=\"margin: 5px; padding: 5px; border: 1px solid #ccc; color: #999; font-size: 12px\">\n [Debug] {{ column.prop }}: shouldUseCustomRender={{ shouldUseCustomRender }}, el={{ column.el }}, render={{ !!column.render }}, isView={{ isView }},\n isLazyLoading={{ isLazyLoading }}, isReady={{ isReady }}\n </div>\n\n <!-- 懒加载占位符 -->\n <div v-if=\"isLazyLoading && !isReady\" style=\"display: flex; align-items: center; min-height: 32px; transition: opacity 0.3s ease; opacity: 0.6\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n style=\"\n width: 12px;\n height: 12px;\n animation: spin 0.8s linear infinite;\n border: 1px solid #409eff;\n border-top: 1px solid transparent;\n border-radius: 50%;\n \"></div>\n <span style=\"color: #999; font-size: 12px\">{{ column.label || '' }} 加载中...</span>\n </div>\n </div>\n\n <!-- 实际组件内容 -->\n <template v-else>\n <RenderSlots v-if=\"shouldUseCustomRender\" :style=\"style\" :column=\"column\" :is-view=\"isView\" />\n\n <Tree\n v-else-if=\"hyphenToCamelCase(column.el) === ComponentNameEnum.EL_TREE\"\n :data=\"columnEnum\"\n :model-value=\"getFormProp(model, column.prop)\"\n @update:model-value=\"(v) => setFormProp(model, column.prop, v)\"\n v-bind=\"{ ...formProps, ...eventProps }\"\n :ref=\"(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(column.prop, ref)\n }\n }\" />\n\n <RenderElComponents v-else-if=\"hyphenToCamelCase(column.el)?.startsWith('El')\" :column=\"column\" />\n\n <RenderComponent v-else :style=\"style\" :column=\"column\" />\n </template>\n</template>\n\n<script setup lang=\"tsx\">\n import { computed, inject, markRaw, ref, resolveComponent, unref, Ref, shallowRef, nextTick, h, watchEffect, watch } from 'vue'\n\n import Tree from './Tree.vue'\n\n import { getFormProp, hyphenToCamelCase, setComponentSlots, setFormProp } from '../helper'\n import { getComponent } from '../helper/componentMap'\n import { ComponentNameEnum, formEnumMapKey, type ZnFormV2SchemaProps, type PascalCaseComponentName } from '../interface'\n import { useRenderCheckbox } from './useRenderCheckbox'\n import { useRenderComponent } from './useRenderComponent'\n import { useRenderRadio } from './useRenderRadio'\n import { useRenderSelect } from './useRenderSelect'\n import type { Component } from 'vue'\n import { defineComponent } from 'vue'\n import { useLocalStorage } from '@vueuse/core'\n\n defineOptions({ name: 'ZnFormV2Item' })\n\n interface ZnFormV2ItemProps {\n column: ZnFormV2SchemaProps\n style?: CSSStyleDeclaration\n isView?: boolean | Ref<boolean>\n isLazyLoading?: boolean\n isReady?: boolean\n }\n\n const props = defineProps({\n column: { type: Object, required: true },\n style: { required: false },\n isView: { type: Boolean, skipCheck: true, required: false, default: false },\n isLazyLoading: { type: Boolean, required: false, default: false },\n isReady: { type: Boolean, required: false, default: true }\n})\n\n const znygStore = useLocalStorage('znyg', { dictMap: {} })\n\n const model = defineModel<Record<string, any>>({ required: true })\n\n // 缓存计算结果\n const cachedResults = new Map()\n\n // 组件级别的渲染缓存\n const renderCache = new Map()\n const lastRenderKey = ref('')\n\n // 生成渲染缓存key\n const getRenderCacheKey = () => {\n const { prop, el, render, renderInView } = props.column\n const currentIsView = unref(props.isView)\n const modelValue = model.value[prop]\n\n return `${prop}_${el}_${currentIsView}_${JSON.stringify(modelValue)}_${!!render}_${!!renderInView}`\n }\n\n // 检查是否需要重新渲染\n const shouldRerender = computed(() => {\n const currentKey = getRenderCacheKey()\n const needRerender = currentKey !== lastRenderKey.value\n\n if (needRerender) {\n lastRenderKey.value = currentKey\n }\n\n return needRerender\n })\n\n // 判断 fieldNames 设置 label && value && children 的 key 值\n const fieldNames = computed(() => {\n const { dictCode } = props.column\n let label = props.column.fieldNames?.label ?? 'label'\n let value = props.column.fieldNames?.value ?? 'value'\n if (dictCode) {\n label = 'name'\n value = 'code'\n }\n\n return {\n label: label,\n value: value,\n children: props.column.fieldNames?.children ?? 'children',\n disabled: props.column.fieldNames?.disabled ?? 'disabled'\n }\n })\n\n // 接收 enumMap (el 为 select-v 2 需单独处理 enumData)\n const enumMap = inject(formEnumMapKey, ref(new Map()))\n\n // 接收实例引用收集器\n const componentRefsCollector = inject('componentRefsCollector', null)\n\n // 添加对column.enum的直接引用,提高响应性\n const rawEnum = computed(() => props.column.enum)\n\n const columnEnum = computed(() => {\n const { useEnumMap, enumKey, prop, el, dictCode } = props.column\n\n // 确保从enumMap获取最新数据\n const currentEnumMap = unref(enumMap)\n\n // 通过获取原始enum来确保依赖收集\n const currentRawEnum = unref(rawEnum)\n\n let result\n if (dictCode) {\n // 如果存在dictCode,则直接从字典中获取\n if (znygStore && znygStore.value?.dictMap) {\n result = znygStore.value.dictMap[dictCode?.toString()] ?? []\n }\n }\n\n if (useEnumMap) {\n if (typeof useEnumMap === 'function') {\n result = useEnumMap(currentEnumMap)\n } else {\n const data = currentEnumMap.get(useEnumMap)\n if (!data) {\n result = []\n } else if (enumKey) {\n result = data[enumKey] || []\n } else {\n result = data\n }\n }\n }\n\n if (!result) {\n // 如果直接的enum是数组且不为空,优先使用它\n if (Array.isArray(currentRawEnum) && currentRawEnum.length > 0) {\n result = currentRawEnum\n } else {\n // 否则从enumMap中获取\n let enumData = currentEnumMap.get(prop)\n\n if (!enumData) {\n result = []\n } else if (hyphenToCamelCase(el) === ComponentNameEnum.EL_SELECT_V2) {\n result = enumData.map((item: Record<string, any>) => {\n return { ...item, label: item[unref(fieldNames).label], value: item[unref(fieldNames).value] }\n })\n } else if (enumKey) {\n result = enumData[enumKey] || []\n } else {\n result = enumData\n }\n }\n }\n\n return result || []\n })\n\n // 处理透传的 formProps (el 为 tree-select、cascader 的时候需要给下默认 label && value && children)\n const formProps = computed(() => {\n const label = unref(fieldNames).label\n const value = unref(fieldNames).value\n const children = unref(fieldNames).children\n const formEl = hyphenToCamelCase(props.column?.el)\n let userProps = props.column.props ?? {}\n\n // 处理动态属性(函数形式的属性需要实时计算)\n const processedUserProps: Record<string, any> = {}\n for (const [key, val] of Object.entries(userProps)) {\n // 跳过事件处理函数,这些需要单独处理以确保正确的作用域\n if (key.startsWith('on') && typeof val === 'function') {\n continue\n }\n\n if (typeof val === 'function') {\n // 对于函数形式的属性,实时计算其值\n processedUserProps[key] = val(unref(model))\n } else {\n processedUserProps[key] = val\n }\n }\n\n // 基础属性(默认值,优先级最低)\n let baseProps = {}\n\n if (formEl === ComponentNameEnum.EL_TREE_SELECT) {\n baseProps = { props: { label, children }, nodeKey: value }\n }\n\n if (formEl === ComponentNameEnum.EL_CASCADER) {\n baseProps = { props: { label, value, children } }\n }\n\n if (formEl === ComponentNameEnum.EL_DATE_PICKER) {\n if (processedUserProps.type === 'datetime') baseProps = { valueFormat: 'YYYY-MM-DD HH:mm:ss' }\n else if (processedUserProps.type === 'date') baseProps = { valueFormat: 'YYYY-MM-DD' }\n else baseProps = { valueFormat: 'YYYY-MM-DD' }\n }\n\n if (formEl === ComponentNameEnum.EL_TIME_PICKER) baseProps = { valueFormat: 'HH:mm:ss' }\n\n // 合并属性:基础属性在前,用户属性在后(用户属性优先级更高)\n return { ...baseProps, ...processedUserProps }\n })\n\n // 处理事件属性 - 单独处理以确保正确的作用域和参数\n const eventProps = computed(() => {\n const userProps = props.column.props ?? {}\n const events: Record<string, any> = {}\n\n for (const [key, val] of Object.entries(userProps)) {\n if (key.startsWith('on') && typeof val === 'function') {\n // 为每个事件创建一个包装函数,确保正确的参数传递\n events[key] = (...args: any[]) => {\n // 对于 onChange 事件,传递组件的原始参数,而不是整个表单数据\n return val(...args)\n }\n }\n }\n\n return events\n })\n\n // 处理默认 placeholder\n const placeholder = computed(() => {\n const { props: { type, isRange, placeholder, notDefaultPlaceholder } = {}, el } = props.column?.props ? props.column : { props: {}, el: props.column?.el }\n\n // 创建缓存键\n const cacheKey = `placeholder_${el}_${type}_${isRange}_${placeholder}_${notDefaultPlaceholder}`\n\n // 检查缓存\n if (cachedResults.has(cacheKey)) {\n return cachedResults.get(cacheKey)\n }\n\n let result\n if ((['datetimerange', 'daterange', 'monthrange'].includes(type) || isRange) && !notDefaultPlaceholder) {\n result = { rangeSeparator: '至', startPlaceholder: '开始时间', endPlaceholder: '结束时间' }\n } else {\n const placeholderConst = placeholder ?? (hyphenToCamelCase(el)?.includes(ComponentNameEnum.EL_INPUT) ? '请输入' : '请选择')\n result = { placeholder: placeholderConst }\n }\n\n // 缓存结果\n cachedResults.set(cacheKey, result)\n return result\n })\n\n // 是否有清除按钮 (当有默认值时,清除按钮不显示)\n const clearable = computed(() => {\n const { props: { clearable } = {}, defaultValue } = props.column\n return clearable ?? (defaultValue === null || defaultValue === undefined)\n })\n\n // 判断是否应该使用自定义渲染\n const shouldUseCustomRender = computed(() => {\n const { render, renderInView } = props.column\n const currentIsView = unref(props.isView)\n\n // 懒加载状态检查:如果组件未准备好,延迟自定义渲染\n if (props.isLazyLoading && !props.isReady) {\n return false\n }\n\n // 在查看模式下:优先使用 renderInView,如果没有则使用 render\n if (currentIsView) {\n const result = !!(renderInView || render)\n return result\n }\n\n // 在编辑模式下:只使用 render\n const result = !!render\n return result\n })\n\n // 是否禁用 - 检查schema级别的disabled(props中的disabled已在formProps中处理)\n const isDisabled = () => {\n const { disabled } = props.column\n if (typeof disabled === 'boolean') return disabled\n if (typeof disabled === 'function') {\n return disabled(unref(model))\n }\n return false\n }\n\n // 全局渲染计数器,用于调试\n const globalRenderCounters = new Map<string, number>()\n\n // 渲染自定义slot - 使用缓存减少不必要的重复渲染\nconst RenderSlots = markRaw(\n defineComponent({\n name: 'RenderSlots',\n props: ['style', 'column', 'isView'],\n setup(slotProps) {\n const prop = slotProps.column.prop\n\n // 使用简单的缓存机制\n const lastRenderInputs = ref<string>('')\n const cachedResult = ref(null)\n let renderCount = 0\n\n return () => {\n // 检查懒加载状态,如果未准备好则显示占位符\n if (props.isLazyLoading && !props.isReady) {\n return <div style=\"min-height: 32px; opacity: 0.5;\">Loading...</div>\n }\n\n const { render, renderInView } = slotProps.column\n const currentIsView = unref(slotProps.isView)\n\n let renderFunction = null\n\n // 在查看模式下:优先使用 renderInView,如果没有则使用 render\n if (currentIsView) {\n renderFunction = renderInView || render\n } else {\n // 在编辑模式下:只使用 render\n renderFunction = render\n }\n\n if (!renderFunction) return null\n\n // 创建当前渲染输入的快照\n const modelData = getFormProp(unref(model), slotProps.column.prop)\n const enumData = unref(columnEnum)\n\n const renderFuncStr = renderFunction.toString()\n\n // 智能检测render函数的依赖范围\n const usesJsonStringify = renderFuncStr.includes('JSON.stringify')\n const usesScopeModel = renderFuncStr.includes('scope.model.') &&\n !renderFuncStr.includes(`scope.model.${prop}`) // 排除访问自己字段的情况\n const modelFields = renderFuncStr.match(/model\\.(\\w+)/g) || []\n const accessedFields = [...new Set(modelFields.map(field => field.replace('model.', '')))]\n const usesMultipleModelFields = accessedFields.length > 1\n const usesOtherModelFields = accessedFields.some(field => field !== prop) // 访问了其他字段\n\n // 对于简单的外部变量访问(如isView, formData),采用智能缓存策略\n const usesIsViewDirectly = renderFuncStr.includes('isView.value')\n const usesFormDataDirectly = renderFuncStr.includes('formData.')\n const usesSimpleExternalVars = usesIsViewDirectly || usesFormDataDirectly\n\n // 检测依赖策略 - 重新调整优先级\n const accessesComplexDeps = usesJsonStringify || // 序列化整个scope,需要监听所有\n usesScopeModel || // 访问scope.model的其他字段\n usesMultipleModelFields // 访问多个model字段\n\n // 根据不同类型的依赖采用不同的缓存策略\n let cacheInputs: any = {\n modelValue: modelData,\n isView: currentIsView,\n enumData: enumData\n }\n\n if (accessesComplexDeps) {\n // 访问多个字段或复杂依赖,监听整个model\n cacheInputs.fullModel = unref(model)\n } else {\n // 精确监听依赖:只监听真正访问的字段和外部变量\n\n // 添加外部变量依赖\n if (usesIsViewDirectly) {\n cacheInputs.isView = currentIsView\n }\n if (usesFormDataDirectly) {\n // 尝试提取具体访问的formData字段\n const formDataFields = renderFuncStr.match(/formData\\.(\\w+)/g)\n if (formDataFields) {\n cacheInputs.formDataFields = {}\n formDataFields.forEach((field: string) => {\n const fieldName = field.replace('formData.', '')\n ;(cacheInputs.formDataFields as any)[fieldName] = (unref(model) as any)[fieldName]\n })\n }\n }\n\n // 添加其他model字段依赖(不包括自己的字段,因为modelValue已经包含)\n const otherFields = accessedFields.filter(field => field !== prop)\n if (otherFields.length > 0) {\n cacheInputs.modelFields = {}\n otherFields.forEach((fieldName: string) => {\n ;(cacheInputs.modelFields as any)[fieldName] = (unref(model) as any)[fieldName]\n })\n }\n }\n\n const currentInputs = JSON.stringify(cacheInputs)\n\n // 检查是否禁用缓存\n const shouldUseCache = !slotProps.column.noCache\n\n // 如果启用缓存且输入没有变化,返回缓存的结果\n if (shouldUseCache && lastRenderInputs.value === currentInputs && cachedResult.value !== null) {\n // console.log(`🎯 [ZnFormV2 Cache Hit] ${slotProps.column.prop}: 使用缓存结果,跳过render执行`)\n return cachedResult.value\n }\n\n // 输入有变化或禁用缓存,重新渲染\n renderCount++\n\n try {\n const renderScope = {\n model: unref(model),\n data: modelData,\n enumData: enumData\n }\n\n // 执行render函数\n // console.log(`🚀 [ZnFormV2 Render] ${slotProps.column.prop}: 执行render函数`, {\n // noCache: slotProps.column.noCache,\n // renderCount,\n // reason: shouldUseCache ? '输入变化' : '禁用缓存',\n // cacheInputs: JSON.parse(currentInputs)\n // })\n const result = renderFunction(renderScope)\n\n // 只有在启用缓存时才缓存结果和输入\n if (shouldUseCache) {\n cachedResult.value = result\n lastRenderInputs.value = currentInputs\n }\n\n return result\n } catch (error) {\n console.error(`Render error for ${slotProps.column.prop}:`, error)\n return null\n }\n }\n }\n })\n)\n\n // 计算要显示的值(查看模式用)\n const getShowValue = () => {\n const val = getFormProp(unref(model), props.column.prop)\n const formEl = hyphenToCamelCase(props.column.el)\n\n if (formEl !== ComponentNameEnum.EL_SELECT && formEl !== ComponentNameEnum.EL_SELECT_V2) {\n return val\n }\n\n const currentFieldNames = unref(fieldNames)\n const currentColumnEnum = unref(columnEnum)\n\n if (props.column.props?.multiple) {\n // 多选下拉框\n const selectedItemList = currentColumnEnum.filter((_: any) => val?.includes(_[currentFieldNames.value]))\n return selectedItemList.map((_: any) => _[currentFieldNames.label]).join(',')\n } else {\n const selectedItem = currentColumnEnum.find((_: any) => _[currentFieldNames.value] === val)\n return selectedItem ? selectedItem[currentFieldNames.label] : val\n }\n }\n\n // 渲染Element组件\n const RenderElComponents = markRaw(\n defineComponent({\n name: 'RenderElComponents',\n props: ['column'],\n setup(elProps) {\n return () => {\n // 如果是查看模式,显示纯文本\n if (unref(props.isView)) {\n return <span>{getShowValue()}</span>\n }\n\n const originalEl = elProps.column.el\n const formEl = hyphenToCamelCase(originalEl)\n\n // 首先尝试使用原始格式(kebab-case 优先)\n let componentName = getComponent(originalEl!)\n\n // 如果没找到,尝试转换后的格式\n if (!componentName && formEl) {\n componentName = getComponent(formEl)\n }\n\n if (!componentName) {\n console.warn(`未找到组件: ${originalEl} (也尝试了 ${formEl})`)\n return null\n }\n\n // 根据不同组件类型使用不同的渲染逻辑\n switch (formEl) {\n case ComponentNameEnum.EL_SELECT:\n case ComponentNameEnum.EL_SELECT_V2:\n return useRenderSelect(\n componentName,\n unref(model),\n elProps.column,\n {\n ...unref(formProps),\n ...unref(eventProps),\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n },\n unref(placeholder),\n unref(clearable),\n (unref(formProps) as any).disabled ?? isDisabled(),\n unref(columnEnum),\n unref(fieldNames)\n )\n\n case ComponentNameEnum.EL_RADIO_GROUP:\n case ComponentNameEnum.EL_RADIO:\n case ComponentNameEnum.EL_RADIO_BUTTON:\n return useRenderRadio(\n componentName,\n unref(model),\n elProps.column,\n {\n ...unref(formProps),\n ...unref(eventProps),\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n },\n (unref(formProps) as any).disabled ?? isDisabled(),\n unref(columnEnum),\n unref(fieldNames)\n )\n\n case ComponentNameEnum.EL_CHECKBOX_GROUP:\n case ComponentNameEnum.EL_Checkbox:\n case ComponentNameEnum.EL_CHECKBOX_BUTTON:\n return useRenderCheckbox(\n componentName,\n unref(model),\n elProps.column,\n {\n ...unref(formProps),\n ...unref(eventProps),\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n },\n (unref(formProps) as any).disabled ?? isDisabled(),\n unref(columnEnum),\n unref(fieldNames)\n )\n\n default:\n return useRenderComponent(componentName, unref(model), elProps.column, {\n ...unref(placeholder),\n clearable: unref(clearable),\n disabled: isDisabled(),\n ...unref(formProps), // 用户props放在最后,优先级最高\n ...unref(eventProps), // 事件处理函数最后添加\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(elProps.column.prop, ref)\n }\n }\n })\n }\n }\n }\n })\n )\n\n // 渲染自定义组件\n const RenderComponent = markRaw(\n defineComponent({\n name: 'RenderComponent',\n props: ['style', 'column'],\n setup(componentProps) {\n return () => {\n const { el } = componentProps.column\n\n try {\n const Component = resolveComponent(el!)\n\n if (!Component) {\n console.warn(`未找到自定义组件: ${el}`)\n return null\n }\n\n return h(Component, {\n modelValue: getFormProp(unref(model), componentProps.column.prop),\n 'onUpdate:modelValue': (val: any) => setFormProp(unref(model), componentProps.column.prop, val),\n style: componentProps.style,\n ...unref(placeholder),\n clearable: unref(clearable),\n disabled: isDisabled(),\n ...unref(formProps), // 用户props放在最后,优先级最高\n ...unref(eventProps), // 事件处理函数最后添加\n ref: (ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setComponentRef(componentProps.column.prop, ref)\n }\n }\n })\n } catch (error) {\n console.error(`渲染自定义组件失败: ${el}`, error)\n return null\n }\n }\n }\n })\n )\n</script>\n"],"names":["props","__props","znygStore","useLocalStorage","dictMap","model","_useModel","cachedResults","Map","lastRenderKey","ref","getRenderCacheKey","__name","prop","el","render","renderInView","column","currentIsView","unref","isView","modelValue","value","JSON","stringify","fieldNames","computed","currentKey","needRerender","dictCode","label","children","disabled","enumMap","inject","formEnumMapKey","componentRefsCollector","rawEnum","enum","columnEnum","useEnumMap","enumKey","currentEnumMap","currentRawEnum","result","toString","data","get","Array","isArray","length","enumData","hyphenToCamelCase","ComponentNameEnum","EL_SELECT_V2","map","item","formProps","formEl","userProps","processedUserProps","key","val","Object","entries","startsWith","baseProps","EL_TREE_SELECT","nodeKey","EL_CASCADER","EL_DATE_PICKER","type","valueFormat","EL_TIME_PICKER","eventProps","events","args","placeholder","isRange","notDefaultPlaceholder","cacheKey","has","includes","EL_INPUT","rangeSeparator","startPlaceholder","endPlaceholder","set","clearable","defaultValue","undefined","shouldUseCustomRender","isLazyLoading","isReady","isDisabled","RenderSlots","markRaw","defineComponent","name","setup","slotProps","lastRenderInputs","cachedResult","_createVNode","style","_createTextVNode","renderFunction","modelData","getFormProp","renderFuncStr","usesJsonStringify","usesScopeModel","modelFields","match","accessedFields","Set","field","replace","usesMultipleModelFields","usesIsViewDirectly","some","usesFormDataDirectly","cacheInputs","fullModel","formDataFields","forEach","fieldName","otherFields","filter","currentInputs","shouldUseCache","noCache","renderCount","error","console","getShowValue","EL_SELECT","currentFieldNames","currentColumnEnum","multiple","selectedItemList","_","join","selectedItem","find","RenderElComponents","elProps","originalEl","componentName","getComponent","warn","useRenderSelect","setComponentRef","EL_RADIO_GROUP","EL_RADIO","EL_RADIO_BUTTON","useRenderRadio","EL_CHECKBOX_GROUP","EL_Checkbox","EL_CHECKBOX_BUTTON","useRenderCheckbox","useRenderComponent","RenderComponent","componentProps","Component","resolveComponent","h","setFormProp"],"mappings":"qjDAuEE,MAAMA,EAAQC,EAQRC,EAAYC,EAAgB,OAAQ,CAAEC,QAAS,CAAA,IAE/CC,EAAQC,EAAmDL,EAAA,cAG3DM,MAAoBC,IAIpBC,EAAgBC,EAAI,IAGpBC,EAA0BC,GAAA,KACxB,MAAAC,KAAEA,EAAAA,GAAMC,EAAAA,OAAIC,EAAAA,aAAQC,GAAiBhB,EAAMiB,OAC3CC,EAAgBC,EAAMnB,EAAMoB,QAC5BC,EAAahB,EAAMiB,MAAMT,GAE/B,MAAO,GAAGA,KAAQC,KAAMI,KAAiBK,KAAKC,UAAUH,QAAiBN,OAAYC,GAAY,GALzEL,qBAqBpBc,GAZiBC,GAAS,KAC9B,MAAMC,EAAahB,IACbiB,EAAeD,IAAelB,EAAca,MAM3CM,OAJHA,IACFnB,EAAca,MAAQK,GAGjBC,CAAAA,IAIUF,GAAS,KACpB,MAAAG,SAAEA,GAAa7B,EAAMiB,OAC3B,IAAIa,EAAQ9B,EAAMiB,OAAOQ,YAAYK,OAAS,QAC1CR,EAAQtB,EAAMiB,OAAOQ,YAAYH,OAAS,QAMvC,OALHO,IACMC,EAAA,OACAR,EAAA,QAGH,CACLQ,QACAR,QACAS,SAAU/B,EAAMiB,OAAOQ,YAAYM,UAAY,WAC/CC,SAAUhC,EAAMiB,OAAOQ,YAAYO,UAAY,WACjD,KAIIC,EAAUC,EAAOC,EAAgBzB,EAAQF,IAAAA,MAGzC4B,EAAyBF,EAAO,yBAA0B,MAG1DG,EAAUX,GAAS,IAAM1B,EAAMiB,OAAOqB,OAEtCC,EAAab,GAAS,KACpB,MAAAc,WAAEA,EAAAA,QAAYC,EAAAA,KAAS5B,EAAAA,GAAMC,EAAAA,SAAIe,GAAa7B,EAAMiB,OAGpDyB,EAAiBvB,EAAMc,GAGvBU,EAAiBxB,EAAMkB,GAEzBO,IAAAA,EAQJ,GAPIf,GAEE3B,GAAaA,EAAUoB,OAAOlB,UAChCwC,EAAS1C,EAAUoB,MAAMlB,QAAQyB,GAAUgB,aAAe,IAI1DL,EACE,GAAsB,mBAAfA,EACTI,EAASJ,EAAWE,OACf,CACCI,MAAAA,EAAOJ,EAAeK,IAAIP,GAIrBM,EAHNA,EAEML,EACAK,EAAKL,IAAY,GAEjBK,EAJA,EAKX,CAIJ,IAAKF,EAEH,GAAII,MAAMC,QAAQN,IAAmBA,EAAeO,OAAS,EAClDP,EAAAA,MACJ,CAEDQ,IAAAA,EAAWT,EAAeK,IAAIlC,GAKvBsC,EAHNA,EAEMC,EAAkBtC,KAAQuC,EAAkBC,aAC5CH,EAASI,KAAmCC,IAC5C,IAAKA,EAAM1B,MAAO0B,EAAKrC,EAAMM,GAAYK,OAAQR,MAAOkC,EAAKrC,EAAMM,GAAYH,WAE/EmB,EACAU,EAASV,IAAY,GAErBU,EARA,EASX,CAIJ,OAAOP,GAAU,EAAC,IAIda,EAAY/B,GAAS,KACnBI,MAAAA,EAAQX,EAAMM,GAAYK,MAC1BR,EAAQH,EAAMM,GAAYH,MAC1BS,EAAWZ,EAAMM,GAAYM,SAC7B2B,EAASN,EAAkBpD,EAAMiB,QAAQH,IAC/C,IAAI6C,EAAY3D,EAAMiB,OAAOjB,OAAS,CAAC,EAGvC,MAAM4D,EAA0C,CAAC,EACjD,IAAA,MAAYC,EAAKC,KAAQC,OAAOC,QAAQL,GAElCE,EAAII,WAAW,OAAwB,mBAARH,IAMjCF,EAAmBC,GAFF,mBAARC,EAEiBA,EAAI3C,EAAMd,IAEVyD,GAK9B,IAAII,EAAY,CAAC,EAmBV,OAjBHR,IAAWL,EAAkBc,iBACnBD,EAAA,CAAElE,MAAO,CAAE8B,QAAOC,YAAYqC,QAAS9C,IAGjDoC,IAAWL,EAAkBgB,cACnBH,EAAA,CAAElE,MAAO,CAAE8B,QAAOR,QAAOS,cAGnC2B,IAAWL,EAAkBiB,iBACyBJ,EAAxB,aAA5BN,EAAmBW,KAAiC,CAAEC,YAAa,wBAC9DZ,EAAmBW,KAA6B,CAAEC,YAAa,gBAItEd,IAAWL,EAAkBoB,iBAA4BP,EAAA,CAAEM,YAAa,aAGrE,IAAKN,KAAcN,EAAmB,IAIzCc,EAAahD,GAAS,KAC1B,MAAMiC,EAAY3D,EAAMiB,OAAOjB,OAAS,CAAC,EACnC2E,EAA8B,CAAC,EAErC,IAAA,MAAYd,EAAKC,KAAQC,OAAOC,QAAQL,GAClCE,EAAII,WAAW,OAAwB,mBAARH,IAE1BD,EAAAA,GAAO,IAAIe,IAETd,KAAOc,IAKbD,OAAAA,CAAAA,IAIHE,EAAcnD,GAAS,KACrB,MAAE1B,OAAOuE,KAAEA,EAAAA,QAAMO,EAASD,YAAAA,EAAAA,sBAAaE,GAA0B,CAAC,EAAAjE,GAAGA,GAAOd,EAAMiB,QAAQjB,MAAQA,EAAMiB,OAAS,CAAEjB,MAAO,CAAC,EAAGc,GAAId,EAAMiB,QAAQH,IAGhJkE,EAAW,eAAelE,KAAMyD,KAAQO,KAAWD,KAAeE,IAGpExE,GAAAA,EAAc0E,IAAID,GACbzE,OAAAA,EAAcwC,IAAIiC,GAGvBpC,IAAAA,EACC,IAAA,CAAC,gBAAiB,YAAa,cAAcsC,SAASX,KAASO,GAAaC,EAE1E,CAEInC,EAAA,CAAEiC,YADcA,IAAgBzB,EAAkBtC,IAAKoE,SAAS7B,EAAkB8B,UAAY,MAAQ,OACtE,MAHhCvC,EAAA,CAAEwC,eAAgB,IAAKC,iBAAkB,OAAQC,eAAgB,QAQrE1C,OADO2C,EAAAA,IAAIP,EAAUpC,GACrBA,CAAAA,IAIH4C,EAAY9D,GAAS,KACnB,MAAE1B,OAASwF,UAAAA,GAAc,CAAC,EAAAC,aAAGA,GAAiBzF,EAAMiB,OACnDuE,OAAAA,GAAAA,MAAcC,CAA0CC,IAI3DC,EAAwBjE,GAAS,KAC/B,MAAAX,OAAEA,EAAAA,aAAQC,GAAiBhB,EAAMiB,OACjCC,EAAgBC,EAAMnB,EAAMoB,QAGlC,GAAIpB,EAAM4F,gBAAkB5F,EAAM6F,QACzB,OAAA,EAIT,GAAI3E,EAAe,CAEV0B,SADW5B,IAAgBD,EAC3B6B,CAKFA,QADU7B,CACV6B,IAIHkD,EAAmBlF,GAAA,KACjB,MAAAoB,SAAEA,GAAahC,EAAMiB,OACvB,MAAoB,kBAAbe,EAA+BA,EAClB,mBAAbA,GACFA,EAASb,EAAMd,GAEjB,GANUyF,cAafC,GAAcC,EACFC,EAAA,CACdC,KAAM,cACNlG,MAAO,CAAC,QAAS,SAAU,UAC3BmG,KAAAA,CAAMC,GACEvF,MAAAA,EAAOuF,EAAUnF,OAAOJ,KAGxBwF,EAAmB3F,EAAY,IAC/B4F,EAAe5F,EAAI,MAGzB,MAAO,KAEL,GAAIV,EAAM4F,gBAAkB5F,EAAM6F,QAChC,OAAAU,EAAA,MAAA,CAAAC,MAAA,mCAAA,CAAAC,EAAA,gBAGI,MAAA1F,OAAEA,EAAAA,aAAQC,GAAiBoF,EAAUnF,OACrCC,EAAgBC,EAAMiF,EAAUhF,QAEtC,IAAIsF,EAAiB,KAUjB,GANFA,EADExF,GACeF,GAGAD,GAGd2F,EAAuB,OAAA,KAG5B,MAAMC,EAAYC,EAAYzF,EAAMd,GAAQ+F,EAAUnF,OAAOJ,MACvDsC,EAAWhC,EAAMoB,GAEjBsE,EAAgBH,EAAe7D,WAG/BiE,EAAoBD,EAAc3B,SAAS,kBAC3C6B,EAAiBF,EAAc3B,SAAS,kBACvB2B,EAAc3B,SAAS,eAAerE,KACvDmG,EAAcH,EAAcI,MAAM,kBAAoB,GACtDC,EAAiB,IAAI,IAAIC,IAAIH,EAAYzD,KAAa6D,GAAAA,EAAMC,QAAQ,SAAU,QAC9EC,EAA0BJ,EAAehE,OAAS,EAIlDqE,GAHuBL,EAAeM,MAAKJ,GAASA,IAAUvG,IAGzCgG,EAAc3B,SAAS,iBAC5CuC,EAAuBZ,EAAc3B,SAAS,aASpD,IAAIwC,EAAmB,CACrBrG,WAAYsF,EACZvF,OAAQF,EACRiC,YAGF,GAX4B2D;AACDC;AACAO,EAWbK,EAAAA,UAAYxG,EAAMd,OACzB,CAOL,GAHIkH,IACFG,EAAYtG,OAASF,GAEnBuG,EAAsB,CAElBG,MAAAA,EAAiBf,EAAcI,MAAM,oBACvCW,IACFF,EAAYE,eAAiB,CAAC,EAC9BA,EAAeC,SAA2BT,IACxC,MAAMU,EAAYV,EAAMC,QAAQ,YAAa,IAC3CK,EAAYE,eAAuBE,GAAc3G,EAAMd,GAAeyH,EAAS,IAErF,CAIF,MAAMC,EAAcb,EAAec,QAAOZ,GAASA,IAAUvG,IACzDkH,EAAY7E,OAAS,IACvBwE,EAAYV,YAAc,CAAC,EAC3Be,EAAYF,SAA+BC,IACvCJ,EAAYV,YAAoBc,GAAc3G,EAAMd,GAAeyH,EAAS,IAElF,CAGIG,MAAAA,EAAgB1G,KAAKC,UAAUkG,GAG/BQ,GAAkB9B,EAAUnF,OAAOkH,QAGzC,GAAID,GAAkB7B,EAAiB/E,QAAU2G,GAAwC,OAAvB3B,EAAahF,MAE7E,OAAOgF,EAAahF,MAItB8G,EAEI,IACF,MAaMxF,EAAS8D,EAbK,CAClBrG,MAAOc,EAAMd,GACbyC,KAAM6D,EACNxD,aAkBKP,OALHsF,IACF5B,EAAahF,MAAQsB,EACrByD,EAAiB/E,MAAQ2G,GAGpBrF,QACAyF,GAEA,OADPC,QAAQD,MAAM,oBAAoBjC,EAAUnF,OAAOJ,QAASwH,GACrD,IAAA,EAEX,KAMEE,GAAqB3H,GAAA,KACzB,MAAMkD,EAAM8C,EAAYzF,EAAMd,GAAQL,EAAMiB,OAAOJ,MAC7C6C,EAASN,EAAkBpD,EAAMiB,OAAOH,IAE9C,GAAI4C,IAAWL,EAAkBmF,WAAa9E,IAAWL,EAAkBC,aAClEQ,OAAAA,EAGH2E,MAAAA,EAAoBtH,EAAMM,GAC1BiH,EAAoBvH,EAAMoB,GAE5BvC,GAAAA,EAAMiB,OAAOjB,OAAO2I,SAAU,CAGzBC,OADkBF,EAAkBV,QAAmBlE,GAAAA,GAAKoB,SAAS2D,EAAEJ,EAAkBnH,UACxEiC,KAAgBsF,GAAAA,EAAEJ,EAAkB3G,SAAQgH,KAAK,IAAG,CACvE,CACCC,MAAAA,EAAeL,EAAkBM,MAAMH,GAAWA,EAAEJ,EAAkBnH,SAAWwC,IACvF,OAAOiF,EAAeA,EAAaN,EAAkB3G,OAASgC,CAAAA,IAjB7CyE,gBAsBfU,GAAqBjD,EACTC,EAAA,CACdC,KAAM,qBACNlG,MAAO,CAAC,UACRmG,MAAM+C,GACG,KAED/H,GAAAA,EAAMnB,EAAMoB,QACd,OAAAmF,EAAA,OAAA,KAAA,CAAcgC,OAGVY,MAAAA,EAAaD,EAAQjI,OAAOH,GAC5B4C,EAASN,EAAkB+F,GAG7BC,IAAAA,EAAgBC,EAAaF,GAOjC,IAJKC,GAAiB1F,IACpB0F,EAAgBC,EAAa3F,KAG1B0F,EAEI,OADPd,QAAQgB,KAAK,UAAUH,WAAoBzF,MACpC,KAIT,OAAQA,GACN,KAAKL,EAAkBmF,UACvB,KAAKnF,EAAkBC,aACrB,OAAOiG,EACLH,EACAjI,EAAMd,GACN6I,EAAQjI,OACR,IACKE,EAAMsC,MACNtC,EAAMuD,GACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBoH,gBAAgBN,EAAQjI,OAAOJ,KAAMH,EAAG,GAF7DA,QAMRS,EAAM0D,GACN1D,EAAMqE,GACLrE,EAAMsC,GAAmBzB,UAAY8D,IACtC3E,EAAMoB,GACNpB,EAAMM,IAGV,KAAK4B,EAAkBoG,eACvB,KAAKpG,EAAkBqG,SACvB,KAAKrG,EAAkBsG,gBACrB,OAAOC,EACLR,EACAjI,EAAMd,GACN6I,EAAQjI,OACR,IACKE,EAAMsC,MACNtC,EAAMuD,GACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBoH,gBAAgBN,EAAQjI,OAAOJ,KAAMH,EAAG,GAF7DA,QAMPS,EAAMsC,GAAmBzB,UAAY8D,IACtC3E,EAAMoB,GACNpB,EAAMM,IAGV,KAAK4B,EAAkBwG,kBACvB,KAAKxG,EAAkByG,YACvB,KAAKzG,EAAkB0G,mBACrB,OAAOC,EACLZ,EACAjI,EAAMd,GACN6I,EAAQjI,OACR,IACKE,EAAMsC,MACNtC,EAAMuD,GACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBoH,gBAAgBN,EAAQjI,OAAOJ,KAAMH,EAAG,GAF7DA,QAMPS,EAAMsC,GAAmBzB,UAAY8D,IACtC3E,EAAMoB,GACNpB,EAAMM,IAGV,QACE,OAAOwI,EAAmBb,EAAejI,EAAMd,GAAQ6I,EAAQjI,OAAQ,IAClEE,EAAM0D,GACTW,UAAWrE,EAAMqE,GACjBxD,SAAU8D,OACP3E,EAAMsC;;GACNtC,EAAMuD;;AACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBoH,gBAAgBN,EAAQjI,OAAOJ,KAAMH,EAAG,GAF7DA,SAKP,KAQPwJ,GAAkBlE,EACNC,EAAA,CACdC,KAAM,kBACNlG,MAAO,CAAC,QAAS,UACjBmG,MAAMgE,GACG,KACC,MAAArJ,GAAEA,GAAOqJ,EAAelJ,OAE1B,IACImJ,MAAAA,EAAYC,EAAiBvJ,GAEnC,OAAKsJ,EAKEE,EAAEF,EAAW,CAClB/I,WAAYuF,EAAYzF,EAAMd,GAAQ8J,EAAelJ,OAAOJ,MAC5D,sBAAqC0J,GAAAA,GAAAA,EAAYpJ,EAAMd,GAAQ8J,EAAelJ,OAAOJ,KAAMiD,IAAnEA,uBACxB0C,MAAO2D,EAAe3D,SACnBrF,EAAM0D,GACTW,UAAWrE,EAAMqE,GACjBxD,SAAU8D,OACP3E,EAAMsC;;GACNtC,EAAMuD;;AACThE,OAAMA,IACAA,GAAO0B,GACTA,EAAuBoH,gBAAgBW,EAAelJ,OAAOJ,KAAMH,EAAG,GAFpEA,UAbE4I,QAAAA,KAAK,aAAaxI,KACnB,YAkBFuH,GAEA,OADPC,QAAQD,MAAM,cAAcvH,IAAMuH,GAC3B,IAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{isVNode as e,defineComponent as t,useModel as n,shallowRef as
|
|
1
|
+
import{isVNode as e,defineComponent as t,useModel as n,shallowRef as r,ref as a,computed as i,unref as l,getCurrentInstance as o,nextTick as d,provide as s,watch as u,markRaw as c,useSlots as p,withDirectives as h,createVNode as f,vShow as m,mergeProps as v,onMounted as y,onBeforeUnmount as g,createElementBlock as w,openBlock as b,normalizeClass as V,createCommentVNode as _,createBlock as $,createElementVNode as C,toDisplayString as L,mergeModels as I}from"vue";import"./components/ZnFormV2Item.vue.mjs";import{getFormProp as x,setFormProp as S,hyphenToCamelCase as F,getPx as R}from"./helper/index.mjs";import{formEnumMapKey as k,ComponentNameEnum as z}from"./interface/index.mjs";import{ElForm as q,ElRow as E,ElCol as M,ElFormItem as P,ElSkeleton as j}from"element-plus";import{withSmartCache as T,clearRelatedCache as A}from"./utils/smartCache.mjs";import D from"./components/ZnFormV2Item.vue2.mjs";var O=Object.defineProperty,H=(e,t)=>O(e,"name",{value:t,configurable:!0});const B={key:0,class:"performance-panel",style:{position:"fixed","z-index":"9999",top:"10px",right:"10px",padding:"10px","border-radius":"4px",background:"rgb(0 0 0 / 80%)",color:"white","font-size":"12px"}},U={key:0,class:"loading",style:{display:"flex",position:"absolute","z-index":"1000",top:"50%",left:"50%","align-items":"center",transform:"translate(-50%, -50%)",gap:"10px"}};function N(t){return"function"==typeof t||"[object Object]"===Object.prototype.toString.call(t)&&!e(t)}H(N,"_isSlot");const W="zn-form-v2";var J=t({name:"ZnFormV2",__name:"index",props:I({modelValue:{type:Object,required:!1,default:H((()=>({})),"default")},schema:{type:Array,required:!1,default:H((()=>[]),"default")},elFormProps:{required:!1,default:H((()=>({})),"default")},useCol:{type:Boolean,required:!1,default:!0},rowProps:{type:Object,required:!1},onlyRenderComponent:{type:Boolean,required:!1,default:!1},dynamicModel:{type:Boolean,required:!1,default:!0},includeModelKeys:{type:Array,required:!1},enumMapProps:{type:Map,required:!1},isView:{type:Boolean,required:!1,default:!1},disableRulesInView:{type:Boolean,required:!1,default:!0},lazyLoad:{type:Boolean,required:!1,default:!0},lazyLoadDelay:{type:Number,required:!1,default:16},initialLoadCount:{type:Number,required:!1,default:20},batchLoadCount:{type:Number,required:!1,default:30},lazyLoadDebug:{type:Boolean,required:!1,default:!1},delayLoad:{type:Number,required:!1,default:500},performanceConfig:{required:!1,default:H((()=>({enableMonitoring:!1,enableDebug:!1,reportInterval:5e3})),"default")},enableVirtualScroll:{type:Boolean,required:!1,default:!1},virtualScrollConfig:{required:!1,default:H((()=>({enabled:!1,height:400,itemHeight:60,buffer:5})),"default")},timeSliceConfig:{required:!1,default:H((()=>({enabled:!0,sliceSize:5,batchSize:10})),"default")},maxSyncRenderCount:{type:Number,required:!1,default:20},renderBatchSize:{type:Number,required:!1,default:10},renderDelay:{type:Number,required:!1,default:0},enablePerformanceMonitoring:{type:Boolean,required:!1,default:!1},excludeHiddenFieldsValidation:{type:Boolean,required:!1,default:!0},clearHiddenFieldValues:{type:Boolean,required:!1,default:!0}},{modelValue:{default:H((()=>({})),"default")},modelModifiers:{}}),emits:I(["update:modelValue","update:schema","register","onSearch","onReset","onChange","onEnumChange","onSchemaChange","onPerformanceUpdate"],["update:modelValue"]),setup(e,{expose:I,emit:O}){const J=1e3,Z=3e4,K=16;class G{static{H(this,"PerformanceCache")}cache=new Map;timers=new Map;hitCount=0;missCount=0;has(e){const t=this.cache.get(e);return!!(t&&Date.now()-t.timestamp<Z)||(t&&this.delete(e),!1)}get(e){const t=this.cache.get(e);if(t&&Date.now()-t.timestamp<Z)return this.hitCount++,t.value;this.missCount++,this.delete(e)}set(e,t){if(this.cache.size>=J){const e=this.cache.keys().next().value;this.delete(e)}this.cache.set(e,{value:t,timestamp:Date.now()}),this.timers.has(e)&&clearTimeout(this.timers.get(e));const n=setTimeout((()=>{this.delete(e)}),Z);this.timers.set(e,n)}delete(e){this.cache.delete(e);const t=this.timers.get(e);t&&(clearTimeout(t),this.timers.delete(e))}clear(){this.cache.clear(),this.timers.forEach((e=>clearTimeout(e))),this.timers.clear()}getStats(){return{size:this.cache.size,hitRate:this.hitCount/(this.hitCount+this.missCount)||0,hitCount:this.hitCount,missCount:this.missCount}}}const Y=H((()=>{const e=new Map;return(t,n,r=K)=>{e.has(t)&&clearTimeout(e.get(t));const a=setTimeout((()=>{n(),e.delete(t)}),r);e.set(t,a)}}),"createDebouncer"),Q=H((()=>{let e=null,t="",n="";return r=>{if(r===e)return t;const a=JSON.stringify(r,Object.keys(r).sort());if(a===n)return t;let i=0;for(let e=0;e<a.length;e++){i=(i<<5)-i+a.charCodeAt(e),i|=0}const l=i.toString(36);return e=r,t=l,n=a,l}}),"createModelHasher"),X=e,ee=O,te=n(e,"modelValue"),ne=r(),re=a({}),ae=i((()=>{const e={...X};return Object.assign(e,l(re)),e})),ie=a(X.enumMapProps||new Map),le=a(new Set),oe=a([]),de=a(!1),se=a(X.delayLoad>0),ue=a(null),ce=(a(0),a([])),pe=new G,he=Y(),fe=Q(),me=a({renderTime:0,componentCount:0,cacheHitRate:0,queueLength:0,cacheStats:{size:0,hitRate:0,hitCount:0,missCount:0}}),ve=a(!1),ye=a(!1),ge=H((()=>{pe.clear()}),"clearCache"),we=(o(),H((()=>{ue.value&&(clearInterval(ue.value),ue.value=null),pe.clear()}),"cleanup")),be=H((async({enum:e,prop:t,cacheEnum:n=!0})=>{if(!e)return;const r=l(ie);if("function"!=typeof e)return r.set(t,l(e)),void(ie.value=new Map(r));try{r.set(t,[]);let n=await e(l(te),r);n=n?.result||n,Array.isArray(n)||(console.warn(`警告: '${t}' 的enum函数返回值不是数组`,n),n=[]),r.set(t,n),ie.value=new Map(r),d((()=>{if(t){const e=l(ae).schema?.find((e=>e.prop===t));e&&Ce(e)}}))}catch(e){console.error(`添加enum函数参数失败: '${t}'`,e),r.set(t,[]),ie.value=new Map(r)}}),"setEnumMap");s(k,ie);const Ve={setComponentRef:H(((e,t)=>{Ke.value.set(e,t)}),"setComponentRef"),setFormItemRef:H(((e,t)=>{Ze.value.set(e,t)}),"setFormItemRef")};s("componentRefsCollector",Ve);const _e={
|
|
2
2
|
// 存储每个字段的render函数依赖关系
|
|
3
3
|
dependencies:new Map,
|
|
4
4
|
// prop -> Set of dependent fields
|
|
@@ -16,15 +16,15 @@ trackFieldAccess(e){this.currentTrackingRender&&(this.renderAccess.get(this.curr
|
|
|
16
16
|
// 获取受某个字段变化影响的render函数
|
|
17
17
|
getAffectedRenders(e){return this.dependencies.get(e)||new Set},
|
|
18
18
|
// 清除某个字段的依赖
|
|
19
|
-
clearDependencies(e){if(this.renderAccess.has(e)){this.renderAccess.get(e).forEach((t=>{const n=this.dependencies.get(t);n&&(n.delete(e),0===n.size&&this.dependencies.delete(t))})),this.renderAccess.delete(e)}this.dependencies.delete(e)}}
|
|
19
|
+
clearDependencies(e){if(this.renderAccess.has(e)){this.renderAccess.get(e).forEach((t=>{const n=this.dependencies.get(t);n&&(n.delete(e),0===n.size&&this.dependencies.delete(t))})),this.renderAccess.delete(e)}this.dependencies.delete(e)}},$e=H((e=>new Proxy(e,{get:(e,t)=>("string"==typeof t&&_e.currentTrackingRender&&_e.trackFieldAccess(t),e[t])})),"createTrackedModel");s("renderDependencyTracker",_e),s("createTrackedModel",$e);const Ce=H((async({defaultValue:e,fieldNames:t,prop:n})=>{const r=l(te),a=x(r,n);if(a||!1===a||0===a)return;const i=l(e);if(null!=i)return S(r,n,"function"!=typeof i?i:await i(r,l(ie)));const o=l(ie).get(n);if(o?.length){const e=o.filter((e=>"Y"===e.isDefault));return e.length&&S(r,n,e[0][t?.value??"value"])}}),"initDefaultValue"),Le=H((({prop:e,el:t,subProp:n,subEnum:r})=>{if(F(t)===z.EL_SELECT){if("string"!=typeof n)return;u((()=>x(l(te),e)),(async t=>{const a=l(ie);if(l(te)[n]&&(l(te)[n]=""),!r)return;if(!t)return a.set(n,[]);if(a.get(`${n}-${t}`))a.set(n,a.get(`${n}-${t}`)||[]);else if("function"==typeof r){const i=await r(t,a.get(e));a.set(`${n}-${t}`,i),a.set(n,i)}else Array.isArray(r)&&(a.set(`${n}-${t}`,r),a.set(n,r));const i=a.get(e)||[],[o]=i.filter((e=>e.value===t));o?.subValue&&(l(te)[n]=o.subValue)}),{immediate:!0})}}),"cascadeEnum"),Ie=H((e=>{if("boolean"==typeof e.hidden)return e.hidden;if("function"==typeof e.hidden){const t=e.hidden.toString();if(!(t.includes("model.")||t.includes("formData.")))return e.hidden(l(te));try{return e.hidden(l(te))}catch(t){return console.warn(`Hidden function execution error for prop ${e.prop}:`,t),!1}}return!1}),"getIsHidden"),xe=H((e=>{if(!X.isView)return!1;if("boolean"==typeof e.hiddenInView)return e.hiddenInView;if("function"==typeof e.hiddenInView){const t=e.hiddenInView.toString();if(!(t.includes("model.")||t.includes("formData.")))return e.hiddenInView(l(te));try{return e.hiddenInView(l(te))}catch(t){return console.warn(`HiddenInView function execution error for prop ${e.prop}:`,t),!1}}return!1}),"getIsHiddenInView"),Se=H((e=>{if("boolean"==typeof e.hiddenLabel)return e.hiddenLabel;if("function"==typeof e.hiddenLabel){const t=e.hiddenLabel.toString();if(!(t.includes("model.")||t.includes("formData.")))return e.hiddenLabel(l(te));const n={prefix:"hiddenLabel",prop:e.prop};return T(e.hiddenLabel,n,te,pe)}return!1}),"getIsHiddenLabel"),Fe=H((e=>{if("boolean"==typeof e.destroy)return e.destroy;if("function"==typeof e.destroy){const t=`destroy_${e.prop}_${fe(l(te))}`;if(pe.has(t))return pe.get(t);const n=e.destroy(l(te));return pe.set(t,n),n}return!1}),"getIsDestroyed"),Re=i((()=>{if(X.delayLoad>0&&!de.value)return[];const e=l(ae).schema||[],t=JSON.stringify(l(te)),n=e.map((e=>({prop:e.prop,hidden:Ie(e),hiddenInView:xe(e),hiddenLabel:Se(e)}))),r=`processedSchema_${e.map((e=>`${e.prop}_${e.el}_${!!e.render}_${!!e.renderInView}_${!!e.hidden}_${!!e.hiddenInView}_${!!e.hiddenLabel}`)).join("|")}_${t}_${JSON.stringify(n)}`;if(pe.has(r))return pe.get(r);const a=H((e=>e.filter((e=>!Fe(e))).sort(((e,t)=>(e.order||0)-(t.order||0))).map(((e,t)=>{const r=n.find((t=>t.prop===e.prop));return{...e,renderPriority:e.renderPriority||0,enableAsyncRender:!1!==e.enableAsyncRender,_index:t,_hidden:r?.hidden||!1,_hiddenInView:r?.hiddenInView||!1,_hiddenLabel:r?.hiddenLabel||!1}}))),"processSchema")(e);if(pe.getStats().size>100){const e=[];pe.cache.forEach(((t,n)=>{"string"==typeof n&&n.startsWith("processedSchema_")&&e.push(n)})),e.length>10&&e.slice(0,5).forEach((e=>pe.delete(e)))}return pe.set(r,a),a})),ke=i((()=>{const e=Re.value;if(!e.length)return[];if(Ye.value||e.length>X.maxSyncRenderCount){const t=Array.from(le.value);return e.filter(((e,n)=>t.includes(e.prop)||n<X.initialLoadCount))}return e})),ze=c(t({name:"RenderFormWrap",setup(){p();const e=new Map,t=H((e=>{const{useCol:t}=l(ae),n=`${X.isView}_${Ye.value}_${t}`;if(Ye.value){const t=Array.from(le.value).sort(),r=e.map((e=>`${e.prop}:${e._hidden}:${e._hiddenInView}`)).join("|");return`lazy_${n}_${t.join("|")}_${r}`}return`full_${n}_${e.map((e=>`${e.prop}_${e._hidden}_${e._hiddenInView}_${e._index}`)).join("|")}`}),"getIncrementalCacheKey");return()=>{const{useCol:n,rowProps:r,onlyRenderComponent:a,elFormProps:i}=l(ae),o=ke.value,d=o.some((e=>e.noCache)),s=(o.filter((e=>e.noCache)).map((e=>e.prop)),t(o));let u;if(u=a?o.map(((e,t)=>{const n=!e._hidden&&!e._hiddenInView;return h(f("div",{key:`${e.prop}_${t}`},[f(D,{column:e,modelValue:te.value,"onUpdate:modelValue":H((e=>te.value=e),"onUpdate:modelValue"),isView:X.isView,isLazyLoading:Ye.value,isReady:le.value.has(e.prop)},null)]),[[m,n]])})):f(q,v({ref:ne,model:te.value,class:[W,{"is-view":X.isView}]},i),{default:H((()=>[n?Ee(o):Me(o)]),"default")}),!d){const t=Ye.value?20:5;if(e.size>=t){const t=e.keys().next().value;e.delete(t)}e.set(s,u)}return u}}})),qe=H(((e={})=>({
|
|
20
20
|
// 如果有 span,代表用户优先级更高,所以不需要默认栅格
|
|
21
|
-
...e.span?{}:{xs:24,sm:12,md:12,lg:12,xl:12},...e})),"setGridProp"),
|
|
22
|
-
/* TEXT */)
|
|
23
|
-
/* TEXT */)
|
|
24
|
-
/* TEXT */)
|
|
25
|
-
/* TEXT */)])):_("v-if",!0),_(" 组件级别的骨架屏 - delayLoad期间显示 "),se.value?(b()
|
|
26
|
-
/* HOISTED */)
|
|
21
|
+
...e.span?{}:{xs:24,sm:12,md:12,lg:12,xl:12},...e})),"setGridProp"),Ee=H((e=>{let t;const{rowProps:n}=l(ae);return f(E,v({gutter:20},n),N(t=e.map(((e,t)=>{const r=qe({...n?.col,...e.col}),a=!e._hidden&&!e._hiddenInView;return h(f(M,v({key:`${e.prop}_${t}`},r),{default:H((()=>[e._hiddenLabel?f(D,{key:`${e.prop}_${e._index}`,column:e,modelValue:te.value,"onUpdate:modelValue":H((e=>te.value=e),"onUpdate:modelValue"),isView:X.isView,isLazyLoading:Ye.value,isReady:le.value.has(e.prop)},null):f(P,v({prop:e.prop,label:"function"==typeof e.label?e.label(te.value):e.label,style:e.width?{width:R(e.width)}:{},ref:H((t=>{t&&Ve&&Ve.setFormItemRef(e.prop,t)}),"ref")},X.isView&&X.disableRulesInView?{...e.formItem,rules:null}:e.formItem),{default:H((()=>[f(D,{key:`${e.prop}_${e._index}`,column:e,modelValue:te.value,"onUpdate:modelValue":H((e=>te.value=e),"onUpdate:modelValue"),isView:X.isView,isLazyLoading:Ye.value,isReady:le.value.has(e.prop)},null)]),"default")})]),"default")}),[[m,a]])})))?t:{default:H((()=>[t]),"default")})}),"renderWithCol"),Me=H((e=>e.map(((e,t)=>{const n=!e._hidden&&!e._hiddenInView;return e._hiddenLabel?h(f("div",{key:`${e.prop}_${t}`},[f(D,{key:`${e.prop}_${e._index}`,column:e,modelValue:te.value,"onUpdate:modelValue":H((e=>te.value=e),"onUpdate:modelValue"),isView:X.isView,isLazyLoading:Ye.value,isReady:le.value.has(e.prop)},null)]),[[m,n]]):h(f(P,v({key:`${e.prop}_${t}`,prop:e.prop,label:"function"==typeof e.label?e.label(te.value):e.label,style:e.width?{width:R(e.width)}:{},ref:H((t=>{t&&Ve&&Ve.setFormItemRef(e.prop,t)}),"ref")},X.isView&&X.disableRulesInView?{...e.formItem,rules:null}:e.formItem),{default:H((()=>[f(D,{key:`${e.prop}_${e._index}`,column:e,modelValue:te.value,"onUpdate:modelValue":H((e=>te.value=e),"onUpdate:modelValue"),isView:X.isView,isLazyLoading:Ye.value,isReady:le.value.has(e.prop)},null)]),"default")}),[[m,n]])}))),"renderWithoutCol"),Pe=H((()=>{if(!Ye.value)return;const e=Re.value;for(let t=0;t<Math.min(X.initialLoadCount,e.length);t++)le.value.add(e[t].prop);oe.value=e.slice(X.initialLoadCount),oe.value.length>0&&je()}),"initializeLazyLoading"),je=H((()=>{if(0===oe.value.length)return void(ve.value=!1);ve.value=!0;const e=H((()=>{if(0===oe.value.length)return void(ve.value=!1);const t=performance.now(),n=oe.value.shift();n&&(le.value.add(n.prop),ce.value.push({prop:n.prop,time:t}),me.value.componentCount=le.value.size,me.value.renderTime=performance.now()-t,me.value.queueLength=oe.value.length,X.enablePerformanceMonitoring&&ee("onPerformanceUpdate",me.value)),oe.value.length>0?X.lazyLoadDelay<=16?requestAnimationFrame(e):setTimeout(e,X.lazyLoadDelay):ve.value=!1}),"renderNext");setTimeout(e,X.delayLoad)}),"startBatchRendering"),Te=H((()=>{(l(ae).schema||[]).forEach((async e=>{e.enum&&await be(e),e.subProp&&e.subEnum&&Le(e),void 0!==e.defaultValue&&he(`init_${e.prop}`,(()=>Ce(e)),50)}))}),"handleSchemaInit"),Ae=H(((e,t)=>{if(!t||t.length!==e.length)return!0;for(let n=0;n<e.length;n++){const r=e[n],a=t[n];if(!a||r.prop!==a.prop||r.el!==a.el||r.destroy!==a.destroy||r.order!==a.order)return!0}return!1}),"hasStructuralChanges");u((()=>l(ae).schema),((e,t)=>{if((!(X.delayLoad>0)||de.value)&&(ye.value||t)&&e?.length){const n=Ae(e,t||[]);(!t||n||X.lazyLoad&&n||e.length>X.maxSyncRenderCount&&n)&&(Te(),n&&le.value.clear(),oe.value=[],ce.value=[],d((()=>{Pe()})))}}),{immediate:!1,deep:!0}),u((()=>l(ae).schema?.map((e=>({prop:e.prop,enum:e.enum,dictCode:e.dictCode})))),((e,t)=>{if(!e||!t||e.length!==t.length)return;let n=!1;const r=[];e.forEach(((e,a)=>{const i=t[a];if(e.enum!==i?.enum||e.dictCode!==i?.dictCode){const t=l(ae).schema?.find((t=>t.prop===e.prop));t&&(n=!0,r.push(e.prop),d((()=>{be(t)})))}})),n&&he("enum_change",(()=>{const e=[];pe.cache?.forEach(((t,n)=>{!n.startsWith("processedSchema_")&&r.some((e=>n.includes(e)))&&e.push(n)})),e.forEach((e=>pe.delete(e)))}),100)}),{deep:!0}),u([()=>X.isView,()=>l(ae).schema?.map((e=>({prop:e.prop,hidden:e.hidden,hiddenInView:e.hiddenInView,hiddenLabel:e.hiddenLabel})))],((e,t)=>{if(!t)return;const[n,r]=e,[a,i]=t;let l=n!==a;!l&&r&&i&&(l=r.some(((e,t)=>{const n=i[t];return!n||e.hidden!==n.hidden||e.hiddenInView!==n.hiddenInView||e.hiddenLabel!==n.hiddenLabel}))),l&&he("view_hidden_change",(()=>{const e=[];pe.cache?.forEach(((t,n)=>{(n.startsWith("processedSchema_")||n.includes("_hidden_")||n.includes("_view_"))&&e.push(n)})),e.forEach((e=>pe.delete(e)))}),50)}),{deep:!0}),u((()=>{if(!X.clearHiddenFieldValues)return[];return(l(ae).schema||[]).map((e=>({prop:e.prop,isHidden:Ie(e)||X.isView&&xe(e)})))}),((e,t)=>{if(!X.clearHiddenFieldValues||!t||!e)return;const n=e.filter(((e,n)=>{const r=t[n];return r&&!r.isHidden&&e.isHidden}));if(n.length>0){const e=l(te);n.forEach((({prop:t})=>{e.hasOwnProperty(t)&&(e[t]=null)}))}}),{deep:!0});const De=H((()=>Re.value.filter((e=>!e._hidden&&!e._hiddenInView)).map((e=>e.prop))),"getVisibleFormProps"),Oe={validate:H((e=>ne.value?e?void ne.value.validate(((t,n)=>{if(t)e(!0);else if(X.excludeHiddenFieldsValidation){const t=De(),r={};n&&Object.keys(n).forEach((e=>{t.includes(e)&&(r[e]=n[e])}));const a=Object.keys(r).length>0;e(!a,a?r:void 0)}else e(!1,n)})):new Promise(((e,t)=>{ne.value?.validate(((n,r)=>{if(n)e(!0);else if(X.excludeHiddenFieldsValidation){const n=De(),a={};r&&Object.keys(r).forEach((e=>{n.includes(e)&&(a[e]=r[e])}));Object.keys(a).length>0?t(a):e(!0)}else t(r)}))})):(e?.(!0),Promise.resolve(!0))),"validate"),validateField:H(((e,t)=>{if(ae.value.excludeHiddenFieldsValidation){const n=De(),r=(Array.isArray(e)?e:[e]).filter((e=>n.includes(e)));if(0===r.length)return t?.(""),Promise.resolve("");const a=1===r.length?r[0]:r;return ne.value?.validateField(a,t)}return ne.value?.validateField(e,t)}),"validateField"),resetFields:H((()=>{ne.value?.resetFields()}),"resetFields"),resetForm:H((()=>{Object.keys(te.value).forEach((e=>{delete te.value[e]})),ne.value?.clearValidate(),d((()=>{Te()}))}),"resetForm"),clearValidate:H((e=>{ne.value?.clearValidate(e)}),"clearValidate"),scrollToField:H((e=>{ne.value?.scrollToField(e)}),"scrollToField"),setEnumMap:be,initDefaultValue:Ce,clearCache:ge};y((()=>{if(X.delayLoad>0)setTimeout((()=>{se.value=!1,de.value=!0;const e=l(ae).schema;e?.length&&(Te(),Ye.value&&Pe()),ye.value=!0,ee("register",Ge)}),X.delayLoad);else{se.value=!1,de.value=!0;const e=l(ae).schema;e?.length&&(Te(),Ye.value&&Pe()),ye.value=!0,ee("register",Ge)}X.enablePerformanceMonitoring&&(ue.value=setInterval((()=>{me.value.cacheStats=pe.getStats(),ee("onPerformanceUpdate",me.value)}),X.performanceConfig.reportInterval||2e3))})),g((()=>{we()}));const He=H((e=>{Object.assign(re.value,e),e.modelValue&&Object.assign(te.value,e.modelValue)}),"setProps"),Be=H((e=>{Object.assign(te.value,e)}),"setValues"),Ue=H((e=>{const{prop:t,field:n,value:r}=e,a=[...l(ae).schema||[]];if("schema"===n)re.value.schema=r;else{const e=a.find((e=>e.prop===t));e&&(e[n]=r,re.value.schema=a)}}),"setSchema"),Ne=H(((e,t,n="after")=>{const r=[...l(ae).schema||[]];if("number"==typeof t)r.splice(t,0,e);else if("string"==typeof t){const a=r.findIndex((e=>e.prop===t));if(-1!==a){const t="before"===n?a:a+1;r.splice(t,0,e)}else r.push(e)}else r.push(e);re.value.schema=r}),"addSchema"),We=H((e=>{const t=(l(ae).schema||[]).filter((t=>t.prop!==e));re.value.schema=t}),"delSchema"),Je=H(((e=!0)=>{const t=te.value;return e?Object.keys(t).reduce(((e,n)=>{const r=t[n];return""!==r&&null!=r&&("object"==typeof r&&null!==r?Object.keys(r).length>0&&(e[n]=r):e[n]=r),e}),{}):t}),"getFormData"),Ze=a(new Map),Ke=a(new Map),Ge={...Oe,setProps:He,setValues:Be,setSchema:Ue,addSchema:Ne,delSchema:We,getFormData:Je,getComponentExpose:H((e=>Ke.value.get(e)||null),"getComponentExpose"),getFormItemExpose:H((e=>Ze.value.get(e)||null),"getFormItemExpose"),getSchema:H((()=>l(ae).schema||[]),"getSchema"),refreshFormItem:H((async(e,t)=>{const{refreshEnum:n=!0,refreshDefaultValue:r=!1,clearValidate:a=!0}=t||{},i=l(ae).schema?.find((t=>t.prop===e));if(!i)return void console.warn(`未找到prop为 "${e}" 的表单项`);const o=[];if(pe.cache?.forEach(((t,n)=>{n.includes(e)&&o.push(n)})),o.forEach((e=>pe.delete(e))),_e.clearDependencies(e),A(pe,"hidden",[e]),A(pe,"hiddenInView",[e]),A(pe,"hiddenLabel",[e]),n&&i.enum)try{await be(i)}catch(t){console.error(`刷新prop "${e}" 的枚举数据失败:`,t)}if(r&&void 0!==i.defaultValue)try{await Ce(i)}catch(t){console.error(`刷新prop "${e}" 的默认值失败:`,t)}if(a&&ne.value?.clearValidate(e),Ye.value){le.value.delete(e);const t=Re.value.find((t=>t.prop===e));t&&!oe.value.some((t=>t.prop===e))&&(oe.value.unshift(t),ve.value||d((()=>{je()})))}await d(),console.log(`已刷新表单项: ${e}`)}),"refreshFormItem"),model:te.value};I({...Ge,form:ne,enumMap:ie,model:te.value});const Ye=i((()=>{const e=l(ae).schema?.length||0,t=X.lazyLoad;if(!1===t)return!1;if(!0===t)return!0;if(e<5){if(0===(l(ae).schema?.filter((e=>e.render||e.renderInView))?.length||0))return!1}return!0}));return(t,n)=>(b(),w("div",{class:V([W,"zn-znform-v2-container"]),ref:"containerRef"},[_(" 性能监控面板 "),e.performanceConfig.enableDebug&&me.value?(b(),w("div",B,[C("div",null,"渲染耗时: "+L(me.value.renderTime.toFixed(2))+"ms",1
|
|
22
|
+
/* TEXT */),C("div",null,"组件数量: "+L(me.value.componentCount),1
|
|
23
|
+
/* TEXT */),C("div",null,"缓存命中率: "+L((100*me.value.cacheHitRate).toFixed(1))+"%",1
|
|
24
|
+
/* TEXT */),C("div",null,"队列长度: "+L(me.value.queueLength),1
|
|
25
|
+
/* TEXT */)])):_("v-if",!0),_(" 组件级别的骨架屏 - delayLoad期间显示 "),se.value?(b(),$(l(j),{key:1,rows:8,animated:""})):_("v-if",!0),_(" 表单容器 - 组件准备好后显示 "),h(C("div",null,[f(l(ze)),_(" 懒加载状态 "),ve.value&&e.enablePerformanceMonitoring?(b(),w("div",U,n[0]||(n[0]=[C("div",{style:{width:"16px",height:"16px",animation:"spin 1s linear infinite",border:"2px solid #409eff","border-top":"2px solid transparent","border-radius":"50%"}},null,-1
|
|
26
|
+
/* HOISTED */),C("span",null,"正在渲染表单项...",-1
|
|
27
27
|
/* HOISTED */)]))):_("v-if",!0)],512
|
|
28
|
-
/* NEED_PATCH */),[[
|
|
29
|
-
/* CLASS */))}});export{
|
|
28
|
+
/* NEED_PATCH */),[[m,!se.value&&de.value]])],2
|
|
29
|
+
/* CLASS */))}});export{J as default};
|
|
30
30
|
//# sourceMappingURL=index.vue2.mjs.map
|