| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- 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,
- },
- }
- })
|