2023-04-13 TTable组件单元格编辑新增规则校验
![在这里插入图片描述](https://img-blog.csdnimg.cn/0208d902e89848868170467bd83a6da9.gif)
![在这里插入图片描述](https://img-blog.csdnimg.cn/800a11dff8c942c3a392ef009d7b374b.png)
2、最终效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/4d44d24ecc954a26a10d02c65479239b.gif)
3、源码
<template>
<component
:is="isShowRules?'el-form-item':'div'"
:prop="record.column.property"
:rules="configEdit.rules"
:class="[configEdit.className,'single_edit_cell']"
v-bind="$attrs"
v-on="$listeners"
>
<template v-if="configEdit.editSlotName">
<slot :name="configEdit.editSlotName" :scope="record" />
</template>
<component
v-if="!configEdit.editSlotName"
:is="configEdit.editComponent||'el-input'"
v-model="record.row[prop]"
:type="configEdit.type"
:placeholder="configEdit.placeholder||getPlaceholder(configEdit)"
ref="parentCom"
:class="prop"
@change="()=>$emit('handleEvent',configEdit.event, record.row[prop],configEdit.editComponent)"
@keyup.native="(event) => $emit('Keyup',event,record.$index, prop)"
:style="{width: configEdit.width||'100%'}"
v-bind="typeof this.configEdit.bind == 'function' ? this.configEdit.bind(record) : {clearable:true,filterable:true,...this.configEdit.bind}"
v-on="cEvent(configEdit)"
>
<template v-for="(index, name) in $slots" v-slot:[name]>
<slot :name="name" />
</template>
<template v-for="(index, name) in $scopedSlots" v-slot:[name]="data">
<slot :name="name" v-bind="data"></slot>
</template>
<template #prepend v-if="configEdit.prepend">{{ configEdit.prepend }}</template>
<template #append v-if="configEdit.append">{{ configEdit.append }}</template>
<component
:is="compChildName(configEdit)"
v-for="(value, key, index) in listTypeInfo[configEdit.list]"
:key="index"
:disabled="value.disabled"
:label="compChildLabel(configEdit,value)"
:value="compChildValue(configEdit,value,key)"
>{{compChildShowLabel(configEdit,value)}}</component>
</component>
</component>
</template>
<script>
export default {
name: 'SingleEditCell',
props: {
configEdit: {
type: Object,
default: () => ({})
},
listTypeInfo: {
type: Object,
default: () => ({})
},
record: {
type: Object,
default: () => ({})
},
isShowRules: {
type: Boolean,
default: true
},
prop: {
type: String
}
},
computed: {
cEvent() {
return ({ eventHandle }) => {
let event = { ...eventHandle }
let changeEvent = {}
Object.keys(event).forEach(v => {
changeEvent[v] = (e) => {
if (e) {
event[v] && event[v](e, this.record, arguments)
} else {
event[v] && event[v](this.record, arguments)
}
}
})
return { ...changeEvent }
}
},
compChildName() {
return ({ type }) => {
switch (type) {
case 'checkbox':
return 'el-checkbox'
case 'el-select-multiple':
case 'select-arr':
case 'select-obj':
return 'el-option'
}
}
},
compChildLabel() {
return ({ type, arrLabel }, value) => {
switch (type) {
case 'checkbox':
return value.label
case 'el-select-multiple':
case 'select-arr':
return value[arrLabel]
case 'select-obj':
return value
}
}
},
compChildValue() {
return ({ type, arrKey }, value, key) => {
switch (type) {
case 'checkbox':
return value.value
case 'el-select-multiple':
case 'select-arr':
return value[arrKey]
case 'select-obj':
return key
}
}
},
compChildShowLabel() {
return ({ type, arrLabel }, value) => {
switch (type) {
case 'checkbox':
return value.label
case 'el-select-multiple':
case 'select-arr':
return value[arrLabel]
case 'select-obj':
return value
}
}
}
},
methods: {
getPlaceholder(row) {
let placeholder
const inputArr = ['input', 'textarea', 'el-input-number']
const selectArr = ['select-arr', 'time', 'select-obj', 'date']
if (inputArr.includes(row.type)) {
placeholder = '请输入' + row.label
} else if (selectArr.includes(row.type)) {
placeholder = '请选择' + row.label
} else {
placeholder = row.label
}
return placeholder
}
}
}
</script>
<style lang="scss">
.single_edit_cell {
// min-height: 40px;
// line-height: 40px;
cursor: pointer;
}
</style>
4、demo地址
GitHub源码地址
Gitee源码地址
基于ElementUi或Antd再次封装基础组件文档