import { computed, defineComponent, onBeforeUnmount, ref } from 'vue' import { cloneDeep } from 'lodash' import ConfColumn from 'skzz-conf-column' export default defineComponent({ name: 'SkEditTable', components: { ConfColumn, }, props: { options: { type: Array, default: () => ([]), }, }, emits: ['currentEdit'], setup (props, { attrs, emit, expose }) { const elTabNode = ref(null) const editNode = ref(null) const globalEvent = (e: MouseEvent) => { if (!editNode.value.contains(e.target)) elTabNode.value.setCurrentRow() } document.addEventListener('click',globalEvent) onBeforeUnmount(() => { document.removeEventListener('click', globalEvent) }) const saveHandler = (event: MouseEvent) => { event.stopPropagation() elTabNode.value.setCurrentRow() } let haveOption = false function depFilter (temp: any) { temp.map((item: any) => { if (item.mchildren) { depFilter(item.mchildren) } else { // 普通模式,没有slot就直接给个input if (!item.slot) { item.slot = (value: any) => ( <>
emit('currentEdit', value.$index, value.row)} v-model={value.row[item.prop]} />
{item.formatter ? item.formatter(value.row, value.column, value.$index) : value.row[item.prop]} ) } // 有slot的情况,自定义slot内容 if (item.prop !== 'option' && item.slot) { const temp = item.slot const slotVal = (value: any) => temp(value) item.slot = (value: any) => ( <>
{ slotVal(value) }
{item.formatter ? item.formatter(value.row, value.column, value.$index) : value.row[item.prop]} ) } // 操作按钮模式 if (item.prop === 'option' && item.slot) { haveOption = true const temp = item.slot const slotVal = (value: any) => temp(value) item.slot = (value: any) => ( <> { slotVal(value) } saveHandler($event)} type="primary" >保存 ) } } }) } const tempOpt = computed(() => { const temp = cloneDeep(props.options) depFilter(temp) return temp }) expose({ elTabNode, editNode, }) return () => (
) }, })