el-plus-form
Version:
采用Vue3 + TS,封装的element-plus数据驱动表单组件
136 lines (131 loc) • 4.12 kB
text/typescript
import { computed } from 'vue'
import { cloneDeep } from 'lodash'
import { castArray, castString, castBoolean, castNumber, castFileList } from '../tools/utils'
/**
* 通用的定义
* @param props
* @param ctx
* @returns
*/
export default function (props: any, ctx: any, inject: any, customAttrs?: Object) {
const changeValueFn = (ctx.attrs.isTable ? {} : inject('changeValueFn')) as Function
// 定义组件的双弓绑定
const currentValue = computed({
get: () => {
return handelValueData(props.value)
},
set: (val) => {
changeValueFn(props.field, val)
}
})
// 合并组件的属性 用户自定义属性放最后customAttrs,权限最高
const attrs = Object.assign({}, ctx.attrs, props.desc?._attrs, getPlaceholder(), customAttrs)
if (!attrs.disabled) delete attrs.disabled
if (!attrs.readonly) delete attrs.readonly
if (!attrs.options) {
delete attrs.options
} else {
if (props.desc.type === 'radio-button') {
delete attrs.options
} else {
attrs.options = cloneDeep(attrs.options)
}
}
// 通用的重置方法
const reset = (val: any) => {
changeValueFn(props.field, handelValueData(val))
}
// 通用的清空方法 ? 如果组件存本身在改方法的话
const clear = () => {
changeValueFn(props.field, handelValueData(null))
}
// 插槽
const slots = computed(() => {
return props.desc.slots || {}
})
// 事件
const onEvents = computed(() => {
return Object.assign({}, props.desc.on)
})
// 根据类型获取初始值
function handelValueData(value: any): any {
let tempValue = null
if (value !== undefined && value !== null && value !== '') {
tempValue = value
} else if (props.desc.default !== undefined && props.desc.default !== null) {
tempValue = props.desc.default
}
if (props.desc && props.desc.type) {
// 输入类
switch (props.desc.type) {
case 'input':
case 'nbInput':
case 'password':
tempValue = castString(tempValue) || ''
break
case 'yesno':
tempValue = castBoolean(tempValue) || false
break
case 'cascader':
case 'checkbox':
case 'checkbox-button':
case 'image':
case 'transfer':
tempValue = castArray(tempValue) || []
break
case 'number':
case 'status':
case 'switch':
tempValue = castNumber(tempValue) || 0
break
case 'upImg':
tempValue = castFileList(tempValue)
break
}
}
return tempValue
}
// 根据类型获取属性 placeholder
function getPlaceholder() {
if (!props.desc || !props.desc.type) return ''
switch (props.desc.type) {
case 'input':
case 'nbInput':
case 'autocomplete':
case 'password':
case 'tag':
return { placeholder: '请输入' + (props.desc?._label || props.desc?.placeholder) }
case 'switch':
return {}
case 'select':
case 'cascader':
return { placeholder: '请选择' + (props.desc?._label || props.desc?.placeholder) }
case 'data':
case 'datetime':
case 'datas':
return { placeholder: '选择日期' }
case 'daterange':
case 'datetimerange':
case 'timerange':
case 'monthrange':
return {
startPlaceholder: '开始日期',
endPlaceholder: '结束日期'
}
case 'dates':
return { placeholder: '选择一个或多个日期' }
case 'month':
return { placeholder: '选择月' }
case 'time':
case 'timsPicker':
return { placeholder: '请选择时间' }
case 'week':
return { placeholder: '请选择周' }
case 'year':
return { placeholder: '请选择年' }
case 'upImg':
return { placeholder: '请上传' }
}
}
return { currentValue, attrs, reset, clear, slots, onEvents }
}