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

本文主要是介绍vue+element-ui+slot-scope或原生实现可编辑表格(日历),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

element vue.js

更新于 2018-02-24  约 9 分钟

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

1.前言

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

2.思路

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

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可能有些人有点陌生,这里贴上官网的链接请戳这里,里面很详细

<el-table :data="addPlanRoute" border style="width:100%"><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> 

<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文件中,在浏览器中就可以看到效果:

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

5.方法三:

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

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

6.三种方法的对比

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

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

7.日历

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

阅读 30.6k更新于 2018-02-24

本作品系 原创 , 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议


火狼

  •  
  • 7.3k
  •  
  •  

 

28 条评论

得票时间

 

xpbsm

我的做法是利用input的 readonly 特性,在table 的双击中切换readonly 状态即可

 

1 回复 2018-04-02

  • 火狼

    你这个属性也可以,只读属性

     

  • 回复 2018-04-02

一枝梅

写的太好了,为了给你点赞,专门注册了账号;
网上找的资料都只有原生态scope的理解,一直搞不懂el-table下的scope 原来封装成了大对象,话说你看Vue的原文档就能明白el-table把他封装成大对象么?我在这儿折腾了两个小时;不妨授我以渔,谢谢

 

1 回复 2018-08-09

  • 火狼

    1.很开心你能看的这么仔细
    2.scope-slot是vue2.5版本才出的一个新属性
    3.那个封装成大对象是element-UI下面的lib/table-column.js下面依赖vue2.5的scope-slot进行了二次封装
    4.那里面那个renderCell函数里面就对这四个参数进行了处理,这个文件你可以详细看下

     

  • 回复 2018-08-10

淡看灬那笑容

问一下,你这个创建的input框如何把时间选择器放进去

 

回复 2018-01-09

  • 火狼

    1.不好意思,前段时间有点忙,直接在template插槽里面嵌套就可以呢,贴上代码
    <el-table-column property="startTime" label="发车时间" width="120px">

        <template slot-scope="scope"><el-time-picker v-model="scope.row.startTime" placeholder="" class="ground-midify-date"></el-time-picker></template>

    </el-table-column>
    2.多多交流

     

  • 回复 2018-01-31

  • 淡看灬那笑容

    好的,谢谢了!

     

  • 回复 2018-02-01

  • 火狼

    不客气,我昨天补充了方法三,那种方法也很简单,你可以对比看下

     

  • 回复 2018-02-01

Ailubby

请问方法一,可以把表格的数据提交到后台么?
我现在想在前台页面实现类似Excel的功能

 

回复 2018-01-17

  • 火狼

    不好意思啊,前段时间有点忙,可以啊,这个可以用原生操作dom的方法dom.innerHTML获取数据传输到后台

     

  • 回复 2018-01-31

cccrrr

请问,@cell-dblclick="tableDbEdit"里的tableDbEdit方法怎么写

 

回复 2018-02-01

  • 火狼

    1.方法一下面对应的方法就可以作为tableEdit的函数呢,贴上代码:

    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;};
    }

    }

    2.如果是方法二和方法三,不需要绑定tableEdit方法,不好意思,我这写的有点小问题,因为<el-input>是双向绑定数据,直接在<el-input>里面输就可以传到服务器里面去,你可以通过hover方法修改自己想要的样式

     

  • 回复 2018-02-06

牙牙

方法三控制非编辑状态的禁用么?

 

回复 2018-02-08

  • 火狼

    可以设置<input>的disabled属性控制启用状态

     

  • 回复 2018-02-24

西觉

请问用slot-scope="scope"这种方法 输入验证该怎么做?

 

回复 2018-04-25

  • 火狼

    这里有个传送门https://www.cnblogs.com/websm...

     

  • 回复 2018-05-16

明月照亮天涯

请问一下 我表头是不确定的 是循环出来的 那slot内的el-input的v-models绑定的值怎么写呢 动态的好像就做不了了 求解答

 

回复 2018-05-15

  • 火狼

    slot内的el-input的v-models也可以写成动态的呢

     

  • 回复 2018-05-16

  • 飞鸟

    请问我每一行需要定义一个model,如何来区分呢?

     

  • 回复 2018-05-17

  • 火狼

    model的对应的值可以是数组值

     

  • 回复 2018-05-17

展开显示更多

王晨

作为一个新人问一个基础的问题

      <el-table-column prop="beizhu" label="备注"><template slot-scope="scope"><el-input v-model="scope.row.beizhu" placeholder="请输入内容"></el-input></template></el-table-column>

我是这么写的,感觉没什么问题,但是点击确实可以编辑了,但是编辑完编辑下一个上一个还是空
而把template放到别的下面,这个表格反而是跟着变化的

 

回复 2018-08-15

  • 火狼

    1.是不是编辑了下一个才导致上一个内容被清空
    2.这两个问题应该是同一个原因导致的你每一个el-table-column下面的template是不是v-model了相同的值

     

  • 回复 2018-08-16

  • 王晨

    谢谢作者了,之前已经解决了,就是一些错误导致的

     

  • 回复 2018-08-16

qngyun1029

请问动态添加行里面添加验证有考虑么?不是框架自带的,需要用 tooltip,因为布局问题。

 

回复 2019-07-05

  • 火狼

    element 的 toolitip布局有啥问题呢

     

  • 回复 2019-07-08

  • qngyun1029

    我是用的默认的错误验证,所以错误提示会显示在文本框的下边,这样会导致布局不好看,所以我想知道有没有好办法通过tooltip来提示错误信息!谢谢!

     

  • 回复 2019-07-08

  • 火狼

    你可以监听 table 的 focus 事件,然后手动校验内容,tooltip 在表格上悬停做出提示,

     

  • 回复 2019-07-08

这篇关于vue+element-ui+slot-scope或原生实现可编辑表格(日历)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438662

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景