znyg-frontend-common 1.1.1 → 1.1.2

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.
@@ -22,9 +22,9 @@ debugField:""};return T(e.hidden,t,te,pe)}catch(t){return console.warn(`[ZnFormV
22
22
  // 可以根据需要开启调试
23
23
  debugField:""};return T(e.hiddenInView,t,te,pe,{isView:X.isView})}catch(t){return console.warn(`[ZnFormV2] HiddenInView function execution error for prop ${e.prop}:`,t),!1}return!1}),"getIsHiddenInView"),Re=H((e=>{if("boolean"==typeof e.hiddenLabel)return e.hiddenLabel;if("function"==typeof e.hiddenLabel)try{const t={prefix:"hiddenLabel",prop:e.prop,debug:!1,
24
24
  // 可以根据需要开启调试
25
- debugField:""};return T(e.hiddenLabel,t,te,pe)}catch(t){return console.warn(`[ZnFormV2] HiddenLabel function execution error for prop ${e.prop}:`,t),!1}return!1}),"getIsHiddenLabel"),Se=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 r=e.destroy(l(te));return pe.set(t,r),r}return!1}),"getIsDestroyed"),Ee=i((()=>{if(X.delayLoad>0&&!se.value)return[];const e=l(ae).schema||[],t=JSON.stringify(l(te)),r=e.map((e=>({prop:e.prop,hidden:Le(e),hiddenInView:xe(e),hiddenLabel:Re(e)}))),n=`processedSchema_${e.map((e=>`${e.prop}_${e.el}_${!!e.render}_${!!e.renderInView}_${!!e.hidden}_${!!e.hiddenInView}_${!!e.hiddenLabel}`)).join("|")}_${t}_${JSON.stringify(r)}`;if(pe.has(n))return pe.get(n);const a=H((e=>e.filter((e=>!Se(e))).sort(((e,t)=>(e.order||0)-(t.order||0))).map(((e,t)=>{const n=r.find((t=>t.prop===e.prop));return{...e,renderPriority:e.renderPriority||0,enableAsyncRender:!1!==e.enableAsyncRender,_index:t,_hidden:n?.hidden||!1,_hiddenInView:n?.hiddenInView||!1,_hiddenLabel:n?.hiddenLabel||!1}}))),"processSchema")(e);if(pe.getStats().size>100){const e=[];pe.cache.forEach(((t,r)=>{"string"==typeof r&&r.startsWith("processedSchema_")&&e.push(r)})),e.length>10&&e.slice(0,5).forEach((e=>pe.delete(e)))}return pe.set(n,a),a})),ke=i((()=>{const e=Ee.value;if(!e.length)return[];if(Qe.value||e.length>X.maxSyncRenderCount){const t=Array.from(le.value);return e.filter(((e,r)=>t.includes(e.prop)||r<X.initialLoadCount))}return e})),ze=c(t({name:"RenderFormWrap",setup(){p();const e=new Map,t=H((e=>{const{useCol:t}=l(ae),r=`${X.isView}_${Qe.value}_${t}`;if(Qe.value){const t=Array.from(le.value).sort(),n=e.map((e=>`${e.prop}:${e._hidden}:${e._hiddenInView}`)).join("|");return`lazy_${r}_${t.join("|")}_${n}`}return`full_${r}_${e.map((e=>`${e.prop}_${e._hidden}_${e._hiddenInView}_${e._index}`)).join("|")}`}),"getIncrementalCacheKey");return()=>{const{useCol:r,rowProps:n,onlyRenderComponent:a,elFormProps:i}=l(ae),o=ke.value,s=o.some((e=>e.noCache)),d=(o.filter((e=>e.noCache)).map((e=>e.prop)),t(o));let u;if(u=a?o.map(((e,t)=>{const r=!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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),[[m,r]])})):f(z,v({ref:re,model:te.value,class:[U,{"is-view":X.isView}]},i),{default:H((()=>[r?qe(o):Me(o)]),"default")}),!s){const t=Qe.value?20:5;if(e.size>=t){const t=e.keys().next().value;e.delete(t)}e.set(d,u)}return u}}})),Pe=H(((e={})=>({
25
+ debugField:""};return T(e.hiddenLabel,t,te,pe)}catch(t){return console.warn(`[ZnFormV2] HiddenLabel function execution error for prop ${e.prop}:`,t),!1}return!1}),"getIsHiddenLabel"),Se=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 r=e.destroy(l(te));return pe.set(t,r),r}return!1}),"getIsDestroyed"),Ee=i((()=>{if(X.delayLoad>0&&!se.value)return[];const e=l(ae).schema||[],t=JSON.stringify(l(te)),r=e.map((e=>({prop:e.prop,hidden:Le(e),hiddenInView:xe(e),hiddenLabel:Re(e)}))),n=`processedSchema_${e.map((e=>`${e.prop}_${e.el}_${!!e.render}_${!!e.renderInView}_${!!e.hidden}_${!!e.hiddenInView}_${!!e.hiddenLabel}`)).join("|")}_${t}_${JSON.stringify(r)}`;if(pe.has(n))return pe.get(n);const a=H((e=>e.filter((e=>!Se(e))).sort(((e,t)=>(e.order||0)-(t.order||0))).map(((e,t)=>{const n=r.find((t=>t.prop===e.prop));return{...e,renderPriority:e.renderPriority||0,enableAsyncRender:!1!==e.enableAsyncRender,_index:t,_hidden:n?.hidden||!1,_hiddenInView:n?.hiddenInView||!1,_hiddenLabel:n?.hiddenLabel||!1}}))),"processSchema")(e);if(pe.getStats().size>100){const e=[];pe.cache.forEach(((t,r)=>{"string"==typeof r&&r.startsWith("processedSchema_")&&e.push(r)})),e.length>10&&e.slice(0,5).forEach((e=>pe.delete(e)))}return pe.set(n,a),a})),ke=i((()=>{const e=Ee.value;if(!e.length)return[];if(Qe.value){const t=Array.from(le.value);return e.filter(((e,r)=>t.includes(e.prop)||r<X.initialLoadCount))}return e})),ze=c(t({name:"RenderFormWrap",setup(){p();const e=new Map,t=H((e=>{const{useCol:t}=l(ae),r=`${X.isView}_${Qe.value}_${t}`;if(Qe.value){const t=Array.from(le.value).sort(),n=e.map((e=>`${e.prop}:${e._hidden}:${e._hiddenInView}`)).join("|");return`lazy_${r}_${t.join("|")}_${n}`}return`full_${r}_${e.map((e=>`${e.prop}_${e._hidden}_${e._hiddenInView}_${e._index}`)).join("|")}`}),"getIncrementalCacheKey");return()=>{const{useCol:r,rowProps:n,onlyRenderComponent:a,elFormProps:i}=l(ae),o=ke.value,s=o.some((e=>e.noCache)),d=(o.filter((e=>e.noCache)).map((e=>e.prop)),t(o));let u;if(u=a?o.map(((e,t)=>{const r=!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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),[[m,r]])})):f(z,v({ref:re,model:te.value,class:[U,{"is-view":X.isView}]},i),{default:H((()=>[r?qe(o):Me(o)]),"default")}),!s){const t=Qe.value?20:5;if(e.size>=t){const t=e.keys().next().value;e.delete(t)}e.set(d,u)}return u}}})),Pe=H(((e={})=>({
26
26
  // 如果有 span,代表用户优先级更高,所以不需要默认栅格
27
- ...e.span?{}:{xs:24,sm:12,md:12,lg:12,xl:12},...e})),"setGridProp"),qe=H((e=>{let t;const{rowProps:r}=l(ae);return f(P,v({gutter:20},r),B(t=e.map(((e,t)=>{const n=Pe({...r?.col,...e.col}),a=!e._hidden&&!e._hiddenInView;return h(f(q,v({key:`${e.prop}_${t}`},n),{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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null):f(M,v({prop:e.prop,label:"function"==typeof e.label?e.label(te.value):e.label,style:e.width?{width:S(e.width)}:{},ref:H((t=>{t&&_e&&_e.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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),"default")})]),"default")}),[[m,a]])})))?t:{default:H((()=>[t]),"default")})}),"renderWithCol"),Me=H((e=>e.map(((e,t)=>{const r=!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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),[[m,r]]):h(f(M,v({key:`${e.prop}_${t}`,prop:e.prop,label:"function"==typeof e.label?e.label(te.value):e.label,style:e.width?{width:S(e.width)}:{},ref:H((t=>{t&&_e&&_e.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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),"default")}),[[m,r]])}))),"renderWithoutCol"),je=H((()=>{if(!Qe.value)return;const e=Ee.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&&Te()}),"initializeLazyLoading"),Te=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(),r=oe.value.shift();r&&(le.value.add(r.prop),ce.value.push({prop:r.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"),Ae=H((()=>{(l(ae).schema||[]).forEach((async e=>{e.enum&&await be(e),e.subProp&&e.subEnum&&Ce(e),void 0!==e.defaultValue&&he(`init_${e.prop}`,(()=>Ie(e)),50)}))}),"handleSchemaInit"),De=a({length:0,props:[]});u((()=>l(ae).schema),((e,t)=>{if((!(X.delayLoad>0)||se.value)&&(ye.value||0!==De.value.length)&&e?.length){const t={length:e.length,props:e.map((e=>e.prop))},r=De.value,n=t.length>r.length,a=t.length<r.length,i=JSON.stringify(t.props)!==JSON.stringify(r.props),l=!n&&!a&&i;if(n){const t=new Set(r.props),n=e.filter((e=>!t.has(e.prop)));n.forEach((async e=>{e.enum&&await be(e),void 0!==e.defaultValue&&he(`init_${e.prop}`,(()=>Ie(e)),50)})),s((()=>{X.delayLoad>0&&!se.value||Qe.value&&n.forEach((e=>{le.value.has(e.prop)||le.value.add(e.prop)}))}))}else if(a&&Qe.value){const e=new Set(t.props);r.props.filter((t=>!e.has(t))).forEach((e=>{le.value.delete(e),oe.value=oe.value.filter((t=>t.prop!==e)),$e.clearDependencies(e)}))}else{(0===r.length||l||X.lazyLoad&&i||e.length>X.maxSyncRenderCount&&i)&&(Ae(),i&&le.value.clear(),oe.value=[],ce.value=[],s((()=>{je()})))}De.value=t}}),{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 r=!1;const n=[];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&&(r=!0,n.push(e.prop),s((()=>{be(t)})))}})),r&&he("enum_change",(()=>{const e=[];pe.cache?.forEach(((t,r)=>{!r.startsWith("processedSchema_")&&n.some((e=>r.includes(e)))&&e.push(r)})),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[r,n]=e,[a,i]=t;let l=r!==a;!l&&n&&i&&(l=n.some(((e,t)=>{const r=i[t];return!r||e.hidden!==r.hidden||e.hiddenInView!==r.hiddenInView||e.hiddenLabel!==r.hiddenLabel}))),l&&he("view_hidden_change",(()=>{const e=[];pe.cache?.forEach(((t,r)=>{(r.startsWith("processedSchema_")||r.includes("_hidden_")||r.includes("_view_"))&&e.push(r)})),e.forEach((e=>pe.delete(e)))}),50)}),{deep:!0}),u((()=>{if(!X.clearHiddenFieldValues)return[];return(l(ae).schema||[]).map((e=>({prop:e.prop,isHidden:Le(e)||X.isView&&xe(e)})))}),((e,t)=>{if(!X.clearHiddenFieldValues||!t||!e)return;const r=e.filter(((e,r)=>{const n=t[r];return n&&!n.isHidden&&e.isHidden}));if(r.length>0){const e=l(te);r.forEach((({prop:t})=>{e.hasOwnProperty(t)&&(e[t]=null)}))}}),{deep:!0});const Oe=H((()=>Ee.value.filter((e=>!e._hidden&&!e._hiddenInView)).map((e=>e.prop))),"getVisibleFormProps"),He={validate:H((e=>re.value?e?void re.value.validate(((t,r)=>{if(t)e(!0);else if(X.excludeHiddenFieldsValidation){const t=Oe(),n={};r&&Object.keys(r).forEach((e=>{t.includes(e)&&(n[e]=r[e])}));const a=Object.keys(n).length>0;e(!a,a?n:void 0)}else e(!1,r)})):new Promise(((e,t)=>{re.value?.validate(((r,n)=>{if(r)e(!0);else if(X.excludeHiddenFieldsValidation){const r=Oe(),a={};n&&Object.keys(n).forEach((e=>{r.includes(e)&&(a[e]=n[e])}));Object.keys(a).length>0?t(a):e(!0)}else t(n)}))})):(e?.(!0),Promise.resolve(!0))),"validate"),validateField:H(((e,t)=>{if(ae.value.excludeHiddenFieldsValidation){const r=Oe(),n=(Array.isArray(e)?e:[e]).filter((e=>r.includes(e)));if(0===n.length)return t?.(""),Promise.resolve("");const a=1===n.length?n[0]:n;return re.value?.validateField(a,t)}return re.value?.validateField(e,t)}),"validateField"),resetFields:H((()=>{re.value?.resetFields()}),"resetFields"),resetForm:H((()=>{Object.keys(te.value).forEach((e=>{delete te.value[e]})),re.value?.clearValidate(),s((()=>{Ae()}))}),"resetForm"),clearValidate:H((e=>{re.value?.clearValidate(e)}),"clearValidate"),scrollToField:H((e=>{re.value?.scrollToField(e)}),"scrollToField"),setEnumMap:be,initDefaultValue:Ie,clearCache:ge};y((()=>{if(X.delayLoad>0)setTimeout((()=>{de.value=!1,se.value=!0;const e=l(ae).schema;e?.length&&(Ae(),Qe.value&&je()),ye.value=!0,ee("register",Ye)}),X.delayLoad);else{de.value=!1,se.value=!0;const e=l(ae).schema;e?.length&&(Ae(),Qe.value&&je()),ye.value=!0,ee("register",Ye)}X.enablePerformanceMonitoring&&(ue.value=setInterval((()=>{me.value.cacheStats=pe.getStats(),ee("onPerformanceUpdate",me.value)}),X.performanceConfig.reportInterval||2e3))})),g((()=>{Ve()}));const Ze=H((e=>{Object.assign(ne.value,e),e.modelValue&&Object.assign(te.value,e.modelValue)}),"setProps"),Ne=H((e=>{Object.assign(te.value,e)}),"setValues"),Be=H((e=>{const{prop:t,field:r,value:n}=e,a=[...l(ae).schema||[]];if("schema"===r)ne.value.schema=n;else{const e=a.find((e=>e.prop===t));e&&(e[r]=n,ne.value.schema=a)}}),"setSchema"),Ue=H(((e,t,r="after")=>{const n=[...l(ae).schema||[]];if("number"==typeof t)n.splice(t,0,e);else if("string"==typeof t){const a=n.findIndex((e=>e.prop===t));if(-1!==a){const t="before"===r?a:a+1;n.splice(t,0,e)}else n.push(e)}else n.push(e);ne.value.schema=n}),"addSchema"),We=H((e=>{const t=(l(ae).schema||[]).filter((t=>t.prop!==e));if(ne.value.schema=t,Qe.value){le.value.delete(e),oe.value=oe.value.filter((t=>t.prop!==e));const t=[];pe.cache?.forEach(((r,n)=>{n.includes(e)&&t.push(n)})),t.forEach((e=>pe.delete(e))),$e.clearDependencies(e)}}),"delSchema"),Je=H(((e=!0)=>{const t=te.value;return e?Object.keys(t).reduce(((e,r)=>{const n=t[r];return""!==n&&null!=n&&("object"==typeof n&&null!==n?Object.keys(n).length>0&&(e[r]=n):e[r]=n),e}),{}):t}),"getFormData"),Ke=a(new Map),Ge=a(new Map),Ye={...He,setProps:Ze,setValues:Ne,setSchema:Be,addSchema:Ue,delSchema:We,getFormData:Je,getComponentExpose:H((e=>Ge.value.get(e)||null),"getComponentExpose"),getFormItemExpose:H((e=>Ke.value.get(e)||null),"getFormItemExpose"),getSchema:H((()=>l(ae).schema||[]),"getSchema"),refreshFormItem:H((async(e,t)=>{const{refreshEnum:r=!0,refreshDefaultValue:n=!1,clearValidate:a=!0}=t||{},i=l(ae).schema?.find((t=>t.prop===e));if(!i)return void console.warn(`[ZnFormV2] 未找到prop为 "${e}" 的表单项`);const o=[];pe.cache?.forEach(((t,r)=>{r.includes(e)&&o.push(r)})),o.forEach((e=>pe.delete(e))),$e.clearDependencies(e),A(pe,"hidden",[e]),A(pe,"hiddenInView",[e]),A(pe,"hiddenLabel",[e]),A(pe,"render",[e]);if(["formProps","props","placeholder","disabled","clearable"].forEach((t=>{A(pe,t,[e])})),r&&i.enum)try{await be(i)}catch(t){console.error(`[ZnFormV2] 刷新prop "${e}" 的枚举数据失败:`,t)}if(n&&void 0!==i.defaultValue)try{await Ie(i)}catch(t){console.error(`[ZnFormV2] 刷新prop "${e}" 的默认值失败:`,t)}if(a&&re.value?.clearValidate(e),Qe.value){le.value.delete(e);const t=Ee.value.find((t=>t.prop===e));t&&!oe.value.some((t=>t.prop===e))&&(oe.value.unshift(t),ve.value||s((()=>{Te()})))}const d=we.value.get(e);d&&d.refreshFormProps&&d.refreshFormProps(),await s()}),"refreshFormItem"),model:te.value};C({...Ye,form:re,enumMap:ie,model:te.value});const Qe=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,r)=>(b(),V("div",{class:w([U,"zn-znform-v2-container"]),ref:"containerRef"},[_(" 性能监控面板 "),e.performanceConfig.enableDebug&&me.value?(b(),V("div",Z,[F("div",null,"渲染耗时: "+I(me.value.renderTime.toFixed(2))+"ms",1
27
+ ...e.span?{}:{xs:24,sm:12,md:12,lg:12,xl:12},...e})),"setGridProp"),qe=H((e=>{let t;const{rowProps:r}=l(ae);return f(P,v({gutter:20},r),B(t=e.map(((e,t)=>{const n=Pe({...r?.col,...e.col}),a=!e._hidden&&!e._hiddenInView;return h(f(q,v({key:`${e.prop}_${t}`},n),{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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null):f(M,v({prop:e.prop,label:"function"==typeof e.label?e.label(te.value):e.label,style:e.width?{width:S(e.width)}:{},ref:H((t=>{t&&_e&&_e.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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),"default")})]),"default")}),[[m,a]])})))?t:{default:H((()=>[t]),"default")})}),"renderWithCol"),Me=H((e=>e.map(((e,t)=>{const r=!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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),[[m,r]]):h(f(M,v({key:`${e.prop}_${t}`,prop:e.prop,label:"function"==typeof e.label?e.label(te.value):e.label,style:e.width?{width:S(e.width)}:{},ref:H((t=>{t&&_e&&_e.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:Qe.value,isReady:le.value.has(e.prop),ref:H((t=>{t&&_e&&_e.setZnFormV2ItemRef(e.prop,t)}),"ref")},null)]),"default")}),[[m,r]])}))),"renderWithoutCol"),je=H((()=>{if(!Qe.value)return;const e=Ee.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&&Te()}),"initializeLazyLoading"),Te=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(),r=oe.value.shift();r&&(le.value.add(r.prop),ce.value.push({prop:r.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"),Ae=H((()=>{(l(ae).schema||[]).forEach((async e=>{e.enum&&await be(e),e.subProp&&e.subEnum&&Ce(e),void 0!==e.defaultValue&&he(`init_${e.prop}`,(()=>Ie(e)),50)}))}),"handleSchemaInit"),De=a({length:0,props:[]});u((()=>l(ae).schema),((e,t)=>{if((!(X.delayLoad>0)||se.value)&&(ye.value||0!==De.value.length)&&e?.length){const t={length:e.length,props:e.map((e=>e.prop))},r=De.value,n=t.length>r.length,a=t.length<r.length,i=JSON.stringify(t.props)!==JSON.stringify(r.props),l=!n&&!a&&i;if(n){const t=new Set(r.props),n=e.filter((e=>!t.has(e.prop)));n.forEach((async e=>{e.enum&&await be(e),void 0!==e.defaultValue&&he(`init_${e.prop}`,(()=>Ie(e)),50)})),s((()=>{X.delayLoad>0&&!se.value||Qe.value&&n.forEach((e=>{le.value.has(e.prop)||le.value.add(e.prop)}))}))}else if(a&&Qe.value){const e=new Set(t.props);r.props.filter((t=>!e.has(t))).forEach((e=>{le.value.delete(e),oe.value=oe.value.filter((t=>t.prop!==e)),$e.clearDependencies(e)}))}else{(0===r.length||l||X.lazyLoad&&i||e.length>X.maxSyncRenderCount&&i)&&(Ae(),i&&le.value.clear(),oe.value=[],ce.value=[],s((()=>{je()})))}De.value=t}}),{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 r=!1;const n=[];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&&(r=!0,n.push(e.prop),s((()=>{be(t)})))}})),r&&he("enum_change",(()=>{const e=[];pe.cache?.forEach(((t,r)=>{!r.startsWith("processedSchema_")&&n.some((e=>r.includes(e)))&&e.push(r)})),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[r,n]=e,[a,i]=t;let l=r!==a;!l&&n&&i&&(l=n.some(((e,t)=>{const r=i[t];return!r||e.hidden!==r.hidden||e.hiddenInView!==r.hiddenInView||e.hiddenLabel!==r.hiddenLabel}))),l&&he("view_hidden_change",(()=>{const e=[];pe.cache?.forEach(((t,r)=>{(r.startsWith("processedSchema_")||r.includes("_hidden_")||r.includes("_view_"))&&e.push(r)})),e.forEach((e=>pe.delete(e)))}),50)}),{deep:!0}),u((()=>{if(!X.clearHiddenFieldValues)return[];return(l(ae).schema||[]).map((e=>({prop:e.prop,isHidden:Le(e)||X.isView&&xe(e)})))}),((e,t)=>{if(!X.clearHiddenFieldValues||!t||!e)return;const r=e.filter(((e,r)=>{const n=t[r];return n&&!n.isHidden&&e.isHidden}));if(r.length>0){const e=l(te);r.forEach((({prop:t})=>{e.hasOwnProperty(t)&&(e[t]=null)}))}}),{deep:!0});const Oe=H((()=>Ee.value.filter((e=>!e._hidden&&!e._hiddenInView)).map((e=>e.prop))),"getVisibleFormProps"),He={validate:H((e=>re.value?e?void re.value.validate(((t,r)=>{if(t)e(!0);else if(X.excludeHiddenFieldsValidation){const t=Oe(),n={};r&&Object.keys(r).forEach((e=>{t.includes(e)&&(n[e]=r[e])}));const a=Object.keys(n).length>0;e(!a,a?n:void 0)}else e(!1,r)})):new Promise(((e,t)=>{re.value?.validate(((r,n)=>{if(r)e(!0);else if(X.excludeHiddenFieldsValidation){const r=Oe(),a={};n&&Object.keys(n).forEach((e=>{r.includes(e)&&(a[e]=n[e])}));Object.keys(a).length>0?t(a):e(!0)}else t(n)}))})):(e?.(!0),Promise.resolve(!0))),"validate"),validateField:H(((e,t)=>{if(ae.value.excludeHiddenFieldsValidation){const r=Oe(),n=(Array.isArray(e)?e:[e]).filter((e=>r.includes(e)));if(0===n.length)return t?.(!0,""),Promise.resolve("");const a=1===n.length?n[0]:n;return re.value?.validateField(a,t)}return re.value?.validateField(e,t)}),"validateField"),resetFields:H((()=>{re.value?.resetFields()}),"resetFields"),resetForm:H((()=>{Object.keys(te.value).forEach((e=>{delete te.value[e]})),re.value?.clearValidate(),s((()=>{Ae()}))}),"resetForm"),clearValidate:H((e=>{re.value?.clearValidate(e)}),"clearValidate"),scrollToField:H((e=>{re.value?.scrollToField(e)}),"scrollToField"),setEnumMap:be,initDefaultValue:Ie,clearCache:ge};y((()=>{if(X.delayLoad>0)setTimeout((()=>{de.value=!1,se.value=!0;const e=l(ae).schema;if(e?.length)if(Ae(),Qe.value)je();else{Ee.value.forEach((e=>{le.value.add(e.prop)}))}ye.value=!0,ee("register",Ye)}),X.delayLoad);else{de.value=!1,se.value=!0;const e=l(ae).schema;if(e?.length)if(Ae(),Qe.value)je();else{Ee.value.forEach((e=>{le.value.add(e.prop)}))}ye.value=!0,ee("register",Ye)}X.enablePerformanceMonitoring&&(ue.value=setInterval((()=>{me.value.cacheStats=pe.getStats(),ee("onPerformanceUpdate",me.value)}),X.performanceConfig.reportInterval||2e3))})),g((()=>{Ve()}));const Ze=H((e=>{Object.assign(ne.value,e),e.modelValue&&Object.assign(te.value,e.modelValue)}),"setProps"),Ne=H((e=>{Object.assign(te.value,e)}),"setValues"),Be=H((e=>{const{prop:t,field:r,value:n}=e,a=[...l(ae).schema||[]];if("schema"===r)ne.value.schema=n;else{const e=a.find((e=>e.prop===t));e&&(e[r]=n,ne.value.schema=a)}}),"setSchema"),Ue=H(((e,t,r="after")=>{const n=[...l(ae).schema||[]];if("number"==typeof t)n.splice(t,0,e);else if("string"==typeof t){const a=n.findIndex((e=>e.prop===t));if(-1!==a){const t="before"===r?a:a+1;n.splice(t,0,e)}else n.push(e)}else n.push(e);ne.value.schema=n}),"addSchema"),We=H((e=>{const t=(l(ae).schema||[]).filter((t=>t.prop!==e));if(ne.value.schema=t,Qe.value){le.value.delete(e),oe.value=oe.value.filter((t=>t.prop!==e));const t=[];pe.cache?.forEach(((r,n)=>{n.includes(e)&&t.push(n)})),t.forEach((e=>pe.delete(e))),$e.clearDependencies(e)}}),"delSchema"),Je=H(((e=!0)=>{const t=te.value;return e?Object.keys(t).reduce(((e,r)=>{const n=t[r];return""!==n&&null!=n&&("object"==typeof n&&null!==n?Object.keys(n).length>0&&(e[r]=n):e[r]=n),e}),{}):t}),"getFormData"),Ke=a(new Map),Ge=a(new Map),Ye={...He,setProps:Ze,setValues:Ne,setSchema:Be,addSchema:Ue,delSchema:We,getFormData:Je,getComponentExpose:H((e=>Ge.value.get(e)||null),"getComponentExpose"),getFormItemExpose:H((e=>Ke.value.get(e)||null),"getFormItemExpose"),getSchema:H((()=>l(ae).schema||[]),"getSchema"),refreshFormItem:H((async(e,t)=>{const{refreshEnum:r=!0,refreshDefaultValue:n=!1,clearValidate:a=!0}=t||{},i=l(ae).schema?.find((t=>t.prop===e));if(!i)return void console.warn(`[ZnFormV2] 未找到prop为 "${e}" 的表单项`);const o=[];pe.cache?.forEach(((t,r)=>{r.includes(e)&&o.push(r)})),o.forEach((e=>pe.delete(e))),$e.clearDependencies(e),A(pe,"hidden",[e]),A(pe,"hiddenInView",[e]),A(pe,"hiddenLabel",[e]),A(pe,"render",[e]);if(["formProps","props","placeholder","disabled","clearable"].forEach((t=>{A(pe,t,[e])})),r&&i.enum)try{await be(i)}catch(t){console.error(`[ZnFormV2] 刷新prop "${e}" 的枚举数据失败:`,t)}if(n&&void 0!==i.defaultValue)try{await Ie(i)}catch(t){console.error(`[ZnFormV2] 刷新prop "${e}" 的默认值失败:`,t)}if(a&&re.value?.clearValidate(e),Qe.value){le.value.delete(e);const t=Ee.value.find((t=>t.prop===e));t&&!oe.value.some((t=>t.prop===e))&&(oe.value.unshift(t),ve.value||s((()=>{Te()})))}const d=we.value.get(e);d&&d.refreshFormProps&&d.refreshFormProps(),await s()}),"refreshFormItem"),model:te.value};C({...Ye,form:re,enumMap:ie,model:te.value});const Qe=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,r)=>(b(),V("div",{class:w([U,"zn-znform-v2-container"]),ref:"containerRef"},[_(" 性能监控面板 "),e.performanceConfig.enableDebug&&me.value?(b(),V("div",Z,[F("div",null,"渲染耗时: "+I(me.value.renderTime.toFixed(2))+"ms",1
28
28
  /* TEXT */),F("div",null,"组件数量: "+I(me.value.componentCount),1
29
29
  /* TEXT */),F("div",null,"缓存命中率: "+I((100*me.value.cacheHitRate).toFixed(1))+"%",1
30
30
  /* TEXT */),F("div",null,"队列长度: "+I(me.value.queueLength),1
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue2.mjs","sources":["../../../../../../packages/components/znFormV2/src/index.vue"],"sourcesContent":["<script lang=\"tsx\">\nconst prefixClass = 'zn-form-v2'\n</script>\n<template>\n <div :class=\"[prefixClass, 'zn-znform-v2-container']\" ref=\"containerRef\">\n <!-- 性能监控面板 -->\n <div\n v-if=\"performanceConfig.enableDebug && performanceStats\"\n class=\"performance-panel\"\n style=\"\n position: fixed;\n z-index: 9999;\n top: 10px;\n right: 10px;\n padding: 10px;\n border-radius: 4px;\n background: rgb(0 0 0 / 80%);\n color: white;\n font-size: 12px;\n \">\n <div>渲染耗时: {{ performanceStats.renderTime.toFixed(2) }}ms</div>\n <div>组件数量: {{ performanceStats.componentCount }}</div>\n <div>缓存命中率: {{ (performanceStats.cacheHitRate * 100).toFixed(1) }}%</div>\n <div>队列长度: {{ performanceStats.queueLength }}</div>\n </div>\n\n <!-- 组件级别的骨架屏 - delayLoad期间显示 -->\n <el-skeleton v-if=\"showComponentSkeleton\" :rows=\"8\" animated></el-skeleton>\n\n <!-- 表单容器 - 组件准备好后显示 -->\n <div v-show=\"!showComponentSkeleton && componentLoadReady\">\n <RenderFormWrap />\n\n <!-- 懒加载状态 -->\n <div\n v-if=\"isRendering && enablePerformanceMonitoring\"\n class=\"loading\"\n style=\"display: flex; position: absolute; z-index: 1000; top: 50%; left: 50%; align-items: center; transform: translate(-50%, -50%); gap: 10px\">\n <div\n style=\"\n width: 16px;\n height: 16px;\n animation: spin 1s linear infinite;\n border: 2px solid #409eff;\n border-top: 2px solid transparent;\n border-radius: 50%;\n \"></div>\n <span>正在渲染表单项...</span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"tsx\">\n import {\n type ComponentPublicInstance,\n computed,\n defineComponent,\n markRaw,\n onMounted,\n onUnmounted,\n provide,\n ref,\n shallowRef,\n unref,\n useSlots,\n watch,\n nextTick,\n Fragment,\n onBeforeUnmount,\n getCurrentInstance\n } from 'vue'\n\n import ZnFormV2Item from './components/ZnFormV2Item.vue'\n\n import { deleteObjProperty, getFormProp, getPx, hyphenToCamelCase, isString, setFormProp } from './helper'\n import { componentMap } from './helper/componentMap'\n import { ComponentNameEnum, formEnumMapKey, type ZnFormV2SchemaProps, type FormSetProps, type ZnElFormProps, type ValueType } from './interface'\n import {\n type ColProps,\n ElCol,\n ElForm,\n ElFormItem,\n ElRow,\n ElSkeleton,\n ElSkeletonItem,\n type FormInstance,\n type FormItemInstance,\n type FormItemProp,\n type RowProps\n } from 'element-plus'\n import { PerformanceOptimizer, DEFAULT_PERFORMANCE_CONFIG } from './performance/PerformanceOptimizer'\n import { withSmartCache, clearRelatedCache, type SmartCacheConfig } from './utils/smartCache'\n\n defineOptions({ name: 'ZnFormV2' })\n\n \n\n // 添加性能优化相关的配置\n const PERFORMANCE_CONFIG = {\n CACHE_MAX_SIZE: 1000, // 最大缓存数量\n CACHE_TTL: 30000, // 缓存30秒过期\n DEBOUNCE_DELAY: 16, // 16ms防抖(60fps)\n BATCH_RENDER_SIZE: 10, // 每批渲染数量\n MAX_SYNC_RENDER: 50 // 超过50个组件强制异步\n }\n\n // 优化缓存系统\n class PerformanceCache {\n public cache = new Map()\n private timers = new Map()\n private hitCount = 0\n private missCount = 0\n\n has(key: string): boolean {\n const item = this.cache.get(key)\n if (item && Date.now() - item.timestamp < PERFORMANCE_CONFIG.CACHE_TTL) {\n return true\n }\n if (item) {\n this.delete(key) // 清理过期项\n }\n return false\n }\n\n get(key: string) {\n const item = this.cache.get(key)\n if (item && Date.now() - item.timestamp < PERFORMANCE_CONFIG.CACHE_TTL) {\n this.hitCount++\n return item.value\n }\n this.missCount++\n this.delete(key)\n return undefined\n }\n\n set(key: string, value: any) {\n // 限制缓存大小\n if (this.cache.size >= PERFORMANCE_CONFIG.CACHE_MAX_SIZE) {\n const firstKey = this.cache.keys().next().value\n this.delete(firstKey)\n }\n\n this.cache.set(key, {\n value,\n timestamp: Date.now()\n })\n\n // 设置过期定时器\n if (this.timers.has(key)) {\n clearTimeout(this.timers.get(key))\n }\n\n const timer = setTimeout(() => {\n this.delete(key)\n }, PERFORMANCE_CONFIG.CACHE_TTL)\n\n this.timers.set(key, timer)\n }\n\n delete(key: string) {\n this.cache.delete(key)\n const timer = this.timers.get(key)\n if (timer) {\n clearTimeout(timer)\n this.timers.delete(key)\n }\n }\n\n clear() {\n this.cache.clear()\n this.timers.forEach((timer) => clearTimeout(timer))\n this.timers.clear()\n }\n\n getStats() {\n return {\n size: this.cache.size,\n hitRate: this.hitCount / (this.hitCount + this.missCount) || 0,\n hitCount: this.hitCount,\n missCount: this.missCount\n }\n }\n }\n\n // 防抖函数优化\n const createDebouncer = () => {\n const timers = new Map()\n\n return (key: string, fn: Function, delay = PERFORMANCE_CONFIG.DEBOUNCE_DELAY) => {\n if (timers.has(key)) {\n clearTimeout(timers.get(key))\n }\n\n const timer = setTimeout(() => {\n fn()\n timers.delete(key)\n }, delay)\n\n timers.set(key, timer)\n }\n }\n\n // Model变化检测优化 - 更精确的哈希算法\n const createModelHasher = () => {\n let lastModel: any = null\n let lastHash = ''\n let lastStringified = ''\n\n return (model: any) => {\n if (model === lastModel) return lastHash\n\n // 使用 JSON.stringify 生成更精确的哈希\n const stringified = JSON.stringify(model, Object.keys(model).sort())\n\n if (stringified === lastStringified) {\n return lastHash\n }\n\n // 生成简单但有效的哈希\n let hash = 0\n for (let i = 0; i < stringified.length; i++) {\n const char = stringified.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash // Convert to 32bit integer\n }\n\n const finalHash = hash.toString(36)\n\n lastModel = model\n lastHash = finalHash\n lastStringified = stringified\n return finalHash\n }\n }\n\n export interface ZnFormV2Props {\n /** 表单值 */\n modelValue?: Record<string, any>\n /** 表单配置项 */\n schema?: ZnFormV2SchemaProps[]\n /** ElForm 的 props */\n elFormProps?: ZnElFormProps | Record<string, any>\n /** 是否使用栅格布局, 默认 true */\n useCol?: boolean\n /** 栅格布局全局设置 */\n rowProps?: Partial<RowProps> & {\n col?: Partial<ColProps>\n }\n /** 是否只渲染 ZnFormItem 组件,只使用表单组件 */\n onlyRenderComponent?: boolean\n /**\n * 动态 model,如果 schema 发生变化,则重新渲染 model 表单数据\n * (将不存在 schema 的 prop 从 model 中去掉),默认启用 true\n */\n dynamicModel?: boolean\n /**\n * 搭配 dynamicModel 使用,清除 model 不存在的 prop 时,\n * 指定保留 prop。如果不传,则不做清除\n */\n includeModelKeys?: string[]\n /**\n * 存储 enum 值。该 props 是搭配 ProTable 使用,\n * 因为 ProTable 已经初始化部分字典数据,\n * 因此不需要 ProForm 再次请求这些字典数据\n */\n enumMapProps?: Map<string, Record<string, any>[]>\n /** 是否查看,默认为否 */\n isView?: boolean\n /**查看状态时,禁用表单验证 */\n disableRulesInView?: boolean\n /** 是否延迟加载表单项,用于优化大型表单渲染性能 */\n lazyLoad?: boolean\n /** 延迟加载的时间间隔,单位毫秒 */\n lazyLoadDelay?: number\n /** 初始加载的表单项数量,默认为10 */\n initialLoadCount?: number\n /** 每批加载的表单项数量,默认为5 */\n batchLoadCount?: number\n /** 开启懒加载调试模式 */\n lazyLoadDebug?: boolean\n /** 整个组件延时加载时间,用于避免阻塞主线程,单位毫秒,默认500ms */\n delayLoad?: number\n\n // 新增的性能优化配置\n /** 性能配置 */\n performanceConfig?: any\n /** 启用虚拟滚动 */\n enableVirtualScroll?: boolean\n /** 虚拟滚动配置 */\n virtualScrollConfig?: any\n /** 时间切片配置 */\n timeSliceConfig?: any\n /** 最大同步渲染数量 */\n maxSyncRenderCount?: number\n /** 渲染批次大小 */\n renderBatchSize?: number\n /** 渲染延迟 */\n renderDelay?: number\n /** 启用性能监控 */\n enablePerformanceMonitoring?: boolean\n /** 是否排除隐藏表单项的验证,默认为true */\n excludeHiddenFieldsValidation?: boolean\n /** 是否清理隐藏字段的值,当字段隐藏时将值设置为null,默认为true */\n clearHiddenFieldValues?: boolean\n }\n\n const props = defineProps({\n modelValue: { type: Object, required: false, default: () => ({}) },\n schema: { type: Array, required: false, default: () => [] },\n elFormProps: { required: false, default: () => ({}) },\n useCol: { type: Boolean, required: false, default: true },\n rowProps: { type: Object, required: false },\n onlyRenderComponent: { type: Boolean, required: false, default: false },\n dynamicModel: { type: Boolean, required: false, default: true },\n includeModelKeys: { type: Array, required: false },\n enumMapProps: { type: Map, required: false },\n isView: { type: Boolean, required: false, default: false },\n disableRulesInView: { type: Boolean, required: false, default: true },\n lazyLoad: { type: Boolean, required: false, default: false },\n lazyLoadDelay: { type: Number, required: false, default: 16 },\n initialLoadCount: { type: Number, required: false, default: 20 },\n batchLoadCount: { type: Number, required: false, default: 30 },\n lazyLoadDebug: { type: Boolean, required: false, default: false },\n delayLoad: { type: Number, required: false, default: 200 },\n performanceConfig: { required: false, default: () => ({\n enableMonitoring: false,\n enableDebug: false,\n reportInterval: 5000\n }) },\n enableVirtualScroll: { type: Boolean, required: false, default: false },\n virtualScrollConfig: { required: false, default: () => ({\n enabled: false,\n height: 400,\n itemHeight: 60,\n buffer: 5\n }) },\n timeSliceConfig: { required: false, default: () => ({\n enabled: true,\n sliceSize: 5,\n batchSize: 10\n }) },\n maxSyncRenderCount: { type: Number, required: false, default: 20 },\n renderBatchSize: { type: Number, required: false, default: 10 },\n renderDelay: { type: Number, required: false, default: 0 },\n enablePerformanceMonitoring: { type: Boolean, required: false, default: false },\n excludeHiddenFieldsValidation: { type: Boolean, required: false, default: true },\n clearHiddenFieldValues: { type: Boolean, required: false, default: true }\n})\n\n const emit = defineEmits([\n 'update:modelValue',\n 'update:schema',\n 'register',\n 'onSearch',\n 'onReset',\n 'onChange',\n 'onEnumChange',\n 'onSchemaChange',\n 'onPerformanceUpdate'\n ])\n\n const model = defineModel<Record<string, any>>({ default: () => ({}) })\n\n // 存储 ElForm 实例\n const elFormRef = shallowRef<FormInstance>()\n\n const mergeProps = ref<ZnFormV2Props>({})\n\n const getProps = computed(() => {\n const propsObj = { ...props }\n Object.assign(propsObj, unref(mergeProps))\n return propsObj\n })\n\n // 定义 enumMap 存储 enum 值\n const enumMap = ref(props.enumMapProps || new Map<string, Record<string, any>[]>())\n\n // 跟踪哪些表单项已经渲染,用于懒加载\n const renderedItems = ref(new Set<string>())\n // 记录需要懒加载的表单项\n const pendingItems = ref<ZnFormV2SchemaProps[]>([])\n // 组件级别的加载状态\n const componentLoadReady = ref(false)\n // 显示组件级别的骨架屏状态 - 根据delayLoad决定初始值\n const showComponentSkeleton = ref(props.delayLoad > 0)\n // 用于更新加载时间显示的定时器\n const loadingTimer = ref<NodeJS.Timeout | null>(null)\n // 用于触发加载时间更新的响应式变量\n const updateTrigger = ref(0)\n // 用于记录每个组件的加载耗时\n const componentLoadTimes = ref<Array<{ prop: string; time: number }>>([])\n\n // 用于缓存计算结果 - 替换为高性能缓存系统\n const performanceCache = new PerformanceCache()\n const debouncer = createDebouncer()\n const modelHasher = createModelHasher()\n\n // 性能监控\n const performanceStats = ref({\n renderTime: 0,\n componentCount: 0,\n cacheHitRate: 0,\n queueLength: 0,\n cacheStats: {\n size: 0,\n hitRate: 0,\n hitCount: 0,\n missCount: 0\n }\n })\n\n // 渲染状态\n const isRendering = ref(false)\n\n // 添加初始化状态标记\n const isInitialized = ref(false)\n\n const clearCache = () => {\n performanceCache.clear()\n }\n\n // 组件实例引用用于清理\n const componentInstance = getCurrentInstance()\n\n // 清理所有定时器和缓存\n const cleanup = () => {\n if (loadingTimer.value) {\n clearInterval(loadingTimer.value)\n loadingTimer.value = null\n }\n performanceCache.clear()\n }\n\n const setEnumMap = async ({ enum: enumValue, prop, cacheEnum = true }: ZnFormV2SchemaProps) => {\n if (!enumValue) return\n\n const enumMapConst = unref(enumMap)\n\n // 当前 enum 为静态数据,则直接存储到 enumMap\n if (typeof enumValue !== 'function') {\n enumMapConst.set(prop, unref(enumValue)!)\n enumMap.value = new Map(enumMapConst)\n return\n }\n\n try {\n // 为了防止接口执行慢,而存储慢,导致重复请求,所以预先存储为[],接口返回后再二次存储\n enumMapConst.set(prop!, [])\n\n // 如果当前 enum 为后台数据需要请求数据,则调用该请求接口,并存储到 enumMap\n let data = await enumValue(unref(model), enumMapConst)\n\n // 适配 enum 接口返回 data 以及自定义函数返回数组\n data = data?.result || data\n\n // 如果返回的数据不是数组,则警告并强制转换为数组\n if (!Array.isArray(data)) {\n console.warn(`警告: '${prop}' 的enum函数返回值不是数组`, data)\n data = []\n }\n\n // 更新enumMap\n enumMapConst.set(prop, data)\n enumMap.value = new Map(enumMapConst)\n\n // 在下一tick触发初始化默认值\n nextTick(() => {\n if (prop) {\n const schemaItem = unref(getProps).schema?.find((item) => item.prop === prop)\n if (schemaItem) {\n initDefaultValue(schemaItem)\n }\n }\n })\n } catch (error) {\n console.error(`[ZnFormV2] 添加enum函数参数失败: '${prop}'`, error)\n enumMapConst.set(prop!, [])\n enumMap.value = new Map(enumMapConst)\n }\n }\n\n provide(formEnumMapKey, enumMap)\n\n // 提供实例引用收集器\n // 添加 ZnFormV2Item 实例存储\n const znFormV2ItemRefs = ref(new Map<string, any>())\n\n const componentRefsCollector = {\n setComponentRef: (prop: string, ref: any) => {\n componentRefs.value.set(prop, ref)\n },\n setFormItemRef: (prop: string, ref: any) => {\n formItemRefs.value.set(prop, ref)\n },\n setZnFormV2ItemRef: (prop: string, ref: any) => {\n znFormV2ItemRefs.value.set(prop, ref)\n }\n }\n provide('componentRefsCollector', componentRefsCollector)\n\n // 细粒度依赖追踪系统\n const renderDependencyTracker = {\n // 存储每个字段的render函数依赖关系\n dependencies: new Map<string, Set<string>>(), // prop -> Set of dependent fields\n\n // 存储每个render函数访问的字段\n renderAccess: new Map<string, Set<string>>(), // prop -> Set of accessed fields\n\n // 当前正在追踪的render函数\n currentTrackingRender: null as string | null,\n\n // 开始追踪某个render函数的依赖\n startTracking(prop: string) {\n this.currentTrackingRender = prop\n if (!this.renderAccess.has(prop)) {\n this.renderAccess.set(prop, new Set())\n }\n // 清除之前的依赖记录,重新收集\n this.renderAccess.get(prop)!.clear()\n },\n\n // 停止追踪\n stopTracking() {\n this.currentTrackingRender = null\n },\n\n // 记录字段访问\n trackFieldAccess(accessedField: string) {\n if (this.currentTrackingRender) {\n this.renderAccess.get(this.currentTrackingRender)!.add(accessedField)\n\n // 建立反向依赖关系:accessedField -> currentTrackingRender\n if (!this.dependencies.has(accessedField)) {\n this.dependencies.set(accessedField, new Set())\n }\n this.dependencies.get(accessedField)!.add(this.currentTrackingRender)\n }\n },\n\n // 获取受某个字段变化影响的render函数\n getAffectedRenders(changedField: string): Set<string> {\n return this.dependencies.get(changedField) || new Set()\n },\n\n // 清除某个字段的依赖\n clearDependencies(prop: string) {\n // 清除该字段作为依赖者的记录\n if (this.renderAccess.has(prop)) {\n const accessedFields = this.renderAccess.get(prop)!\n accessedFields.forEach((field) => {\n const dependents = this.dependencies.get(field)\n if (dependents) {\n dependents.delete(prop)\n if (dependents.size === 0) {\n this.dependencies.delete(field)\n }\n }\n })\n this.renderAccess.delete(prop)\n }\n\n // 清除该字段作为被依赖者的记录\n this.dependencies.delete(prop)\n }\n }\n\n // 创建一个代理的model对象用于依赖追踪\n const createTrackedModel = (originalModel: any) => {\n return new Proxy(originalModel, {\n get(target, prop) {\n // 记录字段访问\n if (typeof prop === 'string' && renderDependencyTracker.currentTrackingRender) {\n renderDependencyTracker.trackFieldAccess(prop)\n }\n return target[prop]\n }\n })\n }\n\n // 提供依赖追踪器给子组件\n provide('renderDependencyTracker', renderDependencyTracker)\n provide('createTrackedModel', createTrackedModel)\n\n // 初始化默认值\n const initDefaultValue = async ({ defaultValue, fieldNames, prop }: ZnFormV2SchemaProps) => {\n const formConst = unref(model)\n const value = getFormProp(formConst, prop)\n\n if (value || value === false || value === 0) return\n\n const defaultValueConst = unref(defaultValue)\n // 设置表单项的默认值,如果存在值,则不需要赋默认值\n if (defaultValueConst !== undefined && defaultValueConst !== null) {\n if (typeof defaultValueConst !== 'function') return setFormProp(formConst, prop, defaultValueConst)\n\n return setFormProp(formConst, prop, await defaultValueConst(formConst, unref(enumMap)))\n }\n\n // 如果没有设置默认值,则判断后台是否返回 isDefault 为 Y 的枚举\n const enumData = unref(enumMap).get(prop)\n if (enumData?.length) {\n // 找出 isDefault 为 Y 的 value\n const data = enumData.filter((item) => item.isDefault === 'Y')\n\n return data.length && setFormProp(formConst, prop, data[0][fieldNames?.value ?? 'value'])\n }\n }\n\n /**\n * 多个 Select 框级联下拉\n */\n const cascadeEnum = ({ prop, el, subProp, subEnum }: ZnFormV2SchemaProps) => {\n if (hyphenToCamelCase(el) === ComponentNameEnum.EL_SELECT) {\n if (typeof subProp !== 'string') return\n // 监听级联下拉变化\n watch(\n () => getFormProp(unref(model), prop),\n async (newVal: string) => {\n const enumMapConst = unref(enumMap)\n // 选择时将级联的 subProp 置空\n if (unref(model)[subProp!]) unref(model)[subProp!] = ''\n\n if (!subEnum) return\n if (!newVal) return enumMapConst.set(subProp!, [])\n\n if (enumMapConst.get(`${subProp!}-${newVal}`)) {\n // 存在缓存字典数据,则取出来赋值\n enumMapConst.set(subProp!, enumMapConst.get(`${subProp!}-${newVal}`) || [])\n } else {\n if (typeof subEnum === 'function') {\n const subEnumData = await subEnum(newVal, enumMapConst.get(prop))\n // 缓存字典数据\n enumMapConst.set(`${subProp!}-${newVal}`, subEnumData)\n enumMapConst.set(subProp!, subEnumData)\n } else if (Array.isArray(subEnum)) {\n // 缓存字典数据\n enumMapConst.set(`${subProp!}-${newVal}`, subEnum)\n enumMapConst.set(subProp!, subEnum)\n }\n }\n\n const formEnum = enumMapConst.get(prop) || []\n const [enumValue] = formEnum.filter((item) => item.value === newVal)\n // 如果选中的字典有 subValue,则直接赋值给 subProp\n if (enumValue?.subValue) unref(model)[subProp!] = enumValue.subValue\n },\n { immediate: true }\n )\n }\n }\n\n // 处理 hidden 显隐逻辑 - 使用统一的智能缓存策略\n const getIsHidden = (item: ZnFormV2SchemaProps) => {\n if (typeof item.hidden === 'boolean') return item.hidden\n if (typeof item.hidden === 'function') {\n try {\n const config: SmartCacheConfig = {\n prefix: 'hidden',\n prop: item.prop,\n debug: false, // 可以根据需要开启调试\n debugField: '' // 可以指定调试的字段\n }\n return withSmartCache(item.hidden, config, model, performanceCache)\n } catch (error) {\n console.warn(`[ZnFormV2] Hidden function execution error for prop ${item.prop}:`, error)\n return false\n }\n }\n return false\n }\n\n // 处理 hiddenInView 查看模式下的显隐逻辑 - 使用统一的智能缓存策略\n const getIsHiddenInView = (item: ZnFormV2SchemaProps) => {\n // 只在查看模式下生效\n if (!props.isView) return false\n\n if (typeof item.hiddenInView === 'boolean') return item.hiddenInView\n if (typeof item.hiddenInView === 'function') {\n try {\n const config: SmartCacheConfig = {\n prefix: 'hiddenInView',\n prop: item.prop,\n debug: false, // 可以根据需要开启调试\n debugField: '' // 可以指定调试的字段\n }\n return withSmartCache(item.hiddenInView, config, model, performanceCache, { isView: props.isView })\n } catch (error) {\n console.warn(`[ZnFormV2] HiddenInView function execution error for prop ${item.prop}:`, error)\n return false\n }\n }\n return false\n }\n\n // 处理 hiddenLabel 标签显隐逻辑 - 使用统一的智能缓存策略\n const getIsHiddenLabel = (item: ZnFormV2SchemaProps) => {\n if (typeof item.hiddenLabel === 'boolean') return item.hiddenLabel\n if (typeof item.hiddenLabel === 'function') {\n try {\n const config: SmartCacheConfig = {\n prefix: 'hiddenLabel',\n prop: item.prop,\n debug: false, // 可以根据需要开启调试\n debugField: '' // 可以指定调试的字段\n }\n return withSmartCache(item.hiddenLabel, config, model, performanceCache)\n } catch (error) {\n console.warn(`[ZnFormV2] HiddenLabel function execution error for prop ${item.prop}:`, error)\n return false\n }\n }\n return false\n }\n\n // 处理 destroy 销毁逻辑\n const getIsDestroyed = (item: ZnFormV2SchemaProps) => {\n if (typeof item.destroy === 'boolean') return item.destroy\n if (typeof item.destroy === 'function') {\n const cacheKey = `destroy_${item.prop}_${modelHasher(unref(model))}`\n if (performanceCache.has(cacheKey)) {\n return performanceCache.get(cacheKey)\n }\n\n const result = item.destroy(unref(model))\n performanceCache.set(cacheKey, result)\n return result\n }\n return false\n }\n\n // 获取处理后的schema - 使用更精确的缓存策略\n const getProcessedSchema = computed(() => {\n // 如果设置了delayLoad且组件还未准备好,返回空数组避免提前计算\n if (props.delayLoad > 0 && !componentLoadReady.value) {\n // console.log('🚫 [ZnFormV2 getProcessedSchema] 组件未准备好,返回空数组')\n return []\n }\n\n const schemaList = unref(getProps).schema || []\n // console.log('🔍 [ZnFormV2 getProcessedSchema] 开始处理Schema')\n\n // 为了确保hidden/hiddenInView/hiddenLabel函数能正确响应变化,\n // 我们需要在缓存key中包含相关信息\n const modelForHidden = JSON.stringify(unref(model))\n\n // 计算当前所有hidden状态,这样外部变量变化时缓存会失效\n const currentHiddenStates = schemaList.map((item) => ({\n prop: item.prop,\n hidden: getIsHidden(item),\n hiddenInView: getIsHiddenInView(item),\n hiddenLabel: getIsHiddenLabel(item)\n }))\n\n const schemaHash = schemaList\n .map((item) => `${item.prop}_${item.el}_${!!item.render}_${!!item.renderInView}_${!!item.hidden}_${!!item.hiddenInView}_${!!item.hiddenLabel}`)\n .join('|')\n const hiddenStatesHash = JSON.stringify(currentHiddenStates)\n const cacheKey = `processedSchema_${schemaHash}_${modelForHidden}_${hiddenStatesHash}`\n\n if (performanceCache.has(cacheKey)) {\n return performanceCache.get(cacheKey)\n }\n\n // 统一处理逻辑\n const processSchema = (items: any[]) => {\n return items\n .filter((item) => !getIsDestroyed(item))\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .map((item, index) => {\n // 直接使用已经计算好的hidden状态\n const hiddenState = currentHiddenStates.find((state) => state.prop === item.prop)\n return {\n ...item,\n renderPriority: item.renderPriority || 0,\n enableAsyncRender: item.enableAsyncRender !== false,\n _index: index,\n _hidden: hiddenState?.hidden || false,\n _hiddenInView: hiddenState?.hiddenInView || false,\n _hiddenLabel: hiddenState?.hiddenLabel || false\n }\n })\n }\n\n const result = processSchema(schemaList)\n\n // 缓存结果,但限制缓存大小避免内存泄漏\n const cacheStats = performanceCache.getStats()\n if (cacheStats.size > 100) {\n // 清理部分旧缓存\n const allKeys: string[] = []\n performanceCache['cache'].forEach((_, key) => {\n if (typeof key === 'string' && key.startsWith('processedSchema_')) {\n allKeys.push(key)\n }\n })\n if (allKeys.length > 10) {\n // 删除最旧的5个processedSchema缓存\n allKeys.slice(0, 5).forEach((key) => performanceCache.delete(key))\n }\n }\n\n performanceCache.set(cacheKey, result)\n\n return result\n })\n\n // 获取可见的表单项\n const getVisibleSchema = computed(() => {\n const items = getProcessedSchema.value\n if (!items.length) {\n // console.log('🔍 [ZnFormV2 getVisibleSchema] ProcessedSchema为空')\n return []\n }\n\n // console.log('🔍 [ZnFormV2 getVisibleSchema] 处理可见Schema')\n\n // 使用新的懒加载判断逻辑\n if (shouldUseLazyLoad.value || items.length > props.maxSyncRenderCount) {\n const rendered = Array.from(renderedItems.value)\n // 懒加载时也不过滤hidden项目,只过滤渲染状态\n const filteredItems = items.filter((item, index) => rendered.includes(item.prop) || index < props.initialLoadCount)\n\n // console.log('🔍 [ZnFormV2 getVisibleSchema] 懒加载过滤结果')\n\n return filteredItems\n }\n\n // 不过滤hidden项目,让v-show来控制显示隐藏\n // console.log('🔍 [ZnFormV2 getVisibleSchema] 非懒加载,返回所有项目')\n return items\n })\n\n // 表单组件渲染逻辑 - 优化懒加载场景的缓存策略\n const RenderFormWrap = markRaw(\n defineComponent({\n name: 'RenderFormWrap',\n setup() {\n const slots = useSlots()\n\n // 缓存渲染结果 - 为懒加载优化\n const renderCache = new Map<string, any>()\n\n // 为懒加载场景设计的增量缓存策略\n const getIncrementalCacheKey = (schemaList: any[]) => {\n // 对于懒加载,我们基于已渲染的项目生成缓存key,而不是所有可见项目\n const { useCol } = unref(getProps)\n const baseKey = `${props.isView}_${shouldUseLazyLoad.value}_${useCol}`\n\n if (shouldUseLazyLoad.value) {\n // 懒加载模式:需要包含渲染状态和hidden状态\n const renderedProps = Array.from(renderedItems.value).sort()\n const hiddenHash = schemaList.map((item) => `${item.prop}:${item._hidden}:${item._hiddenInView}`).join('|')\n return `lazy_${baseKey}_${renderedProps.join('|')}_${hiddenHash}`\n } else {\n // 非懒加载模式:使用完整的schema hash\n const schemaHash = schemaList.map((item) => `${item.prop}_${item._hidden}_${item._hiddenInView}_${item._index}`).join('|')\n return `full_${baseKey}_${schemaHash}`\n }\n }\n\n return () => {\n const { useCol, rowProps, onlyRenderComponent, elFormProps } = unref(getProps)\n const schemaList = getVisibleSchema.value\n\n // 检查是否有任何表单项设置了 noCache\n const hasNoCacheItems = schemaList.some((item) => item.noCache)\n const noCacheItems = schemaList.filter((item) => item.noCache).map((item) => item.prop)\n\n // 使用增量缓存策略\n const cacheKey = getIncrementalCacheKey(schemaList)\n\n // // 如果缓存存在且没有禁用缓存的项,直接返回缓存\n // if (!hasNoCacheItems && renderCache.has(cacheKey)) {\n // console.log(`🎯 [ZnFormV2 Form Cache Hit] 使用表单缓存,跳过整体渲染`)\n // return renderCache.get(cacheKey)\n // }\n\n // // 日志记录渲染原因\n // if (hasNoCacheItems) {\n // console.log(`🚫 [ZnFormV2 Form No Cache] 存在禁用缓存的字段,跳过表单缓存`, { noCacheItems })\n // } else {\n // console.log(`🚀 [ZnFormV2 Form Render] 缓存未命中,重新渲染表单`)\n // }\n\n let result: any\n\n if (onlyRenderComponent) {\n result = schemaList.map((item, index) => {\n const shouldShow = !item._hidden && !item._hiddenInView\n\n return (\n <div key={`${item.prop}_${index}`} v-show={shouldShow}>\n <ZnFormV2Item\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </div>\n )\n })\n } else {\n result = (\n <ElForm ref={elFormRef} model={model.value} class={[prefixClass, { 'is-view': props.isView }]} {...elFormProps}>\n {useCol ? renderWithCol(schemaList) : renderWithoutCol(schemaList)}\n </ElForm>\n )\n }\n\n // 智能缓存管理:只有在没有禁用缓存的项时才进行缓存\n if (!hasNoCacheItems) {\n const maxCacheSize = shouldUseLazyLoad.value ? 20 : 5\n if (renderCache.size >= maxCacheSize) {\n // 清理最老的缓存项\n const firstKey = renderCache.keys().next().value\n renderCache.delete(firstKey)\n // console.log(`🗑️ [ZnFormV2 Form Cache] 清理最老的缓存项: ${firstKey}`)\n }\n\n renderCache.set(cacheKey, result)\n // console.log(`💾 [ZnFormV2 Form Cache Save] 保存表单缓存,当前缓存数量: ${renderCache.size}`)\n } else {\n // console.log(`🚫 [ZnFormV2 Form Cache Skip] 跳过表单缓存保存`)\n }\n\n return result\n }\n }\n })\n )\n\n // 合并传入进来的栅格属性(与原版 ZnForm 保持一致)\n const setGridProp = (col: any = {}) => {\n return {\n // 如果有 span,代表用户优先级更高,所以不需要默认栅格\n ...(col.span ? {} : { xs: 24, sm: 12, md: 12, lg: 12, xl: 12 }),\n ...col\n }\n }\n\n // 渲染有栅格的表单\n const renderWithCol = (schemaList: ZnFormV2SchemaProps[]) => {\n const { rowProps } = unref(getProps)\n\n return (\n <ElRow gutter={20} {...rowProps}>\n {schemaList.map((item, index) => {\n const colProps = setGridProp({ ...rowProps?.col, ...item.col })\n const shouldShow = !item._hidden && !item._hiddenInView\n\n return (\n <ElCol key={`${item.prop}_${index}`} {...colProps} v-show={shouldShow}>\n {item._hiddenLabel ? (\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n ) : (\n <ElFormItem\n prop={item.prop}\n label={typeof item.label === 'function' ? item.label(model.value) : item.label}\n style={item.width ? { width: getPx(item.width) } : {}}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setFormItemRef(item.prop, ref)\n }\n }}\n {...(props.isView && props.disableRulesInView ? { ...item.formItem, rules: null } : item.formItem)}>\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </ElFormItem>\n )}\n </ElCol>\n )\n })}\n </ElRow>\n )\n }\n\n // 渲染无栅格的表单\n const renderWithoutCol = (schemaList: ZnFormV2SchemaProps[]) => {\n return schemaList.map((item, index) => {\n const shouldShow = !item._hidden && !item._hiddenInView\n\n return item._hiddenLabel ? (\n <div key={`${item.prop}_${index}`} v-show={shouldShow}>\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </div>\n ) : (\n <ElFormItem\n key={`${item.prop}_${index}`}\n prop={item.prop}\n label={typeof item.label === 'function' ? item.label(model.value) : item.label}\n style={item.width ? { width: getPx(item.width) } : {}}\n v-show={shouldShow}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setFormItemRef(item.prop, ref)\n }\n }}\n {...(props.isView && props.disableRulesInView ? { ...item.formItem, rules: null } : item.formItem)}>\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </ElFormItem>\n )\n })\n }\n\n // 懒加载相关逻辑\n const initializeLazyLoading = () => {\n if (!shouldUseLazyLoad.value) return\n\n const schemaList = getProcessedSchema.value\n\n // 初始渲染指定数量的表单项\n for (let i = 0; i < Math.min(props.initialLoadCount, schemaList.length); i++) {\n renderedItems.value.add(schemaList[i].prop)\n }\n\n // 设置剩余项目为待渲染\n pendingItems.value = schemaList.slice(props.initialLoadCount)\n\n if (pendingItems.value.length > 0) {\n startBatchRendering()\n }\n }\n\n // 逐个渲染(优化版)- 每个组件准备好就立即显示\n const startBatchRendering = () => {\n if (pendingItems.value.length === 0) {\n isRendering.value = false\n return\n }\n\n isRendering.value = true\n\n const renderNext = () => {\n if (pendingItems.value.length === 0) {\n isRendering.value = false\n return\n }\n\n const startTime = performance.now()\n // 每次只渲染一个组件,实现真正的逐个显示\n const item = pendingItems.value.shift()\n\n if (item) {\n // 立即添加到已渲染列表,触发UI更新\n renderedItems.value.add(item.prop)\n\n // 记录渲染时间\n componentLoadTimes.value.push({\n prop: item.prop,\n time: startTime\n })\n\n // 更新性能统计\n performanceStats.value.componentCount = renderedItems.value.size\n performanceStats.value.renderTime = performance.now() - startTime\n performanceStats.value.queueLength = pendingItems.value.length\n\n if (props.enablePerformanceMonitoring) {\n emit('onPerformanceUpdate', performanceStats.value)\n }\n }\n\n // 继续渲染下一个组件,使用较短的延迟以实现流畅的逐个显示\n if (pendingItems.value.length > 0) {\n // 使用 requestAnimationFrame 或较短的 timeout 来实现更流畅的渲染\n if (props.lazyLoadDelay <= 16) {\n requestAnimationFrame(renderNext)\n } else {\n setTimeout(renderNext, props.lazyLoadDelay)\n }\n } else {\n isRendering.value = false\n }\n }\n\n // 延迟开始渲染\n setTimeout(renderNext, props.delayLoad)\n }\n\n // 处理表单项初始化\n const handleSchemaInit = () => {\n const schemaList = unref(getProps).schema || []\n\n schemaList.forEach(async (item) => {\n // 处理枚举数据\n if (item.enum) {\n await setEnumMap(item)\n }\n\n // 处理级联下拉\n if (item.subProp && item.subEnum) {\n cascadeEnum(item)\n }\n\n // 初始化默认值\n if (item.defaultValue !== undefined) {\n debouncer(`init_${item.prop}`, () => initDefaultValue(item), 50)\n }\n })\n }\n\n // 检测schema结构性变化(只检查影响渲染的关键属性)\n const hasStructuralChanges = (newSchema: ZnFormV2SchemaProps[], oldSchema: ZnFormV2SchemaProps[]) => {\n if (!oldSchema || oldSchema.length !== newSchema.length) return true\n\n // 检查关键结构属性是否变化\n for (let i = 0; i < newSchema.length; i++) {\n const newItem = newSchema[i]\n const oldItem = oldSchema[i]\n\n if (!oldItem || newItem.prop !== oldItem.prop || newItem.el !== oldItem.el || newItem.destroy !== oldItem.destroy || newItem.order !== oldItem.order) {\n return true\n }\n }\n\n return false\n }\n\n // 用于跟踪上一次的schema状态,避免Vue响应式的oldValue问题\n const lastSchemaSnapshot = ref<{ length: number; props: string[] }>({ length: 0, props: [] })\n\n // 监听schema变化 - 使用自定义的变化检测逻辑\n watch(\n () => unref(getProps).schema,\n (newSchema, oldSchema) => {\n // console.log('🔍 [ZnFormV2 Schema Watch] Schema变化监听触发')\n\n if (props.delayLoad > 0 && !componentLoadReady.value) {\n // console.log('🚫 [ZnFormV2 Schema Watch] 组件未准备好,跳过处理')\n return\n }\n\n // 修改条件:允许在组件初始化后的动态添加\n if (!isInitialized.value && lastSchemaSnapshot.value.length === 0) {\n // console.log('🚫 [ZnFormV2 Schema Watch] 组件未初始化且无历史快照,跳过处理')\n return\n }\n\n if (newSchema?.length) {\n // 使用快照进行变化检测,而不是依赖Vue的oldSchema\n const currentSnapshot = {\n length: newSchema.length,\n props: newSchema.map((item) => item.prop)\n }\n\n const lastSnapshot = lastSchemaSnapshot.value\n\n // 区分不同类型的结构性变化\n const isAddingItems = currentSnapshot.length > lastSnapshot.length\n const isDeletingItems = currentSnapshot.length < lastSnapshot.length\n const hasPropsChange = JSON.stringify(currentSnapshot.props) !== JSON.stringify(lastSnapshot.props)\n const isReorderingItems = !isAddingItems && !isDeletingItems && hasPropsChange\n\n // console.log('🔍 [ZnFormV2 Schema Watch] 基于快照的变化类型分析')\n\n // 智能处理不同的变化类型\n if (isAddingItems) {\n // 仅添加项目:不重置现有渲染状态,只处理新项目\n const lastPropsSet = new Set(lastSnapshot.props)\n const newItems = newSchema.filter((item) => !lastPropsSet.has(item.prop))\n\n // 处理新项目的初始化\n newItems.forEach(async (item) => {\n if (item.enum) {\n await setEnumMap(item)\n }\n if (item.defaultValue !== undefined) {\n debouncer(`init_${item.prop}`, () => initDefaultValue(item), 50)\n }\n })\n\n // 立即渲染新添加的项目\n nextTick(() => {\n // 如果还在组件初始化阶段,等待初始化完成\n if (props.delayLoad > 0 && !componentLoadReady.value) {\n // console.log('🚫 [ZnFormV2 Dynamic Add] 组件还在初始化阶段,等待初始化完成')\n return\n }\n\n // console.log('🚀 [ZnFormV2 Dynamic Add] 开始处理新添加的表单项')\n\n // 如果启用了懒加载,则添加到渲染列表\n if (shouldUseLazyLoad.value) {\n // console.log('🔍 [ZnFormV2 Dynamic Add] 懒加载模式,直接添加新项目到渲染列表')\n\n // 直接添加新项目到渲染列表,不依赖 processedSchemaList\n // 因为 processedSchemaList 可能由于时序问题还没有包含新项目\n newItems.forEach((newItem) => {\n if (!renderedItems.value.has(newItem.prop)) {\n renderedItems.value.add(newItem.prop)\n // console.log('✅ [ZnFormV2 Dynamic Add] 直接添加到渲染列表', { prop: newItem.prop })\n }\n })\n } else {\n // console.log('ℹ️ [ZnFormV2 Dynamic Add] 未启用懒加载,新项目会自动渲染')\n }\n // 如果没有启用懒加载,新项目会自动渲染,无需特殊处理\n })\n } else if (isDeletingItems && shouldUseLazyLoad.value) {\n // 仅删除项目:清理相关状态但不重置整个渲染系统\n const currentPropsSet = new Set(currentSnapshot.props)\n const deletedProps = lastSnapshot.props.filter((prop) => !currentPropsSet.has(prop))\n\n deletedProps.forEach((prop) => {\n renderedItems.value.delete(prop)\n pendingItems.value = pendingItems.value.filter((item) => item.prop !== prop)\n renderDependencyTracker.clearDependencies(prop)\n })\n } else {\n // 其他情况(初次渲染、重排序、复杂变化):完全重置\n const shouldResetRenderState =\n lastSnapshot.length === 0 ||\n isReorderingItems ||\n (props.lazyLoad && hasPropsChange) ||\n (newSchema.length > props.maxSyncRenderCount && hasPropsChange)\n\n if (shouldResetRenderState) {\n // 处理schema初始化\n handleSchemaInit()\n\n // 智能重置:只有在真正需要时才清空已渲染项\n if (hasPropsChange) {\n renderedItems.value.clear()\n }\n\n pendingItems.value = []\n componentLoadTimes.value = []\n\n nextTick(() => {\n initializeLazyLoading()\n })\n }\n }\n\n // 更新快照\n lastSchemaSnapshot.value = currentSnapshot\n // console.log('📸 [ZnFormV2 Schema Watch] 更新快照')\n }\n },\n { immediate: false, deep: true }\n )\n\n // 监听enum变化 - 优化版本,避免不必要的重新渲染\n watch(\n () =>\n unref(getProps).schema?.map((item) => ({\n prop: item.prop,\n enum: item.enum,\n dictCode: item.dictCode\n })),\n (newEnums, oldEnums) => {\n if (!newEnums || !oldEnums || newEnums.length !== oldEnums.length) return\n\n // 找出发生变化的enum项,只更新对应的枚举数据\n let hasEnumChanges = false\n const changedProps: string[] = []\n\n newEnums.forEach((newItem, index) => {\n const oldItem = oldEnums[index]\n if (newItem.enum !== oldItem?.enum || newItem.dictCode !== oldItem?.dictCode) {\n const schemaItem = unref(getProps).schema?.find((item) => item.prop === newItem.prop)\n if (schemaItem) {\n hasEnumChanges = true\n changedProps.push(newItem.prop)\n\n // 异步更新枚举,避免阻塞主线程\n nextTick(() => {\n setEnumMap(schemaItem)\n })\n }\n }\n })\n\n // 只清除与变化的enum相关的缓存,而不是清除所有缓存\n if (hasEnumChanges) {\n // 使用防抖避免频繁清除缓存\n debouncer(\n 'enum_change',\n () => {\n // 只清除与变化的props相关的缓存,但不清除processedSchema缓存\n // 因为enum变化不影响schema结构,不需要重新渲染所有组件\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n // 不清除 processedSchema_ 缓存,只清除与具体字段相关的缓存\n if (!key.startsWith('processedSchema_') && changedProps.some((prop) => key.includes(prop))) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n },\n 100\n ) // 使用较长的防抖时间避免频繁操作\n }\n },\n { deep: true }\n )\n\n // 监听 isView 和 hidden 相关属性变化,清除相关缓存\n watch(\n [\n () => props.isView,\n () =>\n unref(getProps).schema?.map((item) => ({\n prop: item.prop,\n hidden: item.hidden,\n hiddenInView: item.hiddenInView,\n hiddenLabel: item.hiddenLabel\n }))\n ],\n (newValues, oldValues) => {\n if (!oldValues) return\n\n const [newIsView, newHiddenProps] = newValues\n const [oldIsView, oldHiddenProps] = oldValues\n\n // 检查是否有实际变化\n let hasChanges = newIsView !== oldIsView\n\n if (!hasChanges && newHiddenProps && oldHiddenProps) {\n // 检查 hidden 相关属性是否有变化\n hasChanges = newHiddenProps.some((newItem, index) => {\n const oldItem = oldHiddenProps[index]\n return !oldItem || newItem.hidden !== oldItem.hidden || newItem.hiddenInView !== oldItem.hiddenInView || newItem.hiddenLabel !== oldItem.hiddenLabel\n })\n }\n\n if (hasChanges) {\n // 使用防抖避免频繁清除缓存\n debouncer(\n 'view_hidden_change',\n () => {\n // 只清除与显示/隐藏相关的缓存\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n if (key.startsWith('processedSchema_') || key.includes('_hidden_') || key.includes('_view_')) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n },\n 50\n )\n }\n },\n { deep: true }\n )\n\n // 监听隐藏字段状态变化,清理隐藏字段的值\n watch(\n () => {\n if (!props.clearHiddenFieldValues) return []\n\n const schemaList = unref(getProps).schema || []\n return schemaList.map((item) => ({\n prop: item.prop,\n isHidden: getIsHidden(item) || (props.isView && getIsHiddenInView(item))\n }))\n },\n (newHiddenStates, oldHiddenStates) => {\n if (!props.clearHiddenFieldValues || !oldHiddenStates || !newHiddenStates) return\n\n // 找出从显示变为隐藏的字段\n const fieldsToClear = newHiddenStates.filter((newState, index) => {\n const oldState = oldHiddenStates[index]\n // 字段从显示(false)变为隐藏(true)\n return oldState && !oldState.isHidden && newState.isHidden\n })\n\n // 清理这些字段的值\n if (fieldsToClear.length > 0) {\n const modelValue = unref(model)\n fieldsToClear.forEach(({ prop }) => {\n if (modelValue.hasOwnProperty(prop)) {\n // console.log(`🧹 ZnFormV2: 清理隐藏字段 '${prop}' 的值`)\n modelValue[prop] = null\n }\n })\n }\n },\n { deep: true }\n )\n\n // 获取可见的表单项prop列表\n const getVisibleFormProps = () => {\n const schemaList = getProcessedSchema.value\n const visibleProps = schemaList.filter((item) => !item._hidden && !item._hiddenInView).map((item) => item.prop)\n\n return visibleProps\n }\n\n // 暴露方法\n const validate = (callback?: (valid: boolean, invalidFields?: any) => void) => {\n if (!elFormRef.value) {\n callback?.(true)\n return Promise.resolve(true)\n }\n\n // 如果没有传递回调函数,使用Promise方式\n if (!callback) {\n return new Promise((resolve, reject) => {\n elFormRef.value?.validate((valid, invalidFields) => {\n if (valid) {\n resolve(true)\n } else {\n // 根据配置决定是否过滤隐藏表单项的验证错误\n if (props.excludeHiddenFieldsValidation) {\n const visibleProps = getVisibleFormProps()\n const filteredInvalidFields: any = {}\n\n if (invalidFields) {\n Object.keys(invalidFields).forEach((prop) => {\n if (visibleProps.includes(prop)) {\n filteredInvalidFields[prop] = invalidFields[prop]\n }\n })\n }\n\n // 如果过滤后没有错误,则认为验证通过\n const hasVisibleErrors = Object.keys(filteredInvalidFields).length > 0\n if (hasVisibleErrors) {\n reject(filteredInvalidFields)\n } else {\n resolve(true)\n }\n } else {\n // 不过滤隐藏字段,直接返回原始验证结果\n reject(invalidFields)\n }\n }\n })\n })\n }\n\n // 使用回调函数方式\n elFormRef.value.validate((valid, invalidFields) => {\n if (valid) {\n callback(true)\n } else {\n // 根据配置决定是否过滤隐藏表单项的验证错误\n if (props.excludeHiddenFieldsValidation) {\n const visibleProps = getVisibleFormProps()\n const filteredInvalidFields: any = {}\n\n if (invalidFields) {\n Object.keys(invalidFields).forEach((prop) => {\n if (visibleProps.includes(prop)) {\n filteredInvalidFields[prop] = invalidFields[prop]\n }\n })\n }\n\n // 如果过滤后没有错误,则认为验证通过\n const hasVisibleErrors = Object.keys(filteredInvalidFields).length > 0\n callback(!hasVisibleErrors, hasVisibleErrors ? filteredInvalidFields : undefined)\n } else {\n // 不过滤隐藏字段,直接返回原始验证结果\n callback(false, invalidFields)\n }\n }\n })\n }\n\n const validateField = (props: FormItemProp, callback?: (errorMessage: string) => void) => {\n // 根据配置决定是否过滤隐藏字段\n if (getProps.value.excludeHiddenFieldsValidation) {\n // 检查要验证的字段是否可见\n const visibleProps = getVisibleFormProps()\n const propsArray = Array.isArray(props) ? props : [props]\n\n // 过滤掉隐藏的字段\n const visiblePropsToValidate = propsArray.filter((prop) => visibleProps.includes(prop as string))\n\n // 如果没有可见的字段需要验证,直接返回成功\n if (visiblePropsToValidate.length === 0) {\n callback?.('')\n return Promise.resolve('')\n }\n\n // 验证可见的字段\n const finalProps = visiblePropsToValidate.length === 1 ? visiblePropsToValidate[0] : visiblePropsToValidate\n return elFormRef.value?.validateField(finalProps as FormItemProp, callback)\n } else {\n // 不过滤隐藏字段,直接验证所有字段\n return elFormRef.value?.validateField(props, callback)\n }\n }\n\n const resetFields = () => {\n elFormRef.value?.resetFields()\n }\n\n const resetForm = () => {\n // 重置表单数据\n Object.keys(model.value).forEach((key) => {\n delete model.value[key]\n })\n\n // 重置验证状态\n elFormRef.value?.clearValidate()\n\n // 触发表单初始化,重新设置默认值\n nextTick(() => {\n handleSchemaInit()\n })\n }\n\n const clearValidate = (props?: FormItemProp) => {\n elFormRef.value?.clearValidate(props)\n }\n\n const scrollToField = (prop: FormItemProp) => {\n elFormRef.value?.scrollToField(prop)\n }\n\n // 注册表单方法\n const registerMethods = {\n validate,\n validateField,\n resetFields,\n resetForm,\n clearValidate,\n scrollToField,\n setEnumMap,\n initDefaultValue,\n clearCache\n }\n\n // 组件挂载后初始化\n onMounted(() => {\n // delayLoad期间显示骨架屏,避免阻塞主线程\n if (props.delayLoad > 0) {\n // 在delayLoad期间完全不做任何操作,避免阻塞主线程\n setTimeout(() => {\n showComponentSkeleton.value = false\n componentLoadReady.value = true\n\n // 延迟初始化完成后,主动触发schema处理\n const schema = unref(getProps).schema\n if (schema?.length) {\n handleSchemaInit()\n\n if (shouldUseLazyLoad.value) {\n initializeLazyLoading()\n }\n }\n\n // 标记为已初始化\n isInitialized.value = true\n emit('register', extendedRegisterMethods)\n }, props.delayLoad)\n } else {\n // 无延迟,立即初始化\n showComponentSkeleton.value = false\n componentLoadReady.value = true\n\n // 立即处理schema\n const schema = unref(getProps).schema\n if (schema?.length) {\n handleSchemaInit()\n\n if (shouldUseLazyLoad.value) {\n initializeLazyLoading()\n }\n }\n\n // 标记为已初始化\n isInitialized.value = true\n emit('register', extendedRegisterMethods)\n }\n\n // 启动性能监控定时器\n if (props.enablePerformanceMonitoring) {\n loadingTimer.value = setInterval(() => {\n performanceStats.value.cacheStats = performanceCache.getStats()\n emit('onPerformanceUpdate', performanceStats.value)\n }, props.performanceConfig.reportInterval || 2000) as any\n }\n })\n\n // 组件卸载前清理\n onBeforeUnmount(() => {\n cleanup()\n })\n\n // 新增方法实现\n const setProps = (newProps: Partial<ZnFormV2Props>) => {\n Object.assign(mergeProps.value, newProps)\n if (newProps.modelValue) {\n Object.assign(model.value, newProps.modelValue)\n }\n }\n\n const setValues = (data: Record<string, any>) => {\n Object.assign(model.value, data)\n }\n\n const setSchema = (config: FormSetProps) => {\n const { prop, field, value } = config\n const currentSchema = [...(unref(getProps).schema || [])]\n\n if (field === 'schema') {\n // 直接设置整个 schema\n mergeProps.value.schema = value as ZnFormV2SchemaProps[]\n } else {\n // 修改特定字段的特定属性\n const targetItem = currentSchema.find((item) => item.prop === prop)\n if (targetItem) {\n ;(targetItem as any)[field] = value\n // 更新整个 schema 以触发响应式更新\n mergeProps.value.schema = currentSchema\n }\n }\n }\n\n const addSchema = (formSchema: ZnFormV2SchemaProps, prop?: number | string, position: 'before' | 'after' = 'after') => {\n const currentSchema = [...(unref(getProps).schema || [])]\n\n if (typeof prop === 'number') {\n // 按索引插入\n currentSchema.splice(prop, 0, formSchema)\n } else if (typeof prop === 'string') {\n // 按 prop 名称查找位置插入\n const index = currentSchema.findIndex((item) => item.prop === prop)\n if (index !== -1) {\n const insertIndex = position === 'before' ? index : index + 1\n currentSchema.splice(insertIndex, 0, formSchema)\n } else {\n currentSchema.push(formSchema)\n }\n } else {\n // 添加到末尾\n currentSchema.push(formSchema)\n }\n\n mergeProps.value.schema = currentSchema\n\n // 动态添加的表单项会通过 schema watch 自动处理懒加载逻辑\n }\n\n const delSchema = (prop: string) => {\n const currentSchema = unref(getProps).schema || []\n const newSchema = currentSchema.filter((item) => item.prop !== prop)\n mergeProps.value.schema = newSchema\n\n // 如果是懒加载模式,需要清理删除项的相关状态\n if (shouldUseLazyLoad.value) {\n // 从已渲染列表中移除\n renderedItems.value.delete(prop)\n\n // 从待渲染队列中移除\n pendingItems.value = pendingItems.value.filter((item) => item.prop !== prop)\n\n // 清理相关缓存\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n if (key.includes(prop)) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n\n // 清理依赖追踪缓存\n renderDependencyTracker.clearDependencies(prop)\n }\n }\n\n const getFormData = <T = Record<string, any>,>(filterEmptyVal = true): T => {\n const formData = model.value\n\n if (filterEmptyVal) {\n // 过滤空值\n return Object.keys(formData).reduce((prev, next) => {\n const value = formData[next]\n if (value !== '' && value !== null && value !== undefined) {\n if (typeof value === 'object' && value !== null) {\n if (Object.keys(value).length > 0) prev[next] = value\n } else prev[next] = value\n }\n return prev\n }, {}) as T\n }\n\n return formData as T\n }\n\n // 表单项实例存储\n const formItemRefs = ref(new Map<string, any>())\n const componentRefs = ref(new Map<string, any>())\n\n const getComponentExpose = (prop: string) => {\n return componentRefs.value.get(prop) || null\n }\n\n const getFormItemExpose = (prop: string) => {\n return formItemRefs.value.get(prop) || null\n }\n\n const getSchema = () => {\n return unref(getProps).schema || []\n }\n\n /**\n * 手动刷新指定prop的表单项\n * @param prop 要刷新的表单项prop\n * @param options 刷新选项\n */\n const refreshFormItem = async (\n prop: string,\n options?: {\n /** 是否重新初始化枚举数据 */\n refreshEnum?: boolean\n /** 是否重新设置默认值 */\n refreshDefaultValue?: boolean\n /** 是否清除验证状态 */\n clearValidate?: boolean\n }\n ) => {\n const { refreshEnum = true, refreshDefaultValue = false, clearValidate = true } = options || {}\n\n // 1. 查找对应的schema项\n const schemaItem = unref(getProps).schema?.find((item) => item.prop === prop)\n if (!schemaItem) {\n console.warn(`[ZnFormV2] 未找到prop为 \"${prop}\" 的表单项`)\n\n return\n }\n\n // 2. 清除与该prop相关的所有缓存\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n if (key.includes(prop)) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n\n // 3. 清除依赖追踪缓存\n renderDependencyTracker.clearDependencies(prop)\n\n // 4. 清除智能缓存中与该prop相关的缓存\n clearRelatedCache(performanceCache, 'hidden', [prop])\n clearRelatedCache(performanceCache, 'hiddenInView', [prop])\n clearRelatedCache(performanceCache, 'hiddenLabel', [prop])\n clearRelatedCache(performanceCache, 'render', [prop])\n\n // 5. 清除所有可能与该字段相关的缓存(包括 formProps 等)\n const additionalCacheKeys = ['formProps', 'props', 'placeholder', 'disabled', 'clearable']\n additionalCacheKeys.forEach(prefix => {\n clearRelatedCache(performanceCache, prefix, [prop])\n })\n\n // 5. 重新初始化枚举数据\n if (refreshEnum && schemaItem.enum) {\n try {\n await setEnumMap(schemaItem)\n } catch (error) {\n console.error(`[ZnFormV2] 刷新prop \"${prop}\" 的枚举数据失败:`, error)\n }\n }\n\n // 6. 重新设置默认值\n if (refreshDefaultValue && schemaItem.defaultValue !== undefined) {\n try {\n await initDefaultValue(schemaItem)\n } catch (error) {\n console.error(`[ZnFormV2] 刷新prop \"${prop}\" 的默认值失败:`, error)\n }\n }\n\n // 7. 清除验证状态\n if (clearValidate) {\n elFormRef.value?.clearValidate(prop)\n }\n\n // 8. 如果是懒加载模式,重新标记该项为需要渲染\n if (shouldUseLazyLoad.value) {\n // 移除已渲染标记,强制重新渲染\n renderedItems.value.delete(prop)\n\n // 将该项重新加入渲染队列\n const schemaList = getProcessedSchema.value\n const targetItem = schemaList.find((item) => item.prop === prop)\n if (targetItem && !pendingItems.value.some((item) => item.prop === prop)) {\n // 插入到队列开头,优先渲染\n pendingItems.value.unshift(targetItem)\n\n // 如果当前没有在渲染,立即开始渲染\n if (!isRendering.value) {\n nextTick(() => {\n startBatchRendering()\n })\n }\n }\n }\n\n // 9. 刷新 ZnFormV2Item 组件的 formProps\n const znFormV2ItemRef = znFormV2ItemRefs.value.get(prop)\n if (znFormV2ItemRef && znFormV2ItemRef.refreshFormProps) {\n znFormV2ItemRef.refreshFormProps()\n }\n\n // 10. 强制触发重新渲染\n await nextTick()\n\n // console.log(`已刷新表单项: ${prop}`)\n }\n\n // 更新注册方法\n const extendedRegisterMethods = {\n ...registerMethods,\n setProps,\n setValues,\n setSchema,\n addSchema,\n delSchema,\n getFormData,\n getComponentExpose,\n getFormItemExpose,\n getSchema,\n refreshFormItem,\n model: model.value\n }\n\n // 暴露API\n defineExpose({\n ...extendedRegisterMethods,\n form: elFormRef,\n enumMap,\n model: model.value\n })\n\n // 自动决定是否启用懒加载 - 默认启用,当作大组件处理\n const shouldUseLazyLoad = computed(() => {\n const schemaLength = unref(getProps).schema?.length || 0\n const userLazyLoad = props.lazyLoad\n\n // 如果用户明确设置lazy-load为false,则禁用懒加载\n if (userLazyLoad === false) {\n return false\n }\n\n // 默认情况下启用懒加载,把所有表单都当作大组件处理\n if (userLazyLoad === true) {\n return true\n }\n\n // 对于非常小的表单(少于5个表单项且无自定义render),可以考虑同步渲染\n if (schemaLength < 5) {\n const renderFunctionCount = unref(getProps).schema?.filter((item) => item.render || item.renderInView)?.length || 0\n if (renderFunctionCount === 0) {\n return false\n }\n }\n\n // 其他情况默认启用懒加载\n return true\n })\n</script>\n"],"names":["_isSlot","s","_isVNode","Object","prototype","toString","call","prefixClass","PERFORMANCE_CONFIG","PerformanceCache","__name","this","cache","Map","timers","hitCount","missCount","has","key","item","get","Date","now","timestamp","delete","value","undefined","set","size","firstKey","keys","next","clearTimeout","timer","setTimeout","clear","forEach","getStats","hitRate","createDebouncer","fn","delay","createModelHasher","lastModel","lastHash","lastStringified","model","stringified","JSON","stringify","sort","hash","i","length","charCodeAt","finalHash","props","__props","emit","__emit","_useModel","elFormRef","shallowRef","mergeProps","ref","getProps","computed","propsObj","assign","unref","enumMap","enumMapProps","renderedItems","Set","pendingItems","componentLoadReady","showComponentSkeleton","delayLoad","loadingTimer","componentLoadTimes","performanceCache","debouncer","modelHasher","performanceStats","renderTime","componentCount","cacheHitRate","queueLength","cacheStats","isRendering","isInitialized","clearCache","cleanup","getCurrentInstance","clearInterval","setEnumMap","async","enum","enumValue","prop","cacheEnum","enumMapConst","data","result","Array","isArray","console","warn","nextTick","schemaItem","schema","find","initDefaultValue","error","provide","formEnumMapKey","znFormV2ItemRefs","componentRefsCollector","setComponentRef","setFormItemRef","setZnFormV2ItemRef","renderDependencyTracker","dependencies","renderAccess","currentTrackingRender","startTracking","stopTracking","trackFieldAccess","accessedField","add","getAffectedRenders","changedField","clearDependencies","field","dependents","createTrackedModel","originalModel","Proxy","target","defaultValue","fieldNames","formConst","getFormProp","defaultValueConst","setFormProp","enumData","filter","isDefault","cascadeEnum","el","subProp","subEnum","hyphenToCamelCase","ComponentNameEnum","EL_SELECT","watch","newVal","subEnumData","formEnum","subValue","immediate","getIsHidden","hidden","config","prefix","debug","debugField","withSmartCache","getIsHiddenInView","isView","hiddenInView","getIsHiddenLabel","hiddenLabel","getIsDestroyed","destroy","cacheKey","getProcessedSchema","schemaList","modelForHidden","currentHiddenStates","map","render","renderInView","join","items","a","b","order","index","hiddenState","state","renderPriority","enableAsyncRender","_index","_hidden","_hiddenInView","_hiddenLabel","processSchema","allKeys","_","startsWith","push","slice","getVisibleSchema","shouldUseLazyLoad","maxSyncRenderCount","rendered","from","filteredItems","includes","initialLoadCount","RenderFormWrap","markRaw","defineComponent","name","setup","useSlots","renderCache","getIncrementalCacheKey","useCol","baseKey","renderedProps","hiddenHash","rowProps","onlyRenderComponent","elFormProps","hasNoCacheItems","some","noCache","shouldShow","_withDirectives2","_createVNode2","ZnFormV2Item","column","modelValue","$event","isLazyLoading","isReady","_vShow2","ElForm","_mergeProps","class","default","renderWithCol","renderWithoutCol","maxCacheSize","setGridProp","col","span","xs","sm","md","lg","xl","_slot","ElRow","gutter","colProps","ElCol","ElFormItem","label","style","width","getPx","disableRulesInView","formItem","rules","initializeLazyLoading","Math","min","startBatchRendering","renderNext","startTime","performance","shift","time","enablePerformanceMonitoring","lazyLoadDelay","requestAnimationFrame","handleSchemaInit","lastSchemaSnapshot","newSchema","oldSchema","currentSnapshot","lastSnapshot","isAddingItems","isDeletingItems","hasPropsChange","isReorderingItems","lastPropsSet","newItems","newItem","currentPropsSet","lazyLoad","deep","dictCode","newEnums","oldEnums","hasEnumChanges","changedProps","oldItem","keysToDelete","newValues","oldValues","newIsView","newHiddenProps","oldIsView","oldHiddenProps","hasChanges","clearHiddenFieldValues","isHidden","newHiddenStates","oldHiddenStates","fieldsToClear","newState","oldState","hasOwnProperty","getVisibleFormProps","registerMethods","validate","callback","valid","invalidFields","excludeHiddenFieldsValidation","visibleProps","filteredInvalidFields","hasVisibleErrors","Promise","resolve","reject","validateField","visiblePropsToValidate","finalProps","resetFields","resetForm","clearValidate","scrollToField","onMounted","extendedRegisterMethods","setInterval","performanceConfig","reportInterval","onBeforeUnmount","setProps","newProps","setValues","setSchema","currentSchema","targetItem","addSchema","formSchema","position","splice","findIndex","insertIndex","delSchema","getFormData","filterEmptyVal","formData","reduce","prev","formItemRefs","componentRefs","getComponentExpose","getFormItemExpose","getSchema","refreshFormItem","options","refreshEnum","refreshDefaultValue","clearRelatedCache","unshift","znFormV2ItemRef","refreshFormProps","__expose","form","schemaLength","userLazyLoad"],"mappings":"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"}
1
+ {"version":3,"file":"index.vue2.mjs","sources":["../../../../../../packages/components/znFormV2/src/index.vue"],"sourcesContent":["<script lang=\"tsx\">\nconst prefixClass = 'zn-form-v2'\n</script>\n<template>\n <div :class=\"[prefixClass, 'zn-znform-v2-container']\" ref=\"containerRef\">\n <!-- 性能监控面板 -->\n <div\n v-if=\"performanceConfig.enableDebug && performanceStats\"\n class=\"performance-panel\"\n style=\"\n position: fixed;\n z-index: 9999;\n top: 10px;\n right: 10px;\n padding: 10px;\n border-radius: 4px;\n background: rgb(0 0 0 / 80%);\n color: white;\n font-size: 12px;\n \">\n <div>渲染耗时: {{ performanceStats.renderTime.toFixed(2) }}ms</div>\n <div>组件数量: {{ performanceStats.componentCount }}</div>\n <div>缓存命中率: {{ (performanceStats.cacheHitRate * 100).toFixed(1) }}%</div>\n <div>队列长度: {{ performanceStats.queueLength }}</div>\n </div>\n\n <!-- 组件级别的骨架屏 - delayLoad期间显示 -->\n <el-skeleton v-if=\"showComponentSkeleton\" :rows=\"8\" animated></el-skeleton>\n\n <!-- 表单容器 - 组件准备好后显示 -->\n <div v-show=\"!showComponentSkeleton && componentLoadReady\">\n <RenderFormWrap />\n\n <!-- 懒加载状态 -->\n <div\n v-if=\"isRendering && enablePerformanceMonitoring\"\n class=\"loading\"\n style=\"display: flex; position: absolute; z-index: 1000; top: 50%; left: 50%; align-items: center; transform: translate(-50%, -50%); gap: 10px\">\n <div\n style=\"\n width: 16px;\n height: 16px;\n animation: spin 1s linear infinite;\n border: 2px solid #409eff;\n border-top: 2px solid transparent;\n border-radius: 50%;\n \"></div>\n <span>正在渲染表单项...</span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"tsx\">\n import {\n type ComponentPublicInstance,\n computed,\n defineComponent,\n markRaw,\n onMounted,\n onUnmounted,\n provide,\n ref,\n shallowRef,\n unref,\n useSlots,\n watch,\n nextTick,\n Fragment,\n onBeforeUnmount,\n getCurrentInstance\n } from 'vue'\n\n import ZnFormV2Item from './components/ZnFormV2Item.vue'\n\n import { deleteObjProperty, getFormProp, getPx, hyphenToCamelCase, isString, setFormProp } from './helper'\n import { componentMap } from './helper/componentMap'\n import { ComponentNameEnum, formEnumMapKey, type ZnFormV2SchemaProps, type FormSetProps, type ZnElFormProps, type ValueType } from './interface'\n import {\n type ColProps,\n ElCol,\n ElForm,\n ElFormItem,\n ElRow,\n ElSkeleton,\n ElSkeletonItem,\n type FormInstance,\n type FormItemInstance,\n type FormItemProp,\n type RowProps\n } from 'element-plus'\n import { PerformanceOptimizer, DEFAULT_PERFORMANCE_CONFIG } from './performance/PerformanceOptimizer'\n import { withSmartCache, clearRelatedCache, type SmartCacheConfig } from './utils/smartCache'\n\n defineOptions({ name: 'ZnFormV2' })\n\n \n\n // 添加性能优化相关的配置\n const PERFORMANCE_CONFIG = {\n CACHE_MAX_SIZE: 1000, // 最大缓存数量\n CACHE_TTL: 30000, // 缓存30秒过期\n DEBOUNCE_DELAY: 16, // 16ms防抖(60fps)\n BATCH_RENDER_SIZE: 10, // 每批渲染数量\n MAX_SYNC_RENDER: 50 // 超过50个组件强制异步\n }\n\n // 优化缓存系统\n class PerformanceCache {\n public cache = new Map()\n private timers = new Map()\n private hitCount = 0\n private missCount = 0\n\n has(key: string): boolean {\n const item = this.cache.get(key)\n if (item && Date.now() - item.timestamp < PERFORMANCE_CONFIG.CACHE_TTL) {\n return true\n }\n if (item) {\n this.delete(key) // 清理过期项\n }\n return false\n }\n\n get(key: string) {\n const item = this.cache.get(key)\n if (item && Date.now() - item.timestamp < PERFORMANCE_CONFIG.CACHE_TTL) {\n this.hitCount++\n return item.value\n }\n this.missCount++\n this.delete(key)\n return undefined\n }\n\n set(key: string, value: any) {\n // 限制缓存大小\n if (this.cache.size >= PERFORMANCE_CONFIG.CACHE_MAX_SIZE) {\n const firstKey = this.cache.keys().next().value\n this.delete(firstKey)\n }\n\n this.cache.set(key, {\n value,\n timestamp: Date.now()\n })\n\n // 设置过期定时器\n if (this.timers.has(key)) {\n clearTimeout(this.timers.get(key))\n }\n\n const timer = setTimeout(() => {\n this.delete(key)\n }, PERFORMANCE_CONFIG.CACHE_TTL)\n\n this.timers.set(key, timer)\n }\n\n delete(key: string) {\n this.cache.delete(key)\n const timer = this.timers.get(key)\n if (timer) {\n clearTimeout(timer)\n this.timers.delete(key)\n }\n }\n\n clear() {\n this.cache.clear()\n this.timers.forEach((timer) => clearTimeout(timer))\n this.timers.clear()\n }\n\n getStats() {\n return {\n size: this.cache.size,\n hitRate: this.hitCount / (this.hitCount + this.missCount) || 0,\n hitCount: this.hitCount,\n missCount: this.missCount\n }\n }\n }\n\n // 防抖函数优化\n const createDebouncer = () => {\n const timers = new Map()\n\n return (key: string, fn: Function, delay = PERFORMANCE_CONFIG.DEBOUNCE_DELAY) => {\n if (timers.has(key)) {\n clearTimeout(timers.get(key))\n }\n\n const timer = setTimeout(() => {\n fn()\n timers.delete(key)\n }, delay)\n\n timers.set(key, timer)\n }\n }\n\n // Model变化检测优化 - 更精确的哈希算法\n const createModelHasher = () => {\n let lastModel: any = null\n let lastHash = ''\n let lastStringified = ''\n\n return (model: any) => {\n if (model === lastModel) return lastHash\n\n // 使用 JSON.stringify 生成更精确的哈希\n const stringified = JSON.stringify(model, Object.keys(model).sort())\n\n if (stringified === lastStringified) {\n return lastHash\n }\n\n // 生成简单但有效的哈希\n let hash = 0\n for (let i = 0; i < stringified.length; i++) {\n const char = stringified.charCodeAt(i)\n hash = (hash << 5) - hash + char\n hash = hash & hash // Convert to 32bit integer\n }\n\n const finalHash = hash.toString(36)\n\n lastModel = model\n lastHash = finalHash\n lastStringified = stringified\n return finalHash\n }\n }\n\n export interface ZnFormV2Props {\n /** 表单值 */\n modelValue?: Record<string, any>\n /** 表单配置项 */\n schema?: ZnFormV2SchemaProps[]\n /** ElForm 的 props */\n elFormProps?: ZnElFormProps | Record<string, any>\n /** 是否使用栅格布局, 默认 true */\n useCol?: boolean\n /** 栅格布局全局设置 */\n rowProps?: Partial<RowProps> & {\n col?: Partial<ColProps>\n }\n /** 是否只渲染 ZnFormItem 组件,只使用表单组件 */\n onlyRenderComponent?: boolean\n /**\n * 动态 model,如果 schema 发生变化,则重新渲染 model 表单数据\n * (将不存在 schema 的 prop 从 model 中去掉),默认启用 true\n */\n dynamicModel?: boolean\n /**\n * 搭配 dynamicModel 使用,清除 model 不存在的 prop 时,\n * 指定保留 prop。如果不传,则不做清除\n */\n includeModelKeys?: string[]\n /**\n * 存储 enum 值。该 props 是搭配 ProTable 使用,\n * 因为 ProTable 已经初始化部分字典数据,\n * 因此不需要 ProForm 再次请求这些字典数据\n */\n enumMapProps?: Map<string, Record<string, any>[]>\n /** 是否查看,默认为否 */\n isView?: boolean\n /**查看状态时,禁用表单验证 */\n disableRulesInView?: boolean\n /** 是否延迟加载表单项,用于优化大型表单渲染性能 */\n lazyLoad?: boolean\n /** 延迟加载的时间间隔,单位毫秒 */\n lazyLoadDelay?: number\n /** 初始加载的表单项数量,默认为10 */\n initialLoadCount?: number\n /** 每批加载的表单项数量,默认为5 */\n batchLoadCount?: number\n /** 开启懒加载调试模式 */\n lazyLoadDebug?: boolean\n /** 整个组件延时加载时间,用于避免阻塞主线程,单位毫秒,默认500ms */\n delayLoad?: number\n\n // 新增的性能优化配置\n /** 性能配置 */\n performanceConfig?: any\n /** 启用虚拟滚动 */\n enableVirtualScroll?: boolean\n /** 虚拟滚动配置 */\n virtualScrollConfig?: any\n /** 时间切片配置 */\n timeSliceConfig?: any\n /** 最大同步渲染数量 */\n maxSyncRenderCount?: number\n /** 渲染批次大小 */\n renderBatchSize?: number\n /** 渲染延迟 */\n renderDelay?: number\n /** 启用性能监控 */\n enablePerformanceMonitoring?: boolean\n /** 是否排除隐藏表单项的验证,默认为true */\n excludeHiddenFieldsValidation?: boolean\n /** 是否清理隐藏字段的值,当字段隐藏时将值设置为null,默认为true */\n clearHiddenFieldValues?: boolean\n }\n\n const props = defineProps({\n modelValue: { type: Object, required: false, default: () => ({}) },\n schema: { type: Array, required: false, default: () => [] },\n elFormProps: { required: false, default: () => ({}) },\n useCol: { type: Boolean, required: false, default: true },\n rowProps: { type: Object, required: false },\n onlyRenderComponent: { type: Boolean, required: false, default: false },\n dynamicModel: { type: Boolean, required: false, default: true },\n includeModelKeys: { type: Array, required: false },\n enumMapProps: { type: Map, required: false },\n isView: { type: Boolean, required: false, default: false },\n disableRulesInView: { type: Boolean, required: false, default: true },\n lazyLoad: { type: Boolean, required: false, default: false },\n lazyLoadDelay: { type: Number, required: false, default: 16 },\n initialLoadCount: { type: Number, required: false, default: 20 },\n batchLoadCount: { type: Number, required: false, default: 30 },\n lazyLoadDebug: { type: Boolean, required: false, default: false },\n delayLoad: { type: Number, required: false, default: 200 },\n performanceConfig: { required: false, default: () => ({\n enableMonitoring: false,\n enableDebug: false,\n reportInterval: 5000\n }) },\n enableVirtualScroll: { type: Boolean, required: false, default: false },\n virtualScrollConfig: { required: false, default: () => ({\n enabled: false,\n height: 400,\n itemHeight: 60,\n buffer: 5\n }) },\n timeSliceConfig: { required: false, default: () => ({\n enabled: true,\n sliceSize: 5,\n batchSize: 10\n }) },\n maxSyncRenderCount: { type: Number, required: false, default: 20 },\n renderBatchSize: { type: Number, required: false, default: 10 },\n renderDelay: { type: Number, required: false, default: 0 },\n enablePerformanceMonitoring: { type: Boolean, required: false, default: false },\n excludeHiddenFieldsValidation: { type: Boolean, required: false, default: true },\n clearHiddenFieldValues: { type: Boolean, required: false, default: true }\n})\n\n const emit = defineEmits([\n 'update:modelValue',\n 'update:schema',\n 'register',\n 'onSearch',\n 'onReset',\n 'onChange',\n 'onEnumChange',\n 'onSchemaChange',\n 'onPerformanceUpdate'\n ])\n\n const model = defineModel<Record<string, any>>({ default: () => ({}) })\n\n // 存储 ElForm 实例\n const elFormRef = shallowRef<FormInstance>()\n\n const mergeProps = ref<ZnFormV2Props>({})\n\n const getProps = computed(() => {\n const propsObj = { ...props }\n Object.assign(propsObj, unref(mergeProps))\n return propsObj\n })\n\n // 定义 enumMap 存储 enum 值\n const enumMap = ref(props.enumMapProps || new Map<string, Record<string, any>[]>())\n\n // 跟踪哪些表单项已经渲染,用于懒加载\n const renderedItems = ref(new Set<string>())\n // 记录需要懒加载的表单项\n const pendingItems = ref<ZnFormV2SchemaProps[]>([])\n // 组件级别的加载状态\n const componentLoadReady = ref(false)\n // 显示组件级别的骨架屏状态 - 根据delayLoad决定初始值\n const showComponentSkeleton = ref(props.delayLoad > 0)\n // 用于更新加载时间显示的定时器\n const loadingTimer = ref<NodeJS.Timeout | null>(null)\n // 用于触发加载时间更新的响应式变量\n const updateTrigger = ref(0)\n // 用于记录每个组件的加载耗时\n const componentLoadTimes = ref<Array<{ prop: string; time: number }>>([])\n\n // 用于缓存计算结果 - 替换为高性能缓存系统\n const performanceCache = new PerformanceCache()\n const debouncer = createDebouncer()\n const modelHasher = createModelHasher()\n\n // 性能监控\n const performanceStats = ref({\n renderTime: 0,\n componentCount: 0,\n cacheHitRate: 0,\n queueLength: 0,\n cacheStats: {\n size: 0,\n hitRate: 0,\n hitCount: 0,\n missCount: 0\n }\n })\n\n // 渲染状态\n const isRendering = ref(false)\n\n // 添加初始化状态标记\n const isInitialized = ref(false)\n\n const clearCache = () => {\n performanceCache.clear()\n }\n\n // 组件实例引用用于清理\n const componentInstance = getCurrentInstance()\n\n // 清理所有定时器和缓存\n const cleanup = () => {\n if (loadingTimer.value) {\n clearInterval(loadingTimer.value)\n loadingTimer.value = null\n }\n performanceCache.clear()\n }\n\n const setEnumMap = async ({ enum: enumValue, prop, cacheEnum = true }: ZnFormV2SchemaProps) => {\n if (!enumValue) return\n\n const enumMapConst = unref(enumMap)\n\n // 当前 enum 为静态数据,则直接存储到 enumMap\n if (typeof enumValue !== 'function') {\n enumMapConst.set(prop, unref(enumValue)!)\n enumMap.value = new Map(enumMapConst)\n return\n }\n\n try {\n // 为了防止接口执行慢,而存储慢,导致重复请求,所以预先存储为[],接口返回后再二次存储\n enumMapConst.set(prop!, [])\n\n // 如果当前 enum 为后台数据需要请求数据,则调用该请求接口,并存储到 enumMap\n let data = await enumValue(unref(model), enumMapConst)\n\n // 适配 enum 接口返回 data 以及自定义函数返回数组\n data = data?.result || data\n\n // 如果返回的数据不是数组,则警告并强制转换为数组\n if (!Array.isArray(data)) {\n console.warn(`警告: '${prop}' 的enum函数返回值不是数组`, data)\n data = []\n }\n\n // 更新enumMap\n enumMapConst.set(prop, data)\n enumMap.value = new Map(enumMapConst)\n\n // 在下一tick触发初始化默认值\n nextTick(() => {\n if (prop) {\n const schemaItem = unref(getProps).schema?.find((item) => item.prop === prop)\n if (schemaItem) {\n initDefaultValue(schemaItem)\n }\n }\n })\n } catch (error) {\n console.error(`[ZnFormV2] 添加enum函数参数失败: '${prop}'`, error)\n enumMapConst.set(prop!, [])\n enumMap.value = new Map(enumMapConst)\n }\n }\n\n provide(formEnumMapKey, enumMap)\n\n // 提供实例引用收集器\n // 添加 ZnFormV2Item 实例存储\n const znFormV2ItemRefs = ref(new Map<string, any>())\n\n const componentRefsCollector = {\n setComponentRef: (prop: string, ref: any) => {\n componentRefs.value.set(prop, ref)\n },\n setFormItemRef: (prop: string, ref: any) => {\n formItemRefs.value.set(prop, ref)\n },\n setZnFormV2ItemRef: (prop: string, ref: any) => {\n znFormV2ItemRefs.value.set(prop, ref)\n }\n }\n provide('componentRefsCollector', componentRefsCollector)\n\n // 细粒度依赖追踪系统\n const renderDependencyTracker = {\n // 存储每个字段的render函数依赖关系\n dependencies: new Map<string, Set<string>>(), // prop -> Set of dependent fields\n\n // 存储每个render函数访问的字段\n renderAccess: new Map<string, Set<string>>(), // prop -> Set of accessed fields\n\n // 当前正在追踪的render函数\n currentTrackingRender: null as string | null,\n\n // 开始追踪某个render函数的依赖\n startTracking(prop: string) {\n this.currentTrackingRender = prop\n if (!this.renderAccess.has(prop)) {\n this.renderAccess.set(prop, new Set())\n }\n // 清除之前的依赖记录,重新收集\n this.renderAccess.get(prop)!.clear()\n },\n\n // 停止追踪\n stopTracking() {\n this.currentTrackingRender = null\n },\n\n // 记录字段访问\n trackFieldAccess(accessedField: string) {\n if (this.currentTrackingRender) {\n this.renderAccess.get(this.currentTrackingRender)!.add(accessedField)\n\n // 建立反向依赖关系:accessedField -> currentTrackingRender\n if (!this.dependencies.has(accessedField)) {\n this.dependencies.set(accessedField, new Set())\n }\n this.dependencies.get(accessedField)!.add(this.currentTrackingRender)\n }\n },\n\n // 获取受某个字段变化影响的render函数\n getAffectedRenders(changedField: string): Set<string> {\n return this.dependencies.get(changedField) || new Set()\n },\n\n // 清除某个字段的依赖\n clearDependencies(prop: string) {\n // 清除该字段作为依赖者的记录\n if (this.renderAccess.has(prop)) {\n const accessedFields = this.renderAccess.get(prop)!\n accessedFields.forEach((field) => {\n const dependents = this.dependencies.get(field)\n if (dependents) {\n dependents.delete(prop)\n if (dependents.size === 0) {\n this.dependencies.delete(field)\n }\n }\n })\n this.renderAccess.delete(prop)\n }\n\n // 清除该字段作为被依赖者的记录\n this.dependencies.delete(prop)\n }\n }\n\n // 创建一个代理的model对象用于依赖追踪\n const createTrackedModel = (originalModel: any) => {\n return new Proxy(originalModel, {\n get(target, prop) {\n // 记录字段访问\n if (typeof prop === 'string' && renderDependencyTracker.currentTrackingRender) {\n renderDependencyTracker.trackFieldAccess(prop)\n }\n return target[prop]\n }\n })\n }\n\n // 提供依赖追踪器给子组件\n provide('renderDependencyTracker', renderDependencyTracker)\n provide('createTrackedModel', createTrackedModel)\n\n // 初始化默认值\n const initDefaultValue = async ({ defaultValue, fieldNames, prop }: ZnFormV2SchemaProps) => {\n const formConst = unref(model)\n const value = getFormProp(formConst, prop)\n\n if (value || value === false || value === 0) return\n\n const defaultValueConst = unref(defaultValue)\n // 设置表单项的默认值,如果存在值,则不需要赋默认值\n if (defaultValueConst !== undefined && defaultValueConst !== null) {\n if (typeof defaultValueConst !== 'function') return setFormProp(formConst, prop, defaultValueConst)\n\n return setFormProp(formConst, prop, await defaultValueConst(formConst, unref(enumMap)))\n }\n\n // 如果没有设置默认值,则判断后台是否返回 isDefault 为 Y 的枚举\n const enumData = unref(enumMap).get(prop)\n if (enumData?.length) {\n // 找出 isDefault 为 Y 的 value\n const data = enumData.filter((item) => item.isDefault === 'Y')\n\n return data.length && setFormProp(formConst, prop, data[0][fieldNames?.value ?? 'value'])\n }\n }\n\n /**\n * 多个 Select 框级联下拉\n */\n const cascadeEnum = ({ prop, el, subProp, subEnum }: ZnFormV2SchemaProps) => {\n if (hyphenToCamelCase(el) === ComponentNameEnum.EL_SELECT) {\n if (typeof subProp !== 'string') return\n // 监听级联下拉变化\n watch(\n () => getFormProp(unref(model), prop),\n async (newVal: string) => {\n const enumMapConst = unref(enumMap)\n // 选择时将级联的 subProp 置空\n if (unref(model)[subProp!]) unref(model)[subProp!] = ''\n\n if (!subEnum) return\n if (!newVal) return enumMapConst.set(subProp!, [])\n\n if (enumMapConst.get(`${subProp!}-${newVal}`)) {\n // 存在缓存字典数据,则取出来赋值\n enumMapConst.set(subProp!, enumMapConst.get(`${subProp!}-${newVal}`) || [])\n } else {\n if (typeof subEnum === 'function') {\n const subEnumData = await subEnum(newVal, enumMapConst.get(prop))\n // 缓存字典数据\n enumMapConst.set(`${subProp!}-${newVal}`, subEnumData)\n enumMapConst.set(subProp!, subEnumData)\n } else if (Array.isArray(subEnum)) {\n // 缓存字典数据\n enumMapConst.set(`${subProp!}-${newVal}`, subEnum)\n enumMapConst.set(subProp!, subEnum)\n }\n }\n\n const formEnum = enumMapConst.get(prop) || []\n const [enumValue] = formEnum.filter((item) => item.value === newVal)\n // 如果选中的字典有 subValue,则直接赋值给 subProp\n if (enumValue?.subValue) unref(model)[subProp!] = enumValue.subValue\n },\n { immediate: true }\n )\n }\n }\n\n // 处理 hidden 显隐逻辑 - 使用统一的智能缓存策略\n const getIsHidden = (item: ZnFormV2SchemaProps) => {\n if (typeof item.hidden === 'boolean') return item.hidden\n if (typeof item.hidden === 'function') {\n try {\n const config: SmartCacheConfig = {\n prefix: 'hidden',\n prop: item.prop,\n debug: false, // 可以根据需要开启调试\n debugField: '' // 可以指定调试的字段\n }\n return withSmartCache(item.hidden, config, model, performanceCache)\n } catch (error) {\n console.warn(`[ZnFormV2] Hidden function execution error for prop ${item.prop}:`, error)\n return false\n }\n }\n return false\n }\n\n // 处理 hiddenInView 查看模式下的显隐逻辑 - 使用统一的智能缓存策略\n const getIsHiddenInView = (item: ZnFormV2SchemaProps) => {\n // 只在查看模式下生效\n if (!props.isView) return false\n\n if (typeof item.hiddenInView === 'boolean') return item.hiddenInView\n if (typeof item.hiddenInView === 'function') {\n try {\n const config: SmartCacheConfig = {\n prefix: 'hiddenInView',\n prop: item.prop,\n debug: false, // 可以根据需要开启调试\n debugField: '' // 可以指定调试的字段\n }\n return withSmartCache(item.hiddenInView, config, model, performanceCache, { isView: props.isView })\n } catch (error) {\n console.warn(`[ZnFormV2] HiddenInView function execution error for prop ${item.prop}:`, error)\n return false\n }\n }\n return false\n }\n\n // 处理 hiddenLabel 标签显隐逻辑 - 使用统一的智能缓存策略\n const getIsHiddenLabel = (item: ZnFormV2SchemaProps) => {\n if (typeof item.hiddenLabel === 'boolean') return item.hiddenLabel\n if (typeof item.hiddenLabel === 'function') {\n try {\n const config: SmartCacheConfig = {\n prefix: 'hiddenLabel',\n prop: item.prop,\n debug: false, // 可以根据需要开启调试\n debugField: '' // 可以指定调试的字段\n }\n return withSmartCache(item.hiddenLabel, config, model, performanceCache)\n } catch (error) {\n console.warn(`[ZnFormV2] HiddenLabel function execution error for prop ${item.prop}:`, error)\n return false\n }\n }\n return false\n }\n\n // 处理 destroy 销毁逻辑\n const getIsDestroyed = (item: ZnFormV2SchemaProps) => {\n if (typeof item.destroy === 'boolean') return item.destroy\n if (typeof item.destroy === 'function') {\n const cacheKey = `destroy_${item.prop}_${modelHasher(unref(model))}`\n if (performanceCache.has(cacheKey)) {\n return performanceCache.get(cacheKey)\n }\n\n const result = item.destroy(unref(model))\n performanceCache.set(cacheKey, result)\n return result\n }\n return false\n }\n\n // 获取处理后的schema - 使用更精确的缓存策略\n const getProcessedSchema = computed(() => {\n // 如果设置了delayLoad且组件还未准备好,返回空数组避免提前计算\n if (props.delayLoad > 0 && !componentLoadReady.value) {\n // console.log('🚫 [ZnFormV2 getProcessedSchema] 组件未准备好,返回空数组')\n return []\n }\n\n const schemaList = unref(getProps).schema || []\n // console.log('🔍 [ZnFormV2 getProcessedSchema] 开始处理Schema')\n\n // 为了确保hidden/hiddenInView/hiddenLabel函数能正确响应变化,\n // 我们需要在缓存key中包含相关信息\n const modelForHidden = JSON.stringify(unref(model))\n\n // 计算当前所有hidden状态,这样外部变量变化时缓存会失效\n const currentHiddenStates = schemaList.map((item) => ({\n prop: item.prop,\n hidden: getIsHidden(item),\n hiddenInView: getIsHiddenInView(item),\n hiddenLabel: getIsHiddenLabel(item)\n }))\n\n const schemaHash = schemaList\n .map((item) => `${item.prop}_${item.el}_${!!item.render}_${!!item.renderInView}_${!!item.hidden}_${!!item.hiddenInView}_${!!item.hiddenLabel}`)\n .join('|')\n const hiddenStatesHash = JSON.stringify(currentHiddenStates)\n const cacheKey = `processedSchema_${schemaHash}_${modelForHidden}_${hiddenStatesHash}`\n\n if (performanceCache.has(cacheKey)) {\n return performanceCache.get(cacheKey)\n }\n\n // 统一处理逻辑\n const processSchema = (items: any[]) => {\n return items\n .filter((item) => !getIsDestroyed(item))\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .map((item, index) => {\n // 直接使用已经计算好的hidden状态\n const hiddenState = currentHiddenStates.find((state) => state.prop === item.prop)\n return {\n ...item,\n renderPriority: item.renderPriority || 0,\n enableAsyncRender: item.enableAsyncRender !== false,\n _index: index,\n _hidden: hiddenState?.hidden || false,\n _hiddenInView: hiddenState?.hiddenInView || false,\n _hiddenLabel: hiddenState?.hiddenLabel || false\n }\n })\n }\n\n const result = processSchema(schemaList)\n\n // 缓存结果,但限制缓存大小避免内存泄漏\n const cacheStats = performanceCache.getStats()\n if (cacheStats.size > 100) {\n // 清理部分旧缓存\n const allKeys: string[] = []\n performanceCache['cache'].forEach((_, key) => {\n if (typeof key === 'string' && key.startsWith('processedSchema_')) {\n allKeys.push(key)\n }\n })\n if (allKeys.length > 10) {\n // 删除最旧的5个processedSchema缓存\n allKeys.slice(0, 5).forEach((key) => performanceCache.delete(key))\n }\n }\n\n performanceCache.set(cacheKey, result)\n\n return result\n })\n\n // 获取可见的表单项\n const getVisibleSchema = computed(() => {\n const items = getProcessedSchema.value\n if (!items.length) {\n // console.log('🔍 [ZnFormV2 getVisibleSchema] ProcessedSchema为空')\n return []\n }\n\n // console.log('🔍 [ZnFormV2 getVisibleSchema] 处理可见Schema')\n\n // 修复懒加载逻辑:只有在真正启用懒加载时才使用懒加载过滤\n if (shouldUseLazyLoad.value) {\n const rendered = Array.from(renderedItems.value)\n // 懒加载时也不过滤hidden项目,只过滤渲染状态\n const filteredItems = items.filter((item, index) => rendered.includes(item.prop) || index < props.initialLoadCount)\n\n // console.log('🔍 [ZnFormV2 getVisibleSchema] 懒加载过滤结果')\n\n return filteredItems\n }\n\n // 非懒加载模式:返回所有项目,不进行任何过滤\n // 不过滤hidden项目,让v-show来控制显示隐藏\n // console.log('🔍 [ZnFormV2 getVisibleSchema] 非懒加载,返回所有项目')\n return items\n })\n\n // 表单组件渲染逻辑 - 优化懒加载场景的缓存策略\n const RenderFormWrap = markRaw(\n defineComponent({\n name: 'RenderFormWrap',\n setup() {\n const slots = useSlots()\n\n // 缓存渲染结果 - 为懒加载优化\n const renderCache = new Map<string, any>()\n\n // 为懒加载场景设计的增量缓存策略\n const getIncrementalCacheKey = (schemaList: any[]) => {\n // 对于懒加载,我们基于已渲染的项目生成缓存key,而不是所有可见项目\n const { useCol } = unref(getProps)\n const baseKey = `${props.isView}_${shouldUseLazyLoad.value}_${useCol}`\n\n if (shouldUseLazyLoad.value) {\n // 懒加载模式:需要包含渲染状态和hidden状态\n const renderedProps = Array.from(renderedItems.value).sort()\n const hiddenHash = schemaList.map((item) => `${item.prop}:${item._hidden}:${item._hiddenInView}`).join('|')\n return `lazy_${baseKey}_${renderedProps.join('|')}_${hiddenHash}`\n } else {\n // 非懒加载模式:使用完整的schema hash\n const schemaHash = schemaList.map((item) => `${item.prop}_${item._hidden}_${item._hiddenInView}_${item._index}`).join('|')\n return `full_${baseKey}_${schemaHash}`\n }\n }\n\n return () => {\n const { useCol, rowProps, onlyRenderComponent, elFormProps } = unref(getProps)\n const schemaList = getVisibleSchema.value\n\n // 检查是否有任何表单项设置了 noCache\n const hasNoCacheItems = schemaList.some((item) => item.noCache)\n const noCacheItems = schemaList.filter((item) => item.noCache).map((item) => item.prop)\n\n // 使用增量缓存策略\n const cacheKey = getIncrementalCacheKey(schemaList)\n\n // // 如果缓存存在且没有禁用缓存的项,直接返回缓存\n // if (!hasNoCacheItems && renderCache.has(cacheKey)) {\n // console.log(`🎯 [ZnFormV2 Form Cache Hit] 使用表单缓存,跳过整体渲染`)\n // return renderCache.get(cacheKey)\n // }\n\n // // 日志记录渲染原因\n // if (hasNoCacheItems) {\n // console.log(`🚫 [ZnFormV2 Form No Cache] 存在禁用缓存的字段,跳过表单缓存`, { noCacheItems })\n // } else {\n // console.log(`🚀 [ZnFormV2 Form Render] 缓存未命中,重新渲染表单`)\n // }\n\n let result: any\n\n if (onlyRenderComponent) {\n result = schemaList.map((item, index) => {\n const shouldShow = !item._hidden && !item._hiddenInView\n\n return (\n <div key={`${item.prop}_${index}`} v-show={shouldShow}>\n <ZnFormV2Item\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </div>\n )\n })\n } else {\n result = (\n <ElForm ref={elFormRef} model={model.value} class={[prefixClass, { 'is-view': props.isView }]} {...elFormProps}>\n {useCol ? renderWithCol(schemaList) : renderWithoutCol(schemaList)}\n </ElForm>\n )\n }\n\n // 智能缓存管理:只有在没有禁用缓存的项时才进行缓存\n if (!hasNoCacheItems) {\n const maxCacheSize = shouldUseLazyLoad.value ? 20 : 5\n if (renderCache.size >= maxCacheSize) {\n // 清理最老的缓存项\n const firstKey = renderCache.keys().next().value\n renderCache.delete(firstKey)\n // console.log(`🗑️ [ZnFormV2 Form Cache] 清理最老的缓存项: ${firstKey}`)\n }\n\n renderCache.set(cacheKey, result)\n // console.log(`💾 [ZnFormV2 Form Cache Save] 保存表单缓存,当前缓存数量: ${renderCache.size}`)\n } else {\n // console.log(`🚫 [ZnFormV2 Form Cache Skip] 跳过表单缓存保存`)\n }\n\n return result\n }\n }\n })\n )\n\n // 合并传入进来的栅格属性(与原版 ZnForm 保持一致)\n const setGridProp = (col: any = {}) => {\n return {\n // 如果有 span,代表用户优先级更高,所以不需要默认栅格\n ...(col.span ? {} : { xs: 24, sm: 12, md: 12, lg: 12, xl: 12 }),\n ...col\n }\n }\n\n // 渲染有栅格的表单\n const renderWithCol = (schemaList: ZnFormV2SchemaProps[]) => {\n const { rowProps } = unref(getProps)\n\n return (\n <ElRow gutter={20} {...rowProps}>\n {schemaList.map((item, index) => {\n const colProps = setGridProp({ ...rowProps?.col, ...item.col })\n const shouldShow = !item._hidden && !item._hiddenInView\n\n return (\n <ElCol key={`${item.prop}_${index}`} {...colProps} v-show={shouldShow}>\n {item._hiddenLabel ? (\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n ) : (\n <ElFormItem\n prop={item.prop}\n label={typeof item.label === 'function' ? item.label(model.value) : item.label}\n style={item.width ? { width: getPx(item.width) } : {}}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setFormItemRef(item.prop, ref)\n }\n }}\n {...(props.isView && props.disableRulesInView ? { ...item.formItem, rules: null } : item.formItem)}>\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </ElFormItem>\n )}\n </ElCol>\n )\n })}\n </ElRow>\n )\n }\n\n // 渲染无栅格的表单\n const renderWithoutCol = (schemaList: ZnFormV2SchemaProps[]) => {\n return schemaList.map((item, index) => {\n const shouldShow = !item._hidden && !item._hiddenInView\n\n return item._hiddenLabel ? (\n <div key={`${item.prop}_${index}`} v-show={shouldShow}>\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </div>\n ) : (\n <ElFormItem\n key={`${item.prop}_${index}`}\n prop={item.prop}\n label={typeof item.label === 'function' ? item.label(model.value) : item.label}\n style={item.width ? { width: getPx(item.width) } : {}}\n v-show={shouldShow}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setFormItemRef(item.prop, ref)\n }\n }}\n {...(props.isView && props.disableRulesInView ? { ...item.formItem, rules: null } : item.formItem)}>\n <ZnFormV2Item\n key={`${item.prop}_${item._index}`}\n column={item}\n v-model={model.value}\n isView={props.isView}\n isLazyLoading={shouldUseLazyLoad.value}\n isReady={renderedItems.value.has(item.prop)}\n ref={(ref: any) => {\n if (ref && componentRefsCollector) {\n componentRefsCollector.setZnFormV2ItemRef(item.prop, ref)\n }\n }}\n />\n </ElFormItem>\n )\n })\n }\n\n // 懒加载相关逻辑\n const initializeLazyLoading = () => {\n if (!shouldUseLazyLoad.value) return\n\n const schemaList = getProcessedSchema.value\n\n // 初始渲染指定数量的表单项\n for (let i = 0; i < Math.min(props.initialLoadCount, schemaList.length); i++) {\n renderedItems.value.add(schemaList[i].prop)\n }\n\n // 设置剩余项目为待渲染\n pendingItems.value = schemaList.slice(props.initialLoadCount)\n\n if (pendingItems.value.length > 0) {\n startBatchRendering()\n }\n }\n\n // 逐个渲染(优化版)- 每个组件准备好就立即显示\n const startBatchRendering = () => {\n if (pendingItems.value.length === 0) {\n isRendering.value = false\n return\n }\n\n isRendering.value = true\n\n const renderNext = () => {\n if (pendingItems.value.length === 0) {\n isRendering.value = false\n return\n }\n\n const startTime = performance.now()\n // 每次只渲染一个组件,实现真正的逐个显示\n const item = pendingItems.value.shift()\n\n if (item) {\n // 立即添加到已渲染列表,触发UI更新\n renderedItems.value.add(item.prop)\n\n // 记录渲染时间\n componentLoadTimes.value.push({\n prop: item.prop,\n time: startTime\n })\n\n // 更新性能统计\n performanceStats.value.componentCount = renderedItems.value.size\n performanceStats.value.renderTime = performance.now() - startTime\n performanceStats.value.queueLength = pendingItems.value.length\n\n if (props.enablePerformanceMonitoring) {\n emit('onPerformanceUpdate', performanceStats.value)\n }\n }\n\n // 继续渲染下一个组件,使用较短的延迟以实现流畅的逐个显示\n if (pendingItems.value.length > 0) {\n // 使用 requestAnimationFrame 或较短的 timeout 来实现更流畅的渲染\n if (props.lazyLoadDelay <= 16) {\n requestAnimationFrame(renderNext)\n } else {\n setTimeout(renderNext, props.lazyLoadDelay)\n }\n } else {\n isRendering.value = false\n }\n }\n\n // 延迟开始渲染\n setTimeout(renderNext, props.delayLoad)\n }\n\n // 处理表单项初始化\n const handleSchemaInit = () => {\n const schemaList = unref(getProps).schema || []\n\n schemaList.forEach(async (item) => {\n // 处理枚举数据\n if (item.enum) {\n await setEnumMap(item)\n }\n\n // 处理级联下拉\n if (item.subProp && item.subEnum) {\n cascadeEnum(item)\n }\n\n // 初始化默认值\n if (item.defaultValue !== undefined) {\n debouncer(`init_${item.prop}`, () => initDefaultValue(item), 50)\n }\n })\n }\n\n // 检测schema结构性变化(只检查影响渲染的关键属性)\n const hasStructuralChanges = (newSchema: ZnFormV2SchemaProps[], oldSchema: ZnFormV2SchemaProps[]) => {\n if (!oldSchema || oldSchema.length !== newSchema.length) return true\n\n // 检查关键结构属性是否变化\n for (let i = 0; i < newSchema.length; i++) {\n const newItem = newSchema[i]\n const oldItem = oldSchema[i]\n\n if (!oldItem || newItem.prop !== oldItem.prop || newItem.el !== oldItem.el || newItem.destroy !== oldItem.destroy || newItem.order !== oldItem.order) {\n return true\n }\n }\n\n return false\n }\n\n // 用于跟踪上一次的schema状态,避免Vue响应式的oldValue问题\n const lastSchemaSnapshot = ref<{ length: number; props: string[] }>({ length: 0, props: [] })\n\n // 监听schema变化 - 使用自定义的变化检测逻辑\n watch(\n () => unref(getProps).schema,\n (newSchema, oldSchema) => {\n // console.log('🔍 [ZnFormV2 Schema Watch] Schema变化监听触发')\n\n if (props.delayLoad > 0 && !componentLoadReady.value) {\n // console.log('🚫 [ZnFormV2 Schema Watch] 组件未准备好,跳过处理')\n return\n }\n\n // 修改条件:允许在组件初始化后的动态添加\n if (!isInitialized.value && lastSchemaSnapshot.value.length === 0) {\n // console.log('🚫 [ZnFormV2 Schema Watch] 组件未初始化且无历史快照,跳过处理')\n return\n }\n\n if (newSchema?.length) {\n // 使用快照进行变化检测,而不是依赖Vue的oldSchema\n const currentSnapshot = {\n length: newSchema.length,\n props: newSchema.map((item) => item.prop)\n }\n\n const lastSnapshot = lastSchemaSnapshot.value\n\n // 区分不同类型的结构性变化\n const isAddingItems = currentSnapshot.length > lastSnapshot.length\n const isDeletingItems = currentSnapshot.length < lastSnapshot.length\n const hasPropsChange = JSON.stringify(currentSnapshot.props) !== JSON.stringify(lastSnapshot.props)\n const isReorderingItems = !isAddingItems && !isDeletingItems && hasPropsChange\n\n // console.log('🔍 [ZnFormV2 Schema Watch] 基于快照的变化类型分析')\n\n // 智能处理不同的变化类型\n if (isAddingItems) {\n // 仅添加项目:不重置现有渲染状态,只处理新项目\n const lastPropsSet = new Set(lastSnapshot.props)\n const newItems = newSchema.filter((item) => !lastPropsSet.has(item.prop))\n\n // 处理新项目的初始化\n newItems.forEach(async (item) => {\n if (item.enum) {\n await setEnumMap(item)\n }\n if (item.defaultValue !== undefined) {\n debouncer(`init_${item.prop}`, () => initDefaultValue(item), 50)\n }\n })\n\n // 立即渲染新添加的项目\n nextTick(() => {\n // 如果还在组件初始化阶段,等待初始化完成\n if (props.delayLoad > 0 && !componentLoadReady.value) {\n // console.log('🚫 [ZnFormV2 Dynamic Add] 组件还在初始化阶段,等待初始化完成')\n return\n }\n\n // console.log('🚀 [ZnFormV2 Dynamic Add] 开始处理新添加的表单项')\n\n // 如果启用了懒加载,则添加到渲染列表\n if (shouldUseLazyLoad.value) {\n // console.log('🔍 [ZnFormV2 Dynamic Add] 懒加载模式,直接添加新项目到渲染列表')\n\n // 直接添加新项目到渲染列表,不依赖 processedSchemaList\n // 因为 processedSchemaList 可能由于时序问题还没有包含新项目\n newItems.forEach((newItem) => {\n if (!renderedItems.value.has(newItem.prop)) {\n renderedItems.value.add(newItem.prop)\n // console.log('✅ [ZnFormV2 Dynamic Add] 直接添加到渲染列表', { prop: newItem.prop })\n }\n })\n } else {\n // console.log('ℹ️ [ZnFormV2 Dynamic Add] 未启用懒加载,新项目会自动渲染')\n }\n // 如果没有启用懒加载,新项目会自动渲染,无需特殊处理\n })\n } else if (isDeletingItems && shouldUseLazyLoad.value) {\n // 仅删除项目:清理相关状态但不重置整个渲染系统\n const currentPropsSet = new Set(currentSnapshot.props)\n const deletedProps = lastSnapshot.props.filter((prop) => !currentPropsSet.has(prop))\n\n deletedProps.forEach((prop) => {\n renderedItems.value.delete(prop)\n pendingItems.value = pendingItems.value.filter((item) => item.prop !== prop)\n renderDependencyTracker.clearDependencies(prop)\n })\n } else {\n // 其他情况(初次渲染、重排序、复杂变化):完全重置\n const shouldResetRenderState =\n lastSnapshot.length === 0 ||\n isReorderingItems ||\n (props.lazyLoad && hasPropsChange) ||\n (newSchema.length > props.maxSyncRenderCount && hasPropsChange)\n\n if (shouldResetRenderState) {\n // 处理schema初始化\n handleSchemaInit()\n\n // 智能重置:只有在真正需要时才清空已渲染项\n if (hasPropsChange) {\n renderedItems.value.clear()\n }\n\n pendingItems.value = []\n componentLoadTimes.value = []\n\n nextTick(() => {\n initializeLazyLoading()\n })\n }\n }\n\n // 更新快照\n lastSchemaSnapshot.value = currentSnapshot\n // console.log('📸 [ZnFormV2 Schema Watch] 更新快照')\n }\n },\n { immediate: false, deep: true }\n )\n\n // 监听enum变化 - 优化版本,避免不必要的重新渲染\n watch(\n () =>\n unref(getProps).schema?.map((item) => ({\n prop: item.prop,\n enum: item.enum,\n dictCode: item.dictCode\n })),\n (newEnums, oldEnums) => {\n if (!newEnums || !oldEnums || newEnums.length !== oldEnums.length) return\n\n // 找出发生变化的enum项,只更新对应的枚举数据\n let hasEnumChanges = false\n const changedProps: string[] = []\n\n newEnums.forEach((newItem, index) => {\n const oldItem = oldEnums[index]\n if (newItem.enum !== oldItem?.enum || newItem.dictCode !== oldItem?.dictCode) {\n const schemaItem = unref(getProps).schema?.find((item) => item.prop === newItem.prop)\n if (schemaItem) {\n hasEnumChanges = true\n changedProps.push(newItem.prop)\n\n // 异步更新枚举,避免阻塞主线程\n nextTick(() => {\n setEnumMap(schemaItem)\n })\n }\n }\n })\n\n // 只清除与变化的enum相关的缓存,而不是清除所有缓存\n if (hasEnumChanges) {\n // 使用防抖避免频繁清除缓存\n debouncer(\n 'enum_change',\n () => {\n // 只清除与变化的props相关的缓存,但不清除processedSchema缓存\n // 因为enum变化不影响schema结构,不需要重新渲染所有组件\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n // 不清除 processedSchema_ 缓存,只清除与具体字段相关的缓存\n if (!key.startsWith('processedSchema_') && changedProps.some((prop) => key.includes(prop))) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n },\n 100\n ) // 使用较长的防抖时间避免频繁操作\n }\n },\n { deep: true }\n )\n\n // 监听 isView 和 hidden 相关属性变化,清除相关缓存\n watch(\n [\n () => props.isView,\n () =>\n unref(getProps).schema?.map((item) => ({\n prop: item.prop,\n hidden: item.hidden,\n hiddenInView: item.hiddenInView,\n hiddenLabel: item.hiddenLabel\n }))\n ],\n (newValues, oldValues) => {\n if (!oldValues) return\n\n const [newIsView, newHiddenProps] = newValues\n const [oldIsView, oldHiddenProps] = oldValues\n\n // 检查是否有实际变化\n let hasChanges = newIsView !== oldIsView\n\n if (!hasChanges && newHiddenProps && oldHiddenProps) {\n // 检查 hidden 相关属性是否有变化\n hasChanges = newHiddenProps.some((newItem, index) => {\n const oldItem = oldHiddenProps[index]\n return !oldItem || newItem.hidden !== oldItem.hidden || newItem.hiddenInView !== oldItem.hiddenInView || newItem.hiddenLabel !== oldItem.hiddenLabel\n })\n }\n\n if (hasChanges) {\n // 使用防抖避免频繁清除缓存\n debouncer(\n 'view_hidden_change',\n () => {\n // 只清除与显示/隐藏相关的缓存\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n if (key.startsWith('processedSchema_') || key.includes('_hidden_') || key.includes('_view_')) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n },\n 50\n )\n }\n },\n { deep: true }\n )\n\n // 监听隐藏字段状态变化,清理隐藏字段的值\n watch(\n () => {\n if (!props.clearHiddenFieldValues) return []\n\n const schemaList = unref(getProps).schema || []\n return schemaList.map((item) => ({\n prop: item.prop,\n isHidden: getIsHidden(item) || (props.isView && getIsHiddenInView(item))\n }))\n },\n (newHiddenStates, oldHiddenStates) => {\n if (!props.clearHiddenFieldValues || !oldHiddenStates || !newHiddenStates) return\n\n // 找出从显示变为隐藏的字段\n const fieldsToClear = newHiddenStates.filter((newState, index) => {\n const oldState = oldHiddenStates[index]\n // 字段从显示(false)变为隐藏(true)\n return oldState && !oldState.isHidden && newState.isHidden\n })\n\n // 清理这些字段的值\n if (fieldsToClear.length > 0) {\n const modelValue = unref(model)\n fieldsToClear.forEach(({ prop }) => {\n if (modelValue.hasOwnProperty(prop)) {\n // console.log(`🧹 ZnFormV2: 清理隐藏字段 '${prop}' 的值`)\n modelValue[prop] = null\n }\n })\n }\n },\n { deep: true }\n )\n\n // 获取可见的表单项prop列表\n const getVisibleFormProps = () => {\n const schemaList = getProcessedSchema.value\n const visibleProps = schemaList.filter((item) => !item._hidden && !item._hiddenInView).map((item) => item.prop)\n\n return visibleProps\n }\n\n // 暴露方法\n const validate = (callback?: (valid: boolean, invalidFields?: any) => void) => {\n if (!elFormRef.value) {\n callback?.(true)\n return Promise.resolve(true)\n }\n\n // 如果没有传递回调函数,使用Promise方式\n if (!callback) {\n return new Promise((resolve, reject) => {\n elFormRef.value?.validate((valid, invalidFields) => {\n if (valid) {\n resolve(true)\n } else {\n // 根据配置决定是否过滤隐藏表单项的验证错误\n if (props.excludeHiddenFieldsValidation) {\n const visibleProps = getVisibleFormProps()\n const filteredInvalidFields: any = {}\n\n if (invalidFields) {\n Object.keys(invalidFields).forEach((prop) => {\n if (visibleProps.includes(prop)) {\n filteredInvalidFields[prop] = invalidFields[prop]\n }\n })\n }\n\n // 如果过滤后没有错误,则认为验证通过\n const hasVisibleErrors = Object.keys(filteredInvalidFields).length > 0\n if (hasVisibleErrors) {\n reject(filteredInvalidFields)\n } else {\n resolve(true)\n }\n } else {\n // 不过滤隐藏字段,直接返回原始验证结果\n reject(invalidFields)\n }\n }\n })\n })\n }\n\n // 使用回调函数方式\n elFormRef.value.validate((valid, invalidFields) => {\n if (valid) {\n callback(true)\n } else {\n // 根据配置决定是否过滤隐藏表单项的验证错误\n if (props.excludeHiddenFieldsValidation) {\n const visibleProps = getVisibleFormProps()\n const filteredInvalidFields: any = {}\n\n if (invalidFields) {\n Object.keys(invalidFields).forEach((prop) => {\n if (visibleProps.includes(prop)) {\n filteredInvalidFields[prop] = invalidFields[prop]\n }\n })\n }\n\n // 如果过滤后没有错误,则认为验证通过\n const hasVisibleErrors = Object.keys(filteredInvalidFields).length > 0\n callback(!hasVisibleErrors, hasVisibleErrors ? filteredInvalidFields : undefined)\n } else {\n // 不过滤隐藏字段,直接返回原始验证结果\n callback(false, invalidFields)\n }\n }\n })\n }\n\n const validateField = (props: FormItemProp, callback?: (isValid: boolean, errorMessage?: string) => void) => {\n // 根据配置决定是否过滤隐藏字段\n if (getProps.value.excludeHiddenFieldsValidation) {\n // 检查要验证的字段是否可见\n const visibleProps = getVisibleFormProps()\n const propsArray = Array.isArray(props) ? props : [props]\n\n // 过滤掉隐藏的字段\n const visiblePropsToValidate = propsArray.filter((prop) => visibleProps.includes(prop as string))\n\n // 如果没有可见的字段需要验证,直接返回成功\n if (visiblePropsToValidate.length === 0) {\n callback?.(true, '')\n return Promise.resolve('')\n }\n\n // 验证可见的字段\n const finalProps = visiblePropsToValidate.length === 1 ? visiblePropsToValidate[0] : visiblePropsToValidate\n return elFormRef.value?.validateField(finalProps as FormItemProp, callback as any)\n } else {\n // 不过滤隐藏字段,直接验证所有字段\n return elFormRef.value?.validateField(props, callback as any)\n }\n }\n\n const resetFields = () => {\n elFormRef.value?.resetFields()\n }\n\n const resetForm = () => {\n // 重置表单数据\n Object.keys(model.value).forEach((key) => {\n delete model.value[key]\n })\n\n // 重置验证状态\n elFormRef.value?.clearValidate()\n\n // 触发表单初始化,重新设置默认值\n nextTick(() => {\n handleSchemaInit()\n })\n }\n\n const clearValidate = (props?: FormItemProp) => {\n elFormRef.value?.clearValidate(props)\n }\n\n const scrollToField = (prop: FormItemProp) => {\n elFormRef.value?.scrollToField(prop)\n }\n\n // 注册表单方法\n const registerMethods = {\n validate,\n validateField,\n resetFields,\n resetForm,\n clearValidate,\n scrollToField,\n setEnumMap,\n initDefaultValue,\n clearCache\n }\n\n // 组件挂载后初始化\n onMounted(() => {\n // delayLoad期间显示骨架屏,避免阻塞主线程\n if (props.delayLoad > 0) {\n // 在delayLoad期间完全不做任何操作,避免阻塞主线程\n setTimeout(() => {\n showComponentSkeleton.value = false\n componentLoadReady.value = true\n\n // 延迟初始化完成后,主动触发schema处理\n const schema = unref(getProps).schema\n if (schema?.length) {\n handleSchemaInit()\n\n if (shouldUseLazyLoad.value) {\n initializeLazyLoading()\n } else {\n // 非懒加载模式:将所有表单项标记为已渲染\n const processedSchema = getProcessedSchema.value\n processedSchema.forEach((item) => {\n renderedItems.value.add(item.prop)\n })\n }\n }\n\n // 标记为已初始化\n isInitialized.value = true\n emit('register', extendedRegisterMethods)\n }, props.delayLoad)\n } else {\n // 无延迟,立即初始化\n showComponentSkeleton.value = false\n componentLoadReady.value = true\n\n // 立即处理schema\n const schema = unref(getProps).schema\n if (schema?.length) {\n handleSchemaInit()\n\n if (shouldUseLazyLoad.value) {\n initializeLazyLoading()\n } else {\n // 非懒加载模式:将所有表单项标记为已渲染\n const processedSchema = getProcessedSchema.value\n processedSchema.forEach((item) => {\n renderedItems.value.add(item.prop)\n })\n }\n }\n\n // 标记为已初始化\n isInitialized.value = true\n emit('register', extendedRegisterMethods)\n }\n\n // 启动性能监控定时器\n if (props.enablePerformanceMonitoring) {\n loadingTimer.value = setInterval(() => {\n performanceStats.value.cacheStats = performanceCache.getStats()\n emit('onPerformanceUpdate', performanceStats.value)\n }, props.performanceConfig.reportInterval || 2000) as any\n }\n })\n\n // 组件卸载前清理\n onBeforeUnmount(() => {\n cleanup()\n })\n\n // 新增方法实现\n const setProps = (newProps: Partial<ZnFormV2Props>) => {\n Object.assign(mergeProps.value, newProps)\n if (newProps.modelValue) {\n Object.assign(model.value, newProps.modelValue)\n }\n }\n\n const setValues = (data: Record<string, any>) => {\n Object.assign(model.value, data)\n }\n\n const setSchema = (config: FormSetProps) => {\n const { prop, field, value } = config\n const currentSchema = [...(unref(getProps).schema || [])]\n\n if (field === 'schema') {\n // 直接设置整个 schema\n ;(mergeProps.value as any).schema = value as ZnFormV2SchemaProps[]\n } else {\n // 修改特定字段的特定属性\n const targetItem = currentSchema.find((item) => item.prop === prop)\n if (targetItem) {\n ;(targetItem as any)[field] = value\n // 更新整个 schema 以触发响应式更新\n ;(mergeProps.value as any).schema = currentSchema\n }\n }\n }\n\n const addSchema = (formSchema: ZnFormV2SchemaProps, prop?: number | string, position: 'before' | 'after' = 'after') => {\n const currentSchema = [...(unref(getProps).schema || [])]\n\n if (typeof prop === 'number') {\n // 按索引插入\n currentSchema.splice(prop, 0, formSchema)\n } else if (typeof prop === 'string') {\n // 按 prop 名称查找位置插入\n const index = currentSchema.findIndex((item) => item.prop === prop)\n if (index !== -1) {\n const insertIndex = position === 'before' ? index : index + 1\n currentSchema.splice(insertIndex, 0, formSchema)\n } else {\n currentSchema.push(formSchema)\n }\n } else {\n // 添加到末尾\n currentSchema.push(formSchema)\n }\n\n ;(mergeProps.value as any).schema = currentSchema\n\n // 动态添加的表单项会通过 schema watch 自动处理懒加载逻辑\n }\n\n const delSchema = (prop: string) => {\n const currentSchema = unref(getProps).schema || []\n const newSchema = currentSchema.filter((item) => item.prop !== prop)\n ;(mergeProps.value as any).schema = newSchema\n\n // 如果是懒加载模式,需要清理删除项的相关状态\n if (shouldUseLazyLoad.value) {\n // 从已渲染列表中移除\n renderedItems.value.delete(prop)\n\n // 从待渲染队列中移除\n pendingItems.value = pendingItems.value.filter((item) => item.prop !== prop)\n\n // 清理相关缓存\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n if (key.includes(prop)) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n\n // 清理依赖追踪缓存\n renderDependencyTracker.clearDependencies(prop)\n }\n }\n\n const getFormData = <T = Record<string, any>,>(filterEmptyVal = true): T => {\n const formData = model.value\n\n if (filterEmptyVal) {\n // 过滤空值\n return Object.keys(formData).reduce((prev, next) => {\n const value = formData[next]\n if (value !== '' && value !== null && value !== undefined) {\n if (typeof value === 'object' && value !== null) {\n if (Object.keys(value).length > 0) prev[next] = value\n } else prev[next] = value\n }\n return prev\n }, {}) as T\n }\n\n return formData as T\n }\n\n // 表单项实例存储\n const formItemRefs = ref(new Map<string, any>())\n const componentRefs = ref(new Map<string, any>())\n\n const getComponentExpose = (prop: string) => {\n return componentRefs.value.get(prop) || null\n }\n\n const getFormItemExpose = (prop: string) => {\n return formItemRefs.value.get(prop) || null\n }\n\n const getSchema = () => {\n return unref(getProps).schema || []\n }\n\n /**\n * 手动刷新指定prop的表单项\n * @param prop 要刷新的表单项prop\n * @param options 刷新选项\n */\n const refreshFormItem = async (\n prop: string,\n options?: {\n /** 是否重新初始化枚举数据 */\n refreshEnum?: boolean\n /** 是否重新设置默认值 */\n refreshDefaultValue?: boolean\n /** 是否清除验证状态 */\n clearValidate?: boolean\n }\n ) => {\n const { refreshEnum = true, refreshDefaultValue = false, clearValidate = true } = options || {}\n\n // 1. 查找对应的schema项\n const schemaItem = unref(getProps).schema?.find((item) => item.prop === prop)\n if (!schemaItem) {\n console.warn(`[ZnFormV2] 未找到prop为 \"${prop}\" 的表单项`)\n\n return\n }\n\n // 2. 清除与该prop相关的所有缓存\n const keysToDelete: string[] = []\n performanceCache.cache?.forEach((value, key) => {\n if (key.includes(prop)) {\n keysToDelete.push(key)\n }\n })\n keysToDelete.forEach((key) => performanceCache.delete(key))\n\n // 3. 清除依赖追踪缓存\n renderDependencyTracker.clearDependencies(prop)\n\n // 4. 清除智能缓存中与该prop相关的缓存\n clearRelatedCache(performanceCache, 'hidden', [prop])\n clearRelatedCache(performanceCache, 'hiddenInView', [prop])\n clearRelatedCache(performanceCache, 'hiddenLabel', [prop])\n clearRelatedCache(performanceCache, 'render', [prop])\n\n // 5. 清除所有可能与该字段相关的缓存(包括 formProps 等)\n const additionalCacheKeys = ['formProps', 'props', 'placeholder', 'disabled', 'clearable']\n additionalCacheKeys.forEach(prefix => {\n clearRelatedCache(performanceCache, prefix, [prop])\n })\n\n // 5. 重新初始化枚举数据\n if (refreshEnum && schemaItem.enum) {\n try {\n await setEnumMap(schemaItem)\n } catch (error) {\n console.error(`[ZnFormV2] 刷新prop \"${prop}\" 的枚举数据失败:`, error)\n }\n }\n\n // 6. 重新设置默认值\n if (refreshDefaultValue && schemaItem.defaultValue !== undefined) {\n try {\n await initDefaultValue(schemaItem)\n } catch (error) {\n console.error(`[ZnFormV2] 刷新prop \"${prop}\" 的默认值失败:`, error)\n }\n }\n\n // 7. 清除验证状态\n if (clearValidate) {\n elFormRef.value?.clearValidate(prop)\n }\n\n // 8. 如果是懒加载模式,重新标记该项为需要渲染\n if (shouldUseLazyLoad.value) {\n // 移除已渲染标记,强制重新渲染\n renderedItems.value.delete(prop)\n\n // 将该项重新加入渲染队列\n const schemaList = getProcessedSchema.value\n const targetItem = schemaList.find((item) => item.prop === prop)\n if (targetItem && !pendingItems.value.some((item) => item.prop === prop)) {\n // 插入到队列开头,优先渲染\n pendingItems.value.unshift(targetItem)\n\n // 如果当前没有在渲染,立即开始渲染\n if (!isRendering.value) {\n nextTick(() => {\n startBatchRendering()\n })\n }\n }\n }\n\n // 9. 刷新 ZnFormV2Item 组件的 formProps\n const znFormV2ItemRef = znFormV2ItemRefs.value.get(prop)\n if (znFormV2ItemRef && znFormV2ItemRef.refreshFormProps) {\n znFormV2ItemRef.refreshFormProps()\n }\n\n // 10. 强制触发重新渲染\n await nextTick()\n\n // console.log(`已刷新表单项: ${prop}`)\n }\n\n // 更新注册方法\n const extendedRegisterMethods = {\n ...registerMethods,\n setProps,\n setValues,\n setSchema,\n addSchema,\n delSchema,\n getFormData,\n getComponentExpose,\n getFormItemExpose,\n getSchema,\n refreshFormItem,\n model: model.value\n }\n\n // 暴露API\n defineExpose({\n ...extendedRegisterMethods,\n form: elFormRef,\n enumMap,\n model: model.value\n })\n\n // 自动决定是否启用懒加载 - 默认启用,当作大组件处理\n const shouldUseLazyLoad = computed(() => {\n const schemaLength = unref(getProps).schema?.length || 0\n const userLazyLoad = props.lazyLoad\n\n // 如果用户明确设置lazy-load为false,则禁用懒加载\n if (userLazyLoad === false) {\n return false\n }\n\n // 默认情况下启用懒加载,把所有表单都当作大组件处理\n if (userLazyLoad === true) {\n return true\n }\n\n // 对于非常小的表单(少于5个表单项且无自定义render),可以考虑同步渲染\n if (schemaLength < 5) {\n const renderFunctionCount = unref(getProps).schema?.filter((item) => item.render || item.renderInView)?.length || 0\n if (renderFunctionCount === 0) {\n return false\n }\n }\n\n // 其他情况默认启用懒加载\n return true\n })\n</script>\n"],"names":["_isSlot","s","_isVNode","Object","prototype","toString","call","prefixClass","PERFORMANCE_CONFIG","PerformanceCache","__name","this","cache","Map","timers","hitCount","missCount","has","key","item","get","Date","now","timestamp","delete","value","undefined","set","size","firstKey","keys","next","clearTimeout","timer","setTimeout","clear","forEach","getStats","hitRate","createDebouncer","fn","delay","createModelHasher","lastModel","lastHash","lastStringified","model","stringified","JSON","stringify","sort","hash","i","length","charCodeAt","finalHash","props","__props","emit","__emit","_useModel","elFormRef","shallowRef","mergeProps","ref","getProps","computed","propsObj","assign","unref","enumMap","enumMapProps","renderedItems","Set","pendingItems","componentLoadReady","showComponentSkeleton","delayLoad","loadingTimer","componentLoadTimes","performanceCache","debouncer","modelHasher","performanceStats","renderTime","componentCount","cacheHitRate","queueLength","cacheStats","isRendering","isInitialized","clearCache","cleanup","getCurrentInstance","clearInterval","setEnumMap","async","enum","enumValue","prop","cacheEnum","enumMapConst","data","result","Array","isArray","console","warn","nextTick","schemaItem","schema","find","initDefaultValue","error","provide","formEnumMapKey","znFormV2ItemRefs","componentRefsCollector","setComponentRef","setFormItemRef","setZnFormV2ItemRef","renderDependencyTracker","dependencies","renderAccess","currentTrackingRender","startTracking","stopTracking","trackFieldAccess","accessedField","add","getAffectedRenders","changedField","clearDependencies","field","dependents","createTrackedModel","originalModel","Proxy","target","defaultValue","fieldNames","formConst","getFormProp","defaultValueConst","setFormProp","enumData","filter","isDefault","cascadeEnum","el","subProp","subEnum","hyphenToCamelCase","ComponentNameEnum","EL_SELECT","watch","newVal","subEnumData","formEnum","subValue","immediate","getIsHidden","hidden","config","prefix","debug","debugField","withSmartCache","getIsHiddenInView","isView","hiddenInView","getIsHiddenLabel","hiddenLabel","getIsDestroyed","destroy","cacheKey","getProcessedSchema","schemaList","modelForHidden","currentHiddenStates","map","render","renderInView","join","items","a","b","order","index","hiddenState","state","renderPriority","enableAsyncRender","_index","_hidden","_hiddenInView","_hiddenLabel","processSchema","allKeys","_","startsWith","push","slice","getVisibleSchema","shouldUseLazyLoad","rendered","from","filteredItems","includes","initialLoadCount","RenderFormWrap","markRaw","defineComponent","name","setup","useSlots","renderCache","getIncrementalCacheKey","useCol","baseKey","renderedProps","hiddenHash","rowProps","onlyRenderComponent","elFormProps","hasNoCacheItems","some","noCache","shouldShow","_withDirectives2","_createVNode2","ZnFormV2Item","column","modelValue","$event","isLazyLoading","isReady","_vShow2","ElForm","_mergeProps","class","default","renderWithCol","renderWithoutCol","maxCacheSize","setGridProp","col","span","xs","sm","md","lg","xl","_slot","ElRow","gutter","colProps","ElCol","ElFormItem","label","style","width","getPx","disableRulesInView","formItem","rules","initializeLazyLoading","Math","min","startBatchRendering","renderNext","startTime","performance","shift","time","enablePerformanceMonitoring","lazyLoadDelay","requestAnimationFrame","handleSchemaInit","lastSchemaSnapshot","newSchema","oldSchema","currentSnapshot","lastSnapshot","isAddingItems","isDeletingItems","hasPropsChange","isReorderingItems","lastPropsSet","newItems","newItem","currentPropsSet","lazyLoad","maxSyncRenderCount","deep","dictCode","newEnums","oldEnums","hasEnumChanges","changedProps","oldItem","keysToDelete","newValues","oldValues","newIsView","newHiddenProps","oldIsView","oldHiddenProps","hasChanges","clearHiddenFieldValues","isHidden","newHiddenStates","oldHiddenStates","fieldsToClear","newState","oldState","hasOwnProperty","getVisibleFormProps","registerMethods","validate","callback","valid","invalidFields","excludeHiddenFieldsValidation","visibleProps","filteredInvalidFields","hasVisibleErrors","Promise","resolve","reject","validateField","visiblePropsToValidate","finalProps","resetFields","resetForm","clearValidate","scrollToField","onMounted","extendedRegisterMethods","setInterval","performanceConfig","reportInterval","onBeforeUnmount","setProps","newProps","setValues","setSchema","currentSchema","targetItem","addSchema","formSchema","position","splice","findIndex","insertIndex","delSchema","getFormData","filterEmptyVal","formData","reduce","prev","formItemRefs","componentRefs","getComponentExpose","getFormItemExpose","getSchema","refreshFormItem","options","refreshEnum","refreshDefaultValue","clearRelatedCache","unshift","znFormV2ItemRef","refreshFormProps","__expose","form","schemaLength","userLazyLoad"],"mappings":"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"}