table动态表格

<template>
    <a-card title="保养计划">
        <a-table
            :columns="columns"
            :dataSource="dataSource"
            :pagination="false"
        >
            <!-- 厂站 -->
            <template slot="name" slot-scope="text, record">
                <div key="name">
                    <a-input
                        v-if="record.editable"
                        style="margin: -5px 0;"
                        :value="text"
                        allowClear
                        placeholder="请输入厂站"
                        @change="e => handleChange(e.target.value, record.key, 'name')"
                    />
                    <template v-else>{{ text }}</template>
                </div>
            </template>
            <!-- 设备名称 -->
            <template slot="cname" slot-scope="text, record">
                <div key="cname">
                    <a-input
                        v-if="record.editable"
                        style="margin: -5px 0;"
                        :value="text"
                        allowClear
                        placeholder="请输入设备名称"
                        @change="e => handleChange(e.target.value, record.key, 'cname')"
                    />
                    <template v-else>{{ text }}</template>
                </div>
            </template>
            <!-- 上次保养日期 -->
            <template slot="time" slot-scope="text, record">
                <div key="time">
                    <a-input
                        v-if="record.editable"
                        style="margin: -5px 0;"
                        :value="text"
                        allowClear
                        placeholder="请输入设备名称"
                        @change="e => handleChange(e.target.value, record.key, 'time')"
                    />
                    <template v-else>{{ text }}</template>
                </div>
            </template>
            <!-- 保养周期(天) -->
            <template slot="day" slot-scope="text, record">
                <div key="day">
                    <a-input
                        v-if="record.editable"
                        style="margin: -5px 0;"
                        :value="text"
                        allowClear
                        placeholder="请输入保养周期(天)"
                        @change="e => handleChange(e.target.value, record.key, 'day')"
                    />
                    <template v-else>{{ text }}</template>
                </div>
            </template>
            <!-- 下次保养日期 -->
            <template slot="begin_time" slot-scope="text, record">
                <div key="begin_time">
                    <a-date-picker
                        v-if="record.editable"
                        style="width: 100%; margin: -5px 0;"
                        :value="text"
                        allowClear
                        v-model="begin_times"
                        format="HH:mm"
                        placeholder="请选择开始时间"
                        @change="e => handleChange(begin_times, record.key, 'begin_time')"

                    />
                    <template v-else>{{ text }}</template>
                </div>
            </template>

            <!-- 按钮 -->
            <template slot="operation" slot-scope="text, record">
                <template v-if="record.editable">
                    <span v-if="record.isNew">
                        <a @click="saveRow(record.key)">新增</a>
                        <a-divider type="vertical" />
                        <a-popconfirm :title="$t('deleteConfirm')" @confirm="remove(record.key)">
                            <a>删除</a>
                        </a-popconfirm>
                    </span>
                    <span v-else>
                        <a @click="saveRow(record.key)">保存</a>
                        <a-divider type="vertical" />
                        <a @click="cancle(record.key)">取消</a>
                    </span>
                </template>
                <span v-else>
                    <a @click="toggle(record.key)">编辑</a>
                    <a-divider type="vertical" />
                    <a-popconfirm :title="$t('deleteConfirm')" @confirm="remove(record.key)">
                        <a>删除</a>
                    </a-popconfirm>
                </span>
            </template>
        </a-table>
        <a-button v-show="dataSource.length!==1" style="width: 100%; margin-top: 16px; margin-bottom: 8px;" type="dashed" icon="plus" @click="newMember">新增计划</a-button>
    </a-card>
</template>

<script>
const columns = [
    {
        title: '厂站',
        dataIndex: 'name',
        key: 'name',
        // width: '20%',
        scopedSlots: { customRender: 'name' }
    },
    {
        title: '设备名称',
        dataIndex: 'cname',
        key: 'cname',
        // width: '20%',
        scopedSlots: { customRender: 'cname' }
    },
    {
        title: '上次保养日期',
        dataIndex: 'time',
        key: 'time',
        // width: '40%',
        scopedSlots: { customRender: 'time' }
    },
    {
        title: '保养周期(天)',
        dataIndex: 'day',
        key: 'day',
        // width: '40%',
        scopedSlots: { customRender: 'day' }
    },
    {
        title: '下次保养日期',
        dataIndex: 'begin_time',
        key: 'begin_time',
        // width: '40%',
        scopedSlots: { customRender: 'begin_time' }
    },
    {
        title: '操作',
        key: 'operation',
        width: '10%',
        scopedSlots: { customRender: 'operation' }
    }
]

const dataSource = [
    {
        key: 1,
        name: '小明777',
        cname: '001',
        editable: false,
        time: '行政部',
        day: '1',
        begin_time: '2021-09-29'
    }
]

export default {
    name: 'UserForm',
    // i18n: require('./i18n-user'),
    data () {
        return {
            columns,
            dataSource,
            newTabIndex: 0,
            begin_times: undefined
        }
    },
    computed: {
        dataColumns () {
            return this.columns.map(column => {
                column.title = this.$t('table.' + column.key)
                return column
            })
        }
    },
    methods: {
        handleSubmit (e) {
            e.preventDefault()
        },
        newMember () {
            const activeKey = `newKey${this.newTabIndex++}`
            this.dataSource.push({
                key: activeKey,
                name: '',
                cname: '',
                time: '',
                day: '',
                begin_time: '',
                editable: true,
                isNew: true
            })
        },
        remove (key) {
            const newData = this.dataSource.filter(item => item.key !== key)
            this.dataSource = newData
        },
        saveRow (key) {
            let target = this.dataSource.filter(item => item.key === key)[0]
            target.editable = false
            target.isNew = false
        },
        toggle (key) {
            let target = this.dataSource.filter(item => item.key === key)[0]
            target.editable = !target.editable
        },
        getRowByKey (key, newData) {
            const data = this.dataSource
            return (newData || data).filter(item => item.key === key)[0]
        },
        cancle (key) {
            let target = this.dataSource.filter(item => item.key === key)[0]
            target.editable = false
        },
        handleChange (value, key, column) {
            const newData = [...this.dataSource]
            const target = newData.filter(item => key === item.key)[0]
            if (target) {
                target[column] = value
                this.dataSource = newData
            }
        }
    }
}
</script>

<style scoped lang="less">
/deep/.ant-card-body {
    padding: 0;
}

/deep/.ant-card-head {
    padding: 0;
}

/deep/.ant-card-head-title {
    padding: 0;
}
</style>

 

posted @ 2021-09-23 14:45  Jim-vue  阅读(116)  评论(0编辑  收藏  举报