el-table实现行内编辑功能

远离其实很简单:就是在获取table数据后,对数组进行遍历,每一个都添加上一个show属性,并赋值为false,

然后在每个el-table-column中进行判断:

原理就是这样,其他的控件比如:选择框、时间框、数字选择框等等吧,都可以适用。

<el-table-column prop="name" label="地址">
       <template scope="scope">
            // 如果show=true的话,就显示el-input
           <el-input size="small" v-model="scope.row.name" v-show="scope.row.show" placeholder="请输入内容"></el-input>
            // 如果show=false的话,就显示值
            <span v-show="!scope.row.show">{{scope.row.name}}</span>
       </template>
</el-table-column>

效果如下:

下面是完整地代码: 

<template>
    <div class="rowEdit">
        <div class="crud-opts">
              <div class="crud-opts-left">
                            <el-button
                                    class="filter-item"
                                    size="mini"
                                    type="text"
                                    icon="el-icon-my-add"
                                    @click="edit()"
                            >
                                编辑
                            </el-button>
                            <el-button
                                    class="filter-item"
                                    size="mini"
                                    type="text"
                                    icon="el-icon-my-publish"
                                    @click="cancle"
                            >取消
                            </el-button>
                            <el-button
                                    class="filter-item"
                                    type="text"
                                    icon="el-icon-my-delete"
                                    size="mini"
                                    @click="save"
                            >
                                保存
                            </el-button>
                        </div>
        </div>
        <!--表格渲染-->
        <el-table ref="table" :height="tableHeight"
                  v-loading="loading"
                  :data="tabledatas"
                  @selection-change="selectItem"
                  @row-click="onSelectOp"
                  style="width: 100%;">

            <el-table-column
                    type="selection"
                    width="55"
                    :reserve-selection="false"
            ></el-table-column>
            <el-table-column prop="dydjbm" label="电压等级">
                <template scope="scope">
                    <el-select v-model="scope.row.dydjbm" v-show="scope.row.show"  placeholder="请选择">
                        <el-option
                                v-for="item in dydjbm"
                                :key="item.value"
                                :label="item.label"
                                :value="item.label">
                        </el-option>
                    </el-select>
                    <span v-show="!scope.row.show">{{scope.row.dydjbm}}</span>
                </template>
            </el-table-column>
            <el-table-column prop="name" label="地址">
                <template scope="scope">
                    <el-input size="small" v-model="scope.row.name" v-show="scope.row.show" placeholder="请输入内容"></el-input>
                    <span v-show="!scope.row.show">{{scope.row.name}}</span>
                </template>
            </el-table-column>
        </el-table>
    </div>
</template>

<script>
    export default {
      
        data(){
            return{
                dydjbm: [{
                    value: '选项1',
                    label: '黄金糕'
                }, {
                    value: '选项2',
                    label: '双皮奶'
                }],
                tabledatas: [],
                selectlist: []
            }
        },
        methods:{
            /**
                单个去勾选时触发自定义的selectItem函数
                @selection-change事件会默认传行数据进去,
                用selectItem(rows)的rows接收就好,rows所选行数据的数组
            */
            selectItem(rows) {
                if (rows.length > 1) {
                    var newRows = rows.filter((it, index) => {
                        if (index == rows.length - 1) {
                            this.$refs.table.toggleRowSelection(it, true);
                            return true;
                        } else {
                            this.$refs.table.toggleRowSelection(it, false);
                            return false;
                        }
                    });
                    this.selectlist = newRows;
                } else {
                    this.selectlist = rows;
                }
            },
            /**
                点击那一行数据触发的事件默认传点击那行的数据,自定义onSelectOp(row)函数,
                用row来接收点击的那行数据,
                先把所有的选项清空this.$refs.multipleTable.clearSelection();

                再把点击的那行勾选this.$refs.multipleTable.toggleRowSelection(row, true);
                把自定义数组清空this.selectlist = [];
                把新勾选的数据push进数组this.selectlist.push(row);
           */
            onSelectOp(row) {
                this.$refs.table.clearSelection();
                this.$refs.table.toggleRowSelection(row, true);
                this.selectlist = [];
                this.selectlist.push(row);
            },
            // 编辑
            edit(row){
                this.selectlist[0].show=true
            },
            //保存
            save(){
                this.selectlist[0].show = false
            },
            //取消
            cancle(){
                this.selectlist[0].show = false
            }

        },
        created(){
            // 发请求去后台拿数据,如果有api,就正常请求,
            //我这里是demo,就简单给list赋值了,原理一样。
            // getlistApi().then(res => {
            // let list = res.data.list
            let list = [
                {
                dydjbm: '2016-05-02',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄',
            }, {
                dydjbm: '2016-05-04',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄'
            }, {
                dydjbm: '2016-05-01',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄',
            }, {
                dydjbm: '2016-05-03',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄'
            }]
            list.forEach(element => {
                element["show"] = false
            });
            this.tabledatas = list
        }
    }
</script>

<style>

</style>

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现 `el-table` 行内修改,可以按照以下步骤进行: 1. 在 `el-table` 中添加 `:row-key` 属性,用于指定表格数据的唯一标识,这样才能正确找到要修改的数据。 2. 在 `el-table-column` 中添加 `:editable="true"` 属性,表示该列可以进行编辑。 3. 在 `el-table-column` 中添加 `:edit-render` 属性,用于指定该列编辑时所使用的组件。可以使用 `el-input`、`el-select` 等组件,也可以自定义组件。 4. 在 `el-table` 中添加 `@cell-click` 事件,用于响应单元格的点击事件。在事件处理函数中,可以判断当前单元格是否为可编辑单元格,如果是,则将该单元格切换为编辑状态。 5. 在 `el-table` 中添加 `@cell-blur` 事件,用于响应单元格的失焦事件。在事件处理函数中,可以获取当前单元格的值,并更新表格数据。 以下是一个示例代码: ```html <template> <el-table :data="tableData" :row-key="row => row.id" @cell-click="handleCellClick" @cell-blur="handleCellBlur"> <el-table-column prop="name" label="姓名" :editable="true" :edit-render="nameEditRender"> </el-table-column> <el-table-column prop="age" label="年龄" :editable="true" :edit-render="ageEditRender"> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { id: 1, name: '张三', age: 20 }, { id: 2, name: '李四', age: 25 }, { id: 3, name: '王五', age: 30 } ] } }, methods: { handleCellClick(row, column, event) { if (column.editable) { this.$refs.table.toggleRowEdit(row) } }, handleCellBlur(row, column, event) { if (column.editable) { row[column.property] = event.target.value } } }, computed: { nameEditRender() { return (h, { row, column }) => { return ( <el-input v-model={row[column.property]}> </el-input> ) } }, ageEditRender() { return (h, { row, column }) => { return ( <el-input-number v-model={row[column.property]}> </el-input-number> ) } } } } </script> ``` 在示例代码中,`el-table-column` 中的 `editable` 属性设置为 `true`,表示该列可编辑。`edit-render` 属性使用 `nameEditRender` 和 `ageEditRender` 方法分别指定了姓名和年龄列的编辑组件。 `@cell-click` 事件响应单元格的点击事件,在该事件处理函数中,使用 `toggleRowEdit` 方法切换行的编辑状态。 `@cell-blur` 事件响应单元格的失焦事件,在该事件处理函数中,更新表格数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值