vue2.x el-table二次封装实现编辑修改

目录
  • computed中
  • 接收以下参数
  • colData 控制列数的数组
  • 表格可编辑
  • select绑定相关

最近开发新业务,看到有些功能一样的表格,想着封装一个组件,记录一下:

最终实现效果

大概实现是:

  • 封装一个通用的表格
  • 接收两个数组, 一个控制行数,一个控制列数
  • 表格可进行编辑操作

官方文档

图中我们可以看到:

  • :data="tableData"中 传入的tableData用来控制表格行数
  • el-table-column用来控制列数,有几个el-table-column, 表格就有几列
  • 因此我们再定义一个数组,去对应tableData中的要显示的项,用来产生需要的列

comTable代码如下:

//data是从后端获取到的数据,控制行数
<el-table :data="data" class="com_table" :border="true" style="wdith:100%"> 
                      //colData是我们要传入组件的数据,控制列数
            <el-table-column
                v-for="(item,index) of colData"
                :key="index"
                :prop="item.prop"
                :label="item.label"
                :width="item.width || 'auto'"
            >
                <template slot-scope="scope">
                  //点击编辑时显示这个
                    <template v-if="scope.row.isEdit">
                          //可编辑显示这个
                        <template v-if="item.editAble">
                            <el-select @change="changeSelect(scope.row,scope.row[item.prop],item.selectValue)" v-if="item.isSelect" v-model="scope.row[item.prop]">
                            <!-- 模板中访问不到实例this,因此在computed中使用_this返回 -->
                                <el-option
                                    v-for="item_ of _this[item.options]"
                                    :key="item_.key"
                                    :label="item_[item.value]"
                                    :value="item_[item.value]"                                   
                                >     
                                </el-option>
                            </el-select>n>
                            </el-select>
                            <el-input v-else v-model="scope.row[item.prop]"></el-input>
                        </template>
                                                //如果不可编辑依旧显示这个
                        <span v-if="!item.editAble">{{scope.row[item.prop]}}</span>
                    </template>
                                        //默认状态下是这个,因为isEdit在scope.row里并没有,为undefined
                    <span v-if="!scope.row.isEdit">{{scope.row[item.prop]}}</span>
                </template>
            </el-table-column>
        </el-table>

computed中

 computed:{
        _this(){
            return this
        }
    },

​

接收以下参数

props:{
        data:{
            type:Array,
            require:true,
            default(){
                return []
            }
        },
        //select绑定的值,需要几个就传几个
        selectOptions:{
            type:Array,
            default(){
                return []
            }
        },
        colData:{
            type:Array,
            require:ttrue
            default(){
                return []
            }
        }
    },

colData 控制列数的数组

export const colData = [
    {
        prop:'indexNum',
        label:'序号',
        width:'120px',
    },
    {
        prop:'roadName',
        label:'路段名称'
    },
    {
        prop:'tunnelName',
        label:'隧道名称'
    },
    {
        prop:'tunnelLength',
        label:'隧道长度(m)'
    },
    {
        prop:'completeYear',
        label:'建成时间'
    },
    {
        prop:'evaluateYear',
        label:'评定年份'
    },
    {
        prop:'evaluateScore',
        label:'评定评分'
    },
    {
        prop:'evaluateLevelName',
        label:'机电评定等级',
        editAble:true, //editAble为true代表可编辑,没有这个值的项 为undefined,即不可编辑
        isSelect:true,   //表示编辑方式为select, 没有就是输入框
        selectValue:'evaluateLevel'   //编辑是绑定的值
        options:'selectOptions',    //遍历产生的option对应的选项
        value:'value'   //绑定options中对应的键
    },
    {
        prop:'powerRate',
        label:'供配电设施完好率(%)',
        editAble:true
    },
    {
        prop:'lightRate',
        label:'照明设施完好率(%)',
        editAble:true
    },
    {
        prop:'ventilateRate',
        label:'通风设施完好率(%)',
        editAble:true
    },
    {
        prop:'fireControlRate',
        label:'消防设施完好率(%)',
        editAble:true
    },
    {
        prop:'monitorRate',
        label:'监控与通讯设施完好率(%)',
        editAble:true
    }
]

后端返回的数据是这样的:

当然,这些都是测试用的假数据,切记不要泄露公司数据哦

表格可编辑

<template v-slot:header="{ click, btn_edit }">
                <div class="table_title_container">
                    <h3>历史技术状况评定</h3>
                    <el-button v-if="btn_edit" class="table_title_btn el-icon-edit" size="small" @click="click">修改</el-button>
                    <el-button v-else class="table_title_btn el-icon-check" type="primary" size="small" plain @click="click">完成</el-button>
                </div>
            </template>
if(this.btn_edit){
                            this.data.forEach(item => {
                                this.$set(item, 'isEdit', true)
                            })
                    }else{
                            this.data.forEach(item => {
                                this.$set(item, 'isEdit', null)
                            })
                    }
                    this.btn_edit = !this.btn_edit

按钮为编辑:给data中的每一项添加 'isEdit'属性为true
按钮为完成:设置data中的每一项 'isEdit'属性为null

select绑定相关

一般我们select都是会 对应两个字段

  • 客户端显示的内容
  • 传给服务端的内容
//在comTable中是这样写的
<el-select @change="changeSelect(scope.row,scope.row[item.prop],item.selectValue)" v-if="item.isSelect" v-model="scope.row[item.prop]">
                                <!-- 模板中访问不到实例this,因此在computed中使用_this返回 -->
                                <el-option
                                    v-for="item_ of _this[item.options]"
                                    :key="item_.key"
                                    :label="item_[item.value]"
                                    :value="item_[item.value]"
                                >
                                </el-option>
                            </el-select>

colData中相关配置:

 {
        prop:'evaluateLevelName',
        label:'机电评定等级',
        editAble:true,
        isSelect:true,    //编辑时类型为 select
        selectValue:'evaluateLevel',   //编辑时绑定的值
        options:'selectOptions',   //遍历产生的option对应的选项
        value:'value'     //绑定options中对应的键
    },

selectOptions:

[
  {
    key:1,
    value:'一类'
  },
  {
    key:2,
    value:'二类'
  },
  {
    key:3,
    value:'三类'
  }
]

select的change事件处理函数

//传入三个参数,分别是:
    // 当前这一行的scope.row
    //当前这一行特定属性对应的值
    //要传给服务端的 scope.row中对应的字段名
changeSelect(obj, value, key){
            let val = this.selectOptions.find(item => item.value == value).key
            this.$set(obj, key, val)
        },

到此这篇关于vue2.x el-table二次封装实现编辑修改的文章就介绍到这了,更多相关vue2.x el-table 编辑修改内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue修改Element的el-table样式的4种方法

    修改Element中的el-table样式,可以使用以下几种方法: 1. row-style 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style. 2. cell-style 单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style. 3. header-row-style 表头行的 style 的回调方法,也可以使用一个固定的 Object 为所有表头行设置一样的 Style. 4. header-c

  • vue2.x el-table二次封装实现编辑修改

    目录 computed中 接收以下参数 colData 控制列数的数组 表格可编辑 select绑定相关 最近开发新业务,看到有些功能一样的表格,想着封装一个组件,记录一下: 最终实现效果 大概实现是: 封装一个通用的表格 接收两个数组, 一个控制行数,一个控制列数 表格可进行编辑操作 官方文档 图中我们可以看到: :data="tableData"中 传入的tableData用来控制表格行数 el-table-column用来控制列数,有几个el-table-column, 表格就有

  • Vue技巧Element Table二次封装实战示例

    目录 前言 思考 实践 filterPane.vue 明确目标 传入数据结构整理 timeSelect elinput elselect 开始封装 tablePane.vue 明确目标 传入数据结构整理 tool cols pageData operation tablePane.vue配置项Cols详解 开始封装 实战 结尾 前言 由于重构后台管理项目中有好多表格页面, 举个栗子 这表格看着还挺好看,写起来叫人直呼XX,多动脑子少掉发,少走弯路多省鞋. 写了一个后感觉太麻烦了,于是我奋笔疾书,

  • 基于Vue+element-ui 的Table二次封装的实现

    本人第一次写这个 写的不好还望指出来 作为一个由于公司产品的升级然促使我从一个后端人员自学变成前端的开发人员 ! 公司做的数据管理系统所以离不开表格了 然后表格样式统一啥的就想到封装一个element-ui 里面的table+Pagination了 效果图 表格组件的引入与使用 <com-table title="监测数据" v-model="tableData4" @selection-change="handleSelectionChange&q

  • Element Plus组件Form表单Table表格二次封装的完整过程

    目录 前言 Form表单的封装 简述 正常的使用 开始封装① 开始封装② 开始封装③ 开始封装④ 完整封装代码⑤ 配置项类型文件 配置项文件 form表单组件文件 page-search组件文件 role页面组件文件 结语 Table表格的封装 简述 正常使用 开始封装① 开始封装② 开始封装③ 完整封装代码④ 配置项类型文件 配置项文件 table表单组件文件 page-table组件文件 user页面组件文件 结语 前言 直至今天,看了一下别人写的代码,才发现以前自己写的代码太垃圾,所以在这

  • element el-table表格的二次封装实现(附表格高度自适应)

    前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多个页面使用相同的功能,就要多次重复写逻辑上差不多的代码,所以打算对表格这个组件进行封装,将相同的代码和逻辑封装在一起,把不同的业务逻辑抽离出来.话不多说,下面就来实现一下吧. 一.原生el-tbale代码--简单の封装 这里直接引用官方的基础使用模板,直接抄过来(✪ω✪),下面代码中主要是抽离html部分,可以看出每个el-table-column

  • 解决ant design vue 表格a-table二次封装,slots渲染的问题

    目的就是对a-table进行二次封装,但是在如何显示a-table的slot时遇到了问题,原本想法是在a-table内把$slots都渲染,期望在使用该组件时能正确渲染,然而...并不会正确渲染 <template> <a-table bordered :scroll="{ x: scrollX, y: 600 }" v-bind="{...$attrs, ...$props, ...{dataSource: body, columns: header}}&

  • elementui实现预览图片组件二次封装

    起因 在elementui组件库中,el-image组件有个预览图片功能,比较简洁,但是和图片绑定在一起,我们只想要一个单纯的预览组件,传递一个图片,通过事件方式,显示大图 分析 通过查看elementui的代码,发现在image(el-image组件)目录中里面有一个image-viewer组件, el-image组件的预览功能也是通过这一个组件实现的,只是官方没有把这个组件单独暴露出来 这里就比较简单了,我们可以使用手动导入组件的方式,引入image-viewer组件 image-viewe

  • vue对el-autocomplete二次封装增加下拉分页

    目录 1.自定义指令实现下拉加载更多. 2.增加props(getOptionFn.searchKey.value.placeholder)抽离业务.成为公共组件 3.可能需要解释的 项目中的联想输入框现在都是采用的el-autocomplete实现的,但是随着数据量越来越多,产品要求一次不要返回所有的联想数据,要做分页处理,所以需要添加一个分页的功能. 注:看懂下面的代码需要先对vue和element有一定的学习. 废话不多数,先上完整代码 <template> <el-autocom

  • vue-cli对element-ui组件进行二次封装的实战记录

    目录 为什么要element对进行二次封装? 如何对element对进行二次封装? 总结 为什么要element对进行二次封装? 1.element-ui组件的部分样式不满足当前项目的需求. element-ui组件的样式是固定的,比如我们常用的那些组件,table,button,icon,tab等等.当我们需要的样式和element组件有偏差的时候,我们可以通过针对element组件进行二次封装,然后通过Vue.component()方法,定义到全局,来解决我们当前的项目需求. 2.eleme

  • 基于element-ui表格的二次封装实现

    在项目中经常会使用到element的表格,如果每次都cv,也确实有点麻烦,基于这个情况我对表格进行了二次封装 写一个Table组件 首先先写表格样式 <el-table :data="tableData" :header-cell-style="headerStyle" :height="height" :border="border" @selection-change="handleSelectionCha

随机推荐