vue+element-ui+slot-scope或原生实现可编辑表格(日历)
你们公司的产品是不是还在做一个可编辑表格功能?
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>就可以
原文地址:https://segmentfault.com/a/1190000012554279
相关推荐
-
Vue+ElementUI: 手把手教你做一个audio组件 框架
2018-11-15
-
解决 Electron 项目在 OSX 复制和粘贴快捷键失效的问题 框架
2019-8-9
-
React编程思想 框架
2018-4-2
-
React-Native使用自定义字体文件iconfont 框架
2019-3-11
-
Vue 2.0 制作列表组件,实现分页、搜索、批量操作等 框架
2019-3-10
-
WebSocket入门 框架
2019-3-31
-
vue+element实现表格跨行或跨列合并 框架
2018-11-23
-
使用 nrm 管理前端项目 nodejs 模块 npm 安装源(registry)地址 框架
2019-5-9
-
vue项目用到的mock数据接口的两种方式 框架
2019-10-14
-
vue源码解析:nextTick 框架
2019-8-16