From 769fb543015f1a90d42882a0a9f0592efa45a10e Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期一, 01 六月 2026 19:33:30 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' of http://114.132.189.42:9002/r/product-inventory-management into dev_NEW_pro
---
src/utils/generator/render.js | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 156 insertions(+), 0 deletions(-)
diff --git a/src/utils/generator/render.js b/src/utils/generator/render.js
new file mode 100644
index 0000000..d6d4414
--- /dev/null
+++ b/src/utils/generator/render.js
@@ -0,0 +1,156 @@
+import { defineComponent, h } from 'vue'
+import { makeMap } from '@/utils/index'
+
+const isAttr = makeMap(
+ 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' +
+ 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' +
+ 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' +
+ 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' +
+ 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' +
+ 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' +
+ 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' +
+ 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' +
+ 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' +
+ 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' +
+ 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' +
+ 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' +
+ 'target,title,type,usemap,value,width,wrap' + 'prefix-icon'
+)
+const isNotProps = makeMap(
+ 'layout,prepend,regList,tag,document,changeTag,defaultValue'
+)
+
+function useVModel(props, emit) {
+ return {
+ modelValue: props.defaultValue,
+ 'onUpdate:modelValue': (val) => emit('update:modelValue', val),
+ }
+}
+const componentChild = {
+ 'el-button': {
+ default(h, conf, key) {
+ return conf[key]
+ },
+ },
+ 'el-select': {
+ options(h, conf, key) {
+ return conf.options.map(item => h(resolveComponent('el-option'), {
+ label: item.label,
+ value: item.value,
+ }))
+ }
+ },
+ 'el-radio-group': {
+ options(h, conf, key) {
+ return conf.optionType === 'button' ? conf.options.map(item => h(resolveComponent('el-checkbox-button'), {
+ label: item.value,
+ }, () => item.label)) : conf.options.map(item => h(resolveComponent('el-radio'), {
+ label: item.value,
+ border: conf.border,
+ }, () => item.label))
+ }
+ },
+ 'el-checkbox-group': {
+ options(h, conf, key) {
+ return conf.optionType === 'button' ? conf.options.map(item => h(resolveComponent('el-checkbox-button'), {
+ label: item.value,
+ }, () => item.label)) : conf.options.map(item => h(resolveComponent('el-checkbox'), {
+ label: item.value,
+ border: conf.border,
+ }, () => item.label))
+ }
+ },
+ 'el-upload': {
+ 'list-type': (h, conf, key) => {
+ const option = {}
+ // if (conf.showTip) {
+ // tip = h('div', {
+ // class: "el-upload__tip"
+ // }, () => '鍙兘涓婁紶涓嶈秴杩�' + conf.fileSize + conf.sizeUnit + '鐨�' + conf.accept + '鏂囦欢')
+ // }
+ if (conf['list-type'] === 'picture-card') {
+ return h(resolveComponent('el-icon'), option, () => h(resolveComponent('Plus')))
+ } else {
+ // option.size = "small"
+ option.type = "primary"
+ option.icon = "Upload"
+ return h(resolveComponent('el-button'), option, () => conf.buttonText)
+ }
+ },
+
+ }
+}
+const componentSlot = {
+ 'el-upload': {
+ 'tip': (h, conf, key) => {
+ if (conf.showTip) {
+ return () => h('div', {
+ class: "el-upload__tip"
+ }, '鍙兘涓婁紶涓嶈秴杩�' + conf.fileSize + conf.sizeUnit + '鐨�' + conf.accept + '鏂囦欢')
+ }
+ },
+ }
+}
+export default defineComponent({
+
+ // 浣跨敤 render 鍑芥暟
+ render() {
+ const dataObject = {
+ attrs: {},
+ props: {},
+ on: {},
+ style: {}
+ }
+ const confClone = JSON.parse(JSON.stringify(this.conf))
+ const children = []
+ const slot = {}
+ const childObjs = componentChild[confClone.tag]
+ if (childObjs) {
+ Object.keys(childObjs).forEach(key => {
+ const childFunc = childObjs[key]
+ if (confClone[key]) {
+ children.push(childFunc(h, confClone, key))
+ }
+ })
+ }
+ const slotObjs = componentSlot[confClone.tag]
+ if (slotObjs) {
+ Object.keys(slotObjs).forEach(key => {
+ const childFunc = slotObjs[key]
+ if (confClone[key]) {
+ slot[key] = childFunc(h, confClone, key)
+ }
+ })
+ }
+ Object.keys(confClone).forEach(key => {
+ const val = confClone[key]
+ if (dataObject[key]) {
+ dataObject[key] = val
+ } else if (isAttr(key)) {
+ dataObject.attrs[key] = val
+ } else if (!isNotProps(key)) {
+ dataObject.props[key] = val
+ }
+ })
+ if(children.length > 0){
+ slot.default = () => children
+ }
+
+ return h(resolveComponent(this.conf.tag),
+ {
+ modelValue: this.$attrs.modelValue,
+ ...dataObject.props,
+ ...dataObject.attrs,
+ style: {
+ ...dataObject.style
+ },
+ }
+ , slot ?? null)
+ },
+ props: {
+ conf: {
+ type: Object,
+ required: true,
+ },
+ }
+})
\ No newline at end of file
--
Gitblit v1.9.3