实现多表格添加点击按钮,添加一行,删除一行

页面多个表格,填写的内容怎么保存到数据库。然后我添加了点击按钮,怎么实现各种表格能增加行数?表格字段数,字段名都不一样

嗯,问题有些模糊,可以详细说说么?下面是一些参考。


表格数据变化直接更新绑定的变量就可以,多个表格,你可以调对应的方法实现。保存数据库需要在生命周期里写AjAX。
类似这样的


img

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <!-- import CSS -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- import Vue before Element -->
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <!-- import JavaScript -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>

<body style="display: flex;justify-content: center;width: 100%;">
    <div id="app">
        <el-card>
            <el-table :data="tableData" style="width: 100%" :row-class-name="tableRowClassName"
                @cell-dblclick="editdbClick">
                <el-table-column prop="date" label="日期" width="180">
                    <template slot-scope="scope">
                        <el-select v-show="!showEdit[scope.$index]" popper-class="role-option" v-model="scope.row.date"
                            placeholder="请选择" size="small" @change="dateHandleChange">
                            <el-option v-for="item in optionData" :key="item.name" :label="item.name"
                                :value="item.value"></el-option>
                        </el-select>
                        <span style="line-height: 32px;"
                            v-show="showEdit[scope.$index]">{{ optionDataf(scope.row.date)}} </span>
                    </template>
                </el-table-column>
                <el-table-column prop="name" label="姓名" width="180">
                    <template slot-scope="scope">
                        <el-select v-show="!showEdit[scope.$index] && scope.row.date != '2' " popper-class="role-option"
                            v-model="scope.row.name" placeholder="请选择" size="small">
                            <el-option v-for="item in optionName" :key="item.name" :label="item.name"
                                :value="item.value"></el-option>
                        </el-select>
                        <span style="line-height: 32px;"
                            v-show="showEdit[scope.$index]">{{optionNamef(scope.row.name) }} </span>
                    </template>
                </el-table-column>
                <el-table-column prop="addr" width="180" label="地址">
                    <template slot-scope="scope">
                        <el-select v-show="!showEdit[scope.$index]" popper-class="role-option" v-model="scope.row.addr"
                            placeholder="请选择" size="small">
                            <el-option v-for="item in optionsAddr(scope.row)" :key="item.name" :label="item.name"
                                :value="item.value"></el-option>
                        </el-select>
                        <span style="line-height: 32px;"
                            v-show="showEdit[scope.$index]">{{optionsAddrf(scope.row.addr) }}
                        </span>
                    </template>
                </el-table-column>
                <el-table-column label="操作" width="100" header-align="right">
                    <template slot-scope="scope">
                        <div style="display: flex;justify-content: space-between;">
                            <el-link icon="el-icon-plus" size="mini" type="primary"
                                @click="handleAdd(scope.$index, scope.row)" :underline="false"
                                style="font-size: 14px;margin-left: 40px"></el-link>
                            <el-link icon="el-icon-delete" size="mini" @click="handleDelete(scope.$index, scope.row)"
                                type="danger" :underline="false"></el-link>
                        </div>
                    </template>
                </el-table-column>
            </el-table>
        </el-card>
    </div>
</body>
<script>
 /**
    * @description: 双击行视图手动切换,通过双击表格实现编辑的表格的切换
    * @author: Liruilong
    */
    new Vue({
        el: '#app',
        data() {
            return {
                optionData: [{ value: "1", name: "2016-05-03" }, { value: "2", name: "2016-05-04" }, { value: "3", name: "2016-05-05" }],
                optionName: [{ value: "1", name: " 王小虎" }, { value: "2", name: "王小龙" }, { value: "3", name: "王小狗" }],
                optionAddr: [{ value: "1", name: "北凉" }, { value: "2", name: "西北道" }, { value: "3", name: "泰安城" }],
                tableData: [{
                    date: '1',
                    name: '1',
                    addr: '1',
                }],
                optionAddrMapper: new Map(),
                date: '',
                name: '',
                address: '',
                showEdit: [false],
            }
        },
        created() {

        },
        mounted() {
            // 模拟ajax初始化数据集
            this.optionAddrMapper.set("1", [{ value: "1", name: "北凉" }, { value: "2", name: "西北道" }, { value: "3", name: "泰安城" }]);
        },
        methods: {
            optionDataf(id) {
                let name = id;
                this.optionData.forEach((element) => {

                    if (element.value == id) {
                        name = element.name;
                    }
                });
                return name;
            },
            optionNamef(id) {
                let name = id;
                this.optionName.forEach((element) => {
                    if (element.value == id) {
                        name = element.name;
                    }
                });
                return name;
            },
            optionsAddrf(id) {
                let name = id;
                if (this.optionAddrMapper) {
                    this.optionAddrMapper.forEach((value, key) => {
                        value.forEach((e) => {
                            if (e.value == id) {
                                name = e.name;
                            }
                        })
                    });
                } else {
                    this.optionAddr.forEach(e => {
                        if (e.value == id) {
                            name = e.name;
                        }
                    });
                }
                return name;
            },
            editdbClick(row, column, cell, event) {

                if ((row.date && row.name && row.addr) || (row.date && row.addr)) {
                    this.$set(this.showEdit, row.index, !this.showEdit[row.index])
                }

            },
            // openShow(index){
            //     this.showEdit.forEach( (e) =>{
            //         if(e != index){
            //             this.$set(this.showEdit, e, false)
            //         }
                   
            //     })
            // },
            saveClick(row, column, cell, event) {
            },
            optionsAddr(row) {
                return this.optionAddrMapper.get(row.date);
            },
            //联动处理//模拟ajax调用接口获取数据.日期选择会联动地址
            dateHandleChange(val) {
                // 模拟根据日期得到地址的数据集 这里写ajax ,必须是同步的请求。
                this.optionAddrMapper.set("1", [{ value: "1", name: "北凉" }, { value: "2", name: "西北道" }, { value: "3", name: "泰安城" }]);
                this.optionAddrMapper.set("2", [{ value: "9", name: "西域" }, { value: "8", name: "苗疆" }, { value: "7", name: "剑气长城" }]);
                this.optionAddrMapper.set("3", [{ value: "10", name: "圣贤林" }, { value: "11", name: "青冥天下" }, { value: "12", name: "藕花福地" }]);
            },
            // 添加操作。默认会保存当前行的数据,并添加一条新数据
            handleAdd(index, row) {
                let data = this.tableData[this.tableData.length - 1];
                if (((row.date && row.name && row.addr) || (row.date && row.addr)) && ((data.date && data.name && data.addr) || (data.date && data.addr))) {
                    this.$set(this.showEdit, row.index, true)
                    this.tableData.push({
                        date: '',
                        name: '',
                        addr: ''
                    });
                    this.$set(this.showEdit, row.index + 1, false)
                }
            },
            handleDelete(index, row) {
                debugger
                if (index > 0) {
                    this.tableData.splice(index, 1);
                }
            },
            tableRowClassName({ row, rowIndex }) {
                row.index = rowIndex;
                if ((rowIndex + 1) % 2 === 1) {
                    return 'warning-row';
                } else {
                    return 'success-row';
                }
                return '';
            }
        },
        props: {},
        computed: {},

        created() {

        },
        watch: {},
        filters: {

        },

    })
</script>
<style>
    .el-table .warning-row {
        background: oldlace;
    }

    .el-table .success-row {
        background: #f0f9eb;
    }
</style>

</html>


可以参考: https://blog.csdn.net/sanhewuyang/article/details/109671135 https://blog.csdn.net/sanhewuyang/article/details/109671135