当前位置:   article > 正文

elementui el-table 如何为tr添加css以及在多选时限制选择数量_element table单元格css选择器

element table单元格css选择器

前言

第一次发布CSDN文章,写的不好请见谅。

首先来看一下实现的效果。

在gif中,我添加了row-click事件,所以点击tr也可以选中。下面给大家看一下代码。

代码是在element官方文档上复制下来后修改的。下面是链接:

组件 | Elementicon-default.png?t=N7T8https://element.eleme.cn/#/zh-CN/component/table%23duo-xuan

代码部分

HTML
  1. <div id="app">
  2. <template>
  3. <el-table
  4. ref="multipleTable"
  5. :data="tableData"
  6. tooltip-effect="dark"
  7. style="width: 100%"
  8. @row-click="myrowClick" //主要是这个myrowClick方法
  9. @select="mySelect" // 以及这个mySelect方法
  10. highlight-selection-row
  11. @selection-change="handleSelectionChange">
  12. <el-table-column
  13. type="selection"
  14. width="55">
  15. </el-table-column>
  16. <el-table-column
  17. label="日期"
  18. width="120">
  19. <template slot-scope="scope">{{ scope.row.date }}</template>
  20. </el-table-column>
  21. <el-table-column
  22. prop="name"
  23. label="姓名"
  24. width="120">
  25. </el-table-column>
  26. <el-table-column
  27. prop="address"
  28. label="地址"
  29. show-overflow-tooltip>
  30. </el-table-column>
  31. </el-table>
  32. <div style="margin-top: 20px">
  33. <el-button @click="toggleSelection([tableData[1], tableData[2]])">切换第二、第三行的选中状态</el-button>
  34. <el-button @click="toggleSelection()">取消选择</el-button>
  35. </div>
  36. </template>
  37. </div>
JS代码
  1. var Main = {
  2. data() {
  3. return {
  4. tableData: [
  5. {
  6. date: "2016-05-03",
  7. name: "王小虎",
  8. address: "上海市普陀区金沙江路 1518 弄"
  9. },
  10. {
  11. date: "2016-05-02",
  12. name: "王小虎",
  13. address: "上海市普陀区金沙江路 1518 弄"
  14. },
  15. {
  16. date: "2016-05-04",
  17. name: "王小虎",
  18. address: "上海市普陀区金沙江路 1518 弄"
  19. },
  20. {
  21. date: "2016-05-01",
  22. name: "王小虎",
  23. address: "上海市普陀区金沙江路 1518 弄"
  24. },
  25. {
  26. date: "2016-05-08",
  27. name: "王小虎",
  28. address: "上海市普陀区金沙江路 1518 弄"
  29. },
  30. {
  31. date: "2016-05-06",
  32. name: "王小虎",
  33. address: "上海市普陀区金沙江路 1518 弄"
  34. },
  35. {
  36. date: "2016-05-07",
  37. name: "王小虎",
  38. address: "上海市普陀区金沙江路 1518 弄"
  39. }
  40. ],
  41. multipleSelection: []
  42. };
  43. },
  44. methods: {
  45. toggleSelection(rows) {
  46. if (rows) {
  47. rows.forEach((row) => {
  48. this.$refs.multipleTable.toggleRowSelection(row);
  49. });
  50. } else {
  51. this.$refs.multipleTable.clearSelection();
  52. }
  53. },
  54. handleSelectionChange(val) {
  55. this.multipleSelection = val;
  56. },
  57. // 这个方法用于当点击tr时,触发 选中与取消选中,以及检查 选中数量是否达到阈值
  58. myrowClick(row) {
  59. // 点击
  60. this.$refs.multipleTable.toggleRowSelection(row);
  61. // 判断是否4
  62. this.checkThreeItem();
  63. },
  64. // 这个方法是当点击前面的复选框时,检查 选中数量是否达到阈值
  65. mySelect() {
  66. this.checkThreeItem();
  67. },
  68. checkThreeItem() {
  69. var selection = this.$refs.multipleTable.selection;
  70. // 判断是否4
  71. if (selection.length == 4) {
  72. selection.pop(); // 这里选择了pop元素的形式取消勾选,你也可以使用toggleRowSelection(row,false)
  73. this.redDom(); // 这个方法控制选中的tr闪烁红色背景
  74. }
  75. },
  76. // 这个方法控制选中的tr闪烁红色背景
  77. redDom() {
  78. var rowList = Array.from(
  79. this.$refs.multipleTable.$el.getElementsByClassName("el-table__row")
  80. ); // 首先将所有的tr列举出来,这里参考了 AzeShinja 的文章https://blog.csdn.net/AzeShinja/article/details/120762028
  81. var redList = new Array(); // 这里将一会需要被添加红色背景css的标签记录下来
  82. var s = rowList.filter((i) => {
  83. return i.className.includes("selection-row"); // 筛选出所有的现在已经被选中的tr
  84. });
  85. s.forEach((i) => {
  86. i.childNodes.forEach((td) => {
  87. // 这里遍历tr中的所有td, 把这些td添加到redList数组
  88. redList.push(td);
  89. // 这里为td添加存有闪烁css的类名
  90. td.classList.add("red-background");
  91. });
  92. });
  93. console.log(redList);
  94. // 这里需要在动画结束后第一时间把所有的闪烁css类名删除,否则下次触发事件将显示不达预期
  95. // 具体如何不达预期 我就不演示了。如果不删除,则下次不会有动画效果。
  96. setTimeout(() => {
  97. redList.forEach((i) => {
  98. i.classList.remove("red-background");
  99. });
  100. }, 3000);
  101. }
  102. }
  103. };
  104. var Ctor = Vue.extend(Main);
  105. new Ctor().$mount("#app");
CSS
  1. .is-scrolling-none .el-table__body tr.selection-row>.red-background {
  2. animation: myfirst 1s 3;
  3. }
  4. @keyframes myfirst {
  5. 0% {background: #ecf5ff;}
  6. 50%{background: #ffffff;}
  7. 100% {background: rgb(255, 191, 191);}
  8. }

遇到的主要问题及解决

1. 获取table中的tr集合

  1. var rowList = Array.from(
  2. this.$refs.multipleTable.$el.getElementsByClassName("el-table__row")
  3. );

这个方法源自于csdn作者AzeShinjaVue获取el-table中某一行dom元素_el-table 点击某一行怎么获取他是第几个元素-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/AzeShinja/article/details/120762028

2. 当给td添加red-background类名之后,无效果

查看chrome之后,发现我定义的css在element定义的样式的下面,这导致css被element定义的样式覆盖掉了。

解决方法:

给red-background添加更多的父级前缀,最起码要比element定义的样式要多。

所以我这里的red-background在style中要写为

  1. .is-scrolling-none .el-table__body tr.selection-row .red-background {
  2. animation: myfirst 1s 3;
  3. }

我这里是复制了上面截图中element定义的选择器,并结合了el-table的html结构,加上了  .is-scrolling-none

3. 如何使row-select和select事件,同时保证限制选择项的数量

这里有一个逻辑问题。

select事件触发时,element就已经调用了toggleRowSelection方法。也就是说select事件中的selection是最新的selection。

但是row-click事件中,在没有调用toggleRowSelection方法时,selection是旧的selection。

所以,我在这里做了同步,不论当前选择的数量是否小于3,都在row-select中先执行toggleRowSelection。在判断加上这个tr之后是否是4,如果是4,那么就把这个tr踢出去。

我在踢这个动作里使用的是 selection.pop(),可能不是最优解,仅供参考。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/103223
推荐阅读
相关标签
  

闽ICP备14008679号