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

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="width: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="width: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="width: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

vue+element-ui+slot-scope或原生实现可编辑表格(日历)的更多相关文章

  1. vue+element ui 的表格列使用组件

    前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...

  2. 分享一个自搭的框架,使用Spring boot+Vue+Element UI

    废弃,新的:https://www.cnblogs.com/hackyo/p/10453243.html 特点:前后端分离,可遵循restful 框架:后端使用Spring boot,整合了aop.a ...

  3. Vue + Element UI 实现权限管理系统

    Vue + Element UI 实现权限管理系统 前端篇(一):搭建开发环境 https://www.cnblogs.com/xifengxiaoma/p/9533018.html

  4. vue + element ui 实现实现动态渲染表格

    前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...

  5. vue + element ui 表格自定义表头,提供线上demo

    前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...

  6. vue+element ui 的上传文件使用组件

    前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...

  7. vue+element ui 的tab 动态增减,切换时提示用户是否切换

    前言:工作中用到 vue+element ui 的前端框架,动态添加 Tab,删除 Tab,切换 Tab 时提示用户是否切换等,发现 element ui  有一个 bug,这里记录一下如何实现.转载 ...

  8. 基于 vue+element ui 的cdn网站(多页面,都是各种demo)

    前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...

  9. vue + element ui 阻止表单输入框回车刷新页面

    问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...

随机推荐

  1. zabbix、agent端服务器图形化展示

    [root@agent ~]# cat /etc/hostname agent.zabbix.com [root@agent ~]# cat /etc/hosts 127.0.0.1   localh ...

  2. Python数据分析8-----网页文本处理

    1.去除网页的标签,如<br/> from bs4 import BeautifulrSoup preData=BeautifulSoup(data,'html.parser').get_ ...

  3. 嵌入式平台选择:树莓派 or BeagleBone Black(BBB)

    原文链接: Michael Leonard 翻译: 极客范- 小道空空 译文链接: http://www.geekfan.net/5246/ 嵌入式平台选择:树莓派 or BeagleBone Bla ...

  4. laravel contains 的用法

    最近在学laravel,做一下学习笔记. 1.contains()方法判断集合是否包含给定的项目: ]);var_dump($collection->contains('Desk'));// t ...

  5. 新手须知 QT类大全

    QT类大全,在行内容中罗列出来了,希望大家多看看,如果是API就更好了,但可惜不是.这些是一些大类,请多做参考. QApplication 应用程序类 QLabel 标签类 QPushButton 按 ...

  6. Oracle性能分析1:开启SQL跟踪和获取trace文件

    当Oracle查询出现效率问题时,我们往往须要了解问题所在,这样才干针对问题给出解决方式.Oracle提供了SQL运行的trace信息,当中包括了SQL语句的文本信息.一些运行统计,处理过程中的等待, ...

  7. ORA-38760: This database instance failed to turn on flashback database

    ORA-38760: This database instance failed to turn on flashback database 问题背景:        測试数据库运行shutdown ...

  8. 【c++版数据结构】之顺序表的实现

    SeqList.h #ifndef SEQLIST_H #define SEQLIST_H #include<iostream> using namespace std; typedef ...

  9. HDU 1040.As Easy As A+B【排序】【如题(水!水!水!)】【8月24】

    As Easy As A+B Problem Description These days, I am thinking about a question, how can I get a probl ...

  10. Extjs4.2 ajax请求url中传中文參数乱码问题

    今天有个需求须要在url中传入中文參数.结果在后台取得时出现乱码,怀疑可能是编码问题.上网查询了资料,试了几种办法.发现有一种可行,记录在此,以便查阅. url中用encodeURI 进行2次编码: ...