当前位置:   article > 正文

elementUI表格套表格,子表的实现,张三不用elementui已经不会写vue了_往el-table表格里添加子元素

往el-table表格里添加子元素

1 、不靠谱的官网示例

首先说我觉得最不靠谱的案例,就是官网的示例,你就说我要子表的实现,你可是官网啊,我要的是子表,而官网倒是清晰简洁,但最致命的问题是没有表头

 通过官网代码可知,数据里加了children,然后el-table标签上添加了:tree-props="{children: 'children', hasChildren: 'hasChildren'}" 的属性。但我的需求是子表也要有表头

2 、必须的children子数据

既然官网示例不行,为了快速开发,我希望找到一个更快速的方案或者思路。既然要实现子表,那么这个数据里的children肯定是要有的。

  1. tableData: [{
  2. id: 1,
  3. date: '2022-05-02',
  4. name: '公司1',
  5. address: '北京市海淀区上地五街'
  6. }, {
  7. id: 2,
  8. date: '2022-05-04',
  9. name: '公司2',
  10. address: '北京市海淀区上地六街'
  11. }, {
  12. id: 3,
  13. date: '2022-05-01',
  14. name: '公司3',
  15. address: '北京市海淀区上地七街',
  16. children: [{
  17. id: 31,
  18. 性别: '男',
  19. name: '张三',
  20. position: '前端开发'
  21. }, {
  22. id: 32,
  23. 性别: '男',
  24. name: '李四',
  25. position: 'java开发'
  26. }, {
  27. id: 33,
  28. 性别: '女',
  29. name: '王五',
  30. position: '测试'
  31. }]
  32. }, {
  33. id: 4,
  34. date: '2022-05-03',
  35. name: '公司4',
  36. address: '北京市海淀区上地八街'
  37. }]

3 、开始创建子表,动态插入

既然官网不提供表头,那么我就不能按照官网的实现来做了。是不是可以自己在左侧添加展开闭合的按钮呢,因为初始化的时候子表一定是闭合的。当点击左侧自定义按钮时,我们可以获取到当前父表的索引,在索引加1的地方手动插入一个一个tr 补充td,然后插入子表。而子表自然是要做一个组件啦。看到刚才公司3是有children子表数据的。

 插入子表组件:

  1. <div style="display:none;" id="subDataComponent">
  2. <sub-table :subData="subData"></sub-table>
  3. </div>

 插入方法:

  1. showSubTable(scope) {
  2. this.subData = scope.row.children || []; // 获取children数据
  3. let index = scope.$index; // 获取当前点击的父表索引
  4. let tableDom = document.querySelector('.el-table__body');
  5. var newTR = tableDom.insertRow(index + 1); // 在点击父表行的下一行插入一个tr
  6. //添加列:序号
  7. var newTD = newTR.insertCell(); // tr中插入td
  8. newTD.setAttribute('colspan', 3); // 控制列数
  9. // 将子表内容动态插入td中
  10. let subDataHTML = document.querySelector('#subDataComponent').innerHTML;
  11. newTD.innerHTML = subDataHTML;
  12. }

子表SubTable.vue内容

  1. <template>
  2. <div class="box-container">
  3. <el-table
  4. :data="newList"
  5. style="width: 100%;margin-bottom: 20px;"
  6. border>
  7. <el-table-column
  8. prop="gender"
  9. label="性别"
  10. width="180">
  11. </el-table-column>
  12. <el-table-column
  13. prop="name"
  14. label="姓名"
  15. width="180">
  16. </el-table-column>
  17. <el-table-column
  18. prop="position"
  19. label="职位">
  20. </el-table-column>
  21. </el-table>
  22. </div>
  23. </template>
  24. <script>
  25. export default {
  26. name: 'HelloWorld',
  27. props: ["subData"],
  28. watch: {
  29. subData(newValue) {
  30. this.newList = newValue;
  31. }
  32. },
  33. data () {
  34. return {
  35. newList: []
  36. }
  37. },
  38. methods: {
  39. }
  40. }
  41. </script>

看效果如下图,明明做的没有问题,但是却暂无数据,vue最常出问题的就是组件间的数据传递。但这里却不是,原因是刚刚给子组件传递,subData的数据传递给子组件还没有渲染完成,就开始获取InnerHTML,不会实现。

 普通机器执行一行代码需要0.001ms的时间,这个小子组件大概延时50ms是可以的

  1. // 将子表内容动态插入td中
  2. setTimeout(() => {
  3. let subDataHTML = document.querySelector('#subDataComponent').innerHTML;
  4. newTD.innerHTML = subDataHTML;
  5. }, 50)

看一下效果,带表头的子组件出来了

4 、组件化思想插入

但现在不流行InnerHTML了,动不动就讲究组件化,很多人不用组件,写vue不用elementui已经不会开发了,所以想个组件化思路来插入吧。这样依然可以实现,而且不需要在延迟填充了。

给子组件添加ref属性:

  1. <div style="display:none;" id="subDataComponent">
  2. <sub-table :subData="subData" ref="subDataComp"></sub-table>
  3. </div>

 插入组件:

  1. // 将子表内容动态插入td中
  2. // setTimeout(() => {
  3. // let subDataHTML = document.querySelector('#subDataComponent').innerHTML;
  4. // newTD.innerHTML = subDataHTML;
  5. // }, 50)
  6. // 组件化思路插入
  7. let subDataRef = this.$refs.subDataComp.$el;
  8. newTD.appendChild(subDataRef);

5、el-table真是一个浑身插槽的东西啊

这一步开始通过插槽的方式,使劲儿往el-table里插入子表,但官网那个例子做的真是烂啊。还是得想办法往进插子el-table。因为一旦用了elementui,你经常会碰见很多稀奇的问题,所以最好的方式就是接着用elementui,很多人如果不用elementui,已经不会写vue了,可咋办啊。

这一步不需要那个子表sub-data组件了,去掉。然后通过插入新的子el-table-column,并且重点是给el-table-column添加 type="expand"属性。并且一定要记住,你插入的这个子表,要写在其他列的前面,否则展开闭合的按钮会跑到后面去。

  1. <el-table
  2. :data="tableData"
  3. style="width: 100%;margin-bottom: 20px;"
  4. border>
  5. <el-table-column props="children" type="expand">
  6. <template slot-scope="scope">
  7. <el-table
  8. :data="scope.row.children">
  9. <el-table-column
  10. prop="gender"
  11. label="性别"
  12. width="180">
  13. </el-table-column>
  14. <el-table-column
  15. prop="name"
  16. label="姓名"
  17. width="180">
  18. </el-table-column>
  19. <el-table-column
  20. prop="position"
  21. label="职位">
  22. </el-table-column>
  23. </el-table>
  24. </template>
  25. </el-table-column>
  26. <el-table-column
  27. prop="date"
  28. label="日期"
  29. width="180">
  30. </el-table-column>
  31. <el-table-column
  32. prop="name"
  33. label="公司名"
  34. width="180">
  35. </el-table-column>
  36. <el-table-column
  37. prop="address"
  38. label="地址">
  39. </el-table-column>
  40. </el-table>

6、结语

其实要实现一个需求的方法还是很多的,不一定非要围绕着别人写好的组件,我们来使用,这样除了完成需求,却很难让自己得到提升。写专利不也是一个道理嘛,大家平时都这样做,久而久之都熟悉了,麻木了,却难以发现痛点。而善于发现痛点的那个人,就会有更多的专利思路,实现更优解。有更多的解题思路的小伙伴记得留言哦!!!

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