• vue+element-ui+slot-scope或原生实现可编辑表格(日历)


    你们公司的产品是不是还在做一个可编辑表格功能?

    1.前言

    咱开发拿到需求大多数是去网上找成型的组件,找不到再看原生的方法能否实现,大牛除外哈,大牛一般喜欢封装组件框架。

    2.思路

    可编辑表格在后台管理系统还是比较常用的,因为比较流行框架element,iview都没有这个应用,所以考虑了两种方法,下面我简单说哈我的两种方法:vue+element实现表格跨行或跨列合并

    3.方法一:

    直接通过element的table组件中的cell-click和cell-dbclick监听表格事件,回调函数有四个参数row, column, cell, event,可以拿这些参数做相应的筛选,然后使用操作dom的方法添加input达到更改值的作用,贴上原生代码:

    
    <template>
    //表格也可以写成原生的table
    <el-table :data="addPlanRoute" border style="100%" @cell-dblclick="tableDbEdit">
           <el-table-column property="order1" label="顺序"></el-table-column>
           <el-table-column property="order2" label="装车点">
               <template slot-scope="scope">
                   <el-input v-model="scope.row.order2" placeholder="请输入内容"></el-input>
               </template>
           </el-table-column>
    </el-table> 
    </template>
    
    <script>
    export default{
        data(){
            return{}
        },
        methods:{
        tableDbEdit(row, column, cell, event) {
              console.log(row, column, cell, event);
              if (column.label != "顺序") {
                event.target.innerHTML = "";
                let cellInput = document.createElement("input");
                cellInput.value = "";
                cellInput.setAttribute("type", "text");
                cellInput.style.width = "80%";
                cell.appendChild(cellInput);
                cellInput.onblur = function() {
                  cell.removeChild(cellInput);
                  event.target.innerHTML = cellInput.value;
                };
            }
         }
        }
    }
    </script>
    
    

    这个方法确实可以实现功能,谁让原生js功能强大的。

    4.方法二:

    <1.>在element的table组件中使用slot-scope(作用域插槽)来实现该需求,就相当于将<el-input>直接作为<el-table-column>的子组件使用,不用绑定对应的方法,直接用:hover方法就可以修改<el-input>的样式
    <2.>slot-scope可能有些人有点陌生,这里贴上官网的链接请戳这里,里面很详细

    
    &lt;el-table :data="addPlanRoute" border style="100%"&gt;
       &lt;el-table-column property="order1" label="顺序"&gt;&lt;/el-table-column&gt;
       &lt;el-table-column property="order2" label="装车点"&gt;
           &lt;template slot-scope="scope"&gt;
               &lt;el-input v-model="scope.row.order2" placeholder="请输入内容"&gt;&lt;/el-input&gt;
           &lt;/template&gt;
       &lt;/el-table-column&gt;
    &lt;/el-table&gt; 
    

    <3.>我开发的时候碰到一个大的问题是,el-table-column里面的值怎么传到el-input中去?

    <4.>实际上slot-scope的值可以解决这个问题,vue原生slot-scope 的值将被用作一个临时变量名,可以接收父组件传过来的值, 而在element中的table对slot-scope的值封装成了一个大的对象,对象里面有属性row(行),column(列),$index(索引),store,所以我们可以通过scope.row拿到对应的值.

    <5.>如果想详细了解slot-scope里面封装值的情况,可以将下面这个代码复制到vue文件中,在浏览器中就可以看到效果:

    
    &lt;el-table :data="addPlanRoute" border style="100%"&gt;
           &lt;el-table-column property="order1" label="顺序"&gt;&lt;/el-table-column&gt;
           &lt;el-table-column property="order2" label="装车点"&gt;
               &lt;template slot-scope="scope"&gt;
                   &lt;el-button size="mini" type="primary" @click="add(scope1)"&gt;添加&lt;/el-button&gt;
               &lt;/template&gt;
           &lt;/el-table-column&gt;
    &lt;/el-table&gt;
    &lt;script&gt;
    methods:{
        add(scope1){
          console.log(scope1)
        },
    }
    &lt;/script&gt;
    
    

    5.方法三:

    直接在原生<table>里面嵌套<input>标签,然后通过改变样式来改变边框的显示,直接贴上代码,复制即可演示!

    
    &lt;template&gt;
      &lt;div&gt;
        &lt;table class="edit-table"&gt;
          &lt;thead&gt;
            &lt;th&gt;姓名&lt;/th&gt;&lt;th&gt;年龄&lt;/th&gt;&lt;th&gt;成绩&lt;/th&gt;&lt;th&gt;性别&lt;/th&gt;
          &lt;/thead&gt;
          &lt;tbody&gt;
            &lt;tr&gt;&lt;td&gt;&lt;input value="张三"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input value="30"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input value="90"/&gt;&lt;/td&gt;&lt;td&gt;&lt;input value="女"/&gt;&lt;/td&gt;&lt;/tr&gt;
          &lt;/tbody&gt;
        &lt;/table&gt;
      &lt;/div&gt;
    &lt;/template&gt;
    
    &lt;script&gt;
      
    &lt;/script&gt;
    
    &lt;style lang="scss"&gt;
    .edit-table{
        border:1px solid gray;
        border-collapse: collapse;
        th{
          border:1px solid gray;
        }
      tbody{
        
        tr{
          td{
            border:1px solid gray;
            input{
              border:none;
            }
          }
        }
      }
    }
    &lt;/style&gt;
    
    

    6.三种方法的对比

    1.其实本质上都是利用<input>标签可以修改文本的特性;
    2.方法三是最简单的可以利用<td>嵌套<input>直接实现表格的修改,还可以结合v-model来双向绑定数据,只是需要自己手动是修改下样式,
    3.有个问题:如果是合并的行或列需要修改应该怎么实现?
    这边首先要实现表格的合并功能,有篇文章讲的这个,vue+element实现表格跨行或跨列
    然后可以套用这篇文章的三个方法
    3.方法二如果项目在使用vue+element技术也是一种不错的选择

    7.很开心你还能看到这里,棒棒哒!欢迎交流.

    7.日历

    日历可以直接对应将slot-scope里面的组件改为日期组件<el-date-picker>就可以

    原文地址:https://segmentfault.com/a/1190000012554279

  • 相关阅读:
    为什么每天都在学习,生活还是没有任何改善?
    MySql基础汇总
    BeanUtils.copyProperties(待复制对象, 待更新对象) || PropertyUtils.copyProperties(待更新对象, 待复制对象)
    ThreadLocal
    synchronized 锁
    STS报could not find tools.jar in the active JRE
    SpringBoot 定时任务 || cron表达式
    lombok注解
    cron表达式
    Thymeleaf 模板引擎
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9960414.html
Copyright © 2020-2023  润新知