妙用thead封装vue组件

一、需求分析

前端常常通过element-ui的表格组件配合数据动态生成表格。有时候我们需要通过浏览器打印页面上的表格,当数据比较多,一页无法显示全的时候,会出现这样的问题:

在这里插入图片描述

通过图片可以看到,表头被截断了,而我们需要的效果是像word那样,每页都生成一个表头。

二、thead的妙用

在学习html的时候,我一直觉得table的子标签thead只是一个语义化标签,只是起到了加粗文字的效果。但是事实上,thead标签的一个关键用法是在打印的时候,为每个页面都拼接上一个表头。

在这里插入图片描述

三、代码实践

知道了thead的这个关键用法后,我们可以动手改造一下相关代码。

思路分析:

通过检查源代码发现,element-ui为了实现表头的悬浮效果(也可能是为了方便配置),是把生成的表格的表头和表格的数据部分放在两个div中的。通过上面的介绍,为了实现每页添加表头的效果,我们需要为表格数据部分的table中添加thead标签。当然了,我们在添加了我们自己的thead后,也要把原先的表头隐藏掉。

1.复制原先的thead标签及其属性,并为表格数据部分的table添加thead
//获取element-ui动态生成的表头
let thead = document.querySelector(".el-table__header thead");

//复制属性
let theadNew = thead.cloneNode(true);

//获取表格数据部分,并把thead添加到里面
let body = document.querySelector(".el-table__body");
body.appendChild(theadNew);
2.写入mounted方法,并在$nextTick回调中获取

在mounted中获取挂载后的元素是毋庸置疑的,但是一开始我这么写的时候,是无法获取元素的,仔细想了一下, element-ui生成表格是动态的,有可能在页面元素挂载的时候,表格还未动态生成,因此获取不到。

事实上,在vue官方文档中,有这么一段话:

在这里插入图片描述

主页面挂载完毕,不代表子组件也挂载完毕,因此需要通过$nextTick()回调函数获取。

上述步骤完成后,我们可以看到如下效果:

在这里插入图片描述

3.隐藏原先的表头
<style scoped>
.el-table ::v-deep .el-table__header-wrapper table thead {
  display: none;
}
</style>

在这里插入图片描述

四、封装为组件

如果项目中其他地方也用到了打印,我们可以考虑将这个扩展功能封装成一个组件:

<script>
import { Table } from "element-ui";
export default {
  //继承table组件,并扩展
  extends: Table,
  mounted() {
    this.$nextTick(() => {
      let thead = document.querySelector(".el-table__header thead");
      let theadNew = thead.cloneNode(true);
      let body = document.querySelector(".el-table__body");
      body.appendChild(theadNew);
    });
  },
};
</script>

<style scoped>
.el-table ::v-deep .el-table__header-wrapper table thead {
  display: none;
}
</style>

在main.js中注册为全局组件

import myElTable from "@/pages/testScope/A.vue"
Vue.component('el-table-my', myElTable)

在后续的文件中,我们只需要通过 "el-table-my"标签就可以使用我们改造过的element-ui组件了。

五、总结

1.thead可以为打印的每页都添加上表头属性。

2.mounted中不一定能获取所有挂载后的元素,我们需要在$nextTick()中获取。

3.extend:扩展功能

有小伙伴有可能会把extend和mixin搞混,我的理解是:

extend 类似于继承,面向对象编程,用于在原有功能的基础上扩展功能;

mixin 类似于java中的AOP,面向切面编程,在需要的地方定义切入点切入即可。

[

欢迎您提出宝贵意见!

]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Vue 3 封装一个 table 组件,您需要做以下几步: 1. 定义组件:使用 Vue 3 的 defineComponent 函数定义组件。 2. 定义模板:使用 template 属性定义组件HTML 模板。 3. 定义数据:使用 props 属性定义组件所需的数据。 4. 定义方法:使用 methods 属性定义组件的方法。 5. 在组件使用数据和方法:在模板使用绑定和事件处理程序来使用数据和方法。 例如,下面是一个简单的 table 组件的示例: ``` import { defineComponent } from 'vue'; export default defineComponent({ name: 'MyTable', props: { rows: { type: Array, required: true } }, methods: { sort(column) { this.rows.sort((a, b) => a[column] > b[column]); } }, template: ` <table> <thead> <tr> <th v-for="column in columns" @click="sort(column)"> {{ column }} </th> </tr> </thead> <tbody> <tr v-for="row in rows"> <td v-for="column in columns"> {{ row[column] }} </td> </tr> </tbody> </table> ` }); ``` 这个组件使用了 props 来接收外部传入的 rows 数据,并使用 methods 定义了一个 sort 方法来排序 rows。在模板,使用 v-for 指令来循环遍历 rows 和 columns,并使用 @click 指令来处理点击事件,调用 sort 方法。 ### 回答2: Vue3是一款轻量级的JavaScript框架,它允许开发者构建高效且易于维护的用户界面。在Vue3,我们可以通过封装组件来实现代码的复用和模块化。现在我将用300字的篇幅来回答如何封装一个table组件。 首先,我们需要创建一个新的Vue组件,可以命名为Table。在Table组件,我们可以通过props来接收传入的属性,例如表格的数据源和列定义。 接下来,我们可以在Table组件的模板使用Vue的指令和语法来渲染表格。使用v-for指令可以遍历数据源,并根据列定义动态生成表头和表格内容。 在表头部分,我们可以遍历列定义数组,使用v-if指令来判断是否需要显示该列,并根据列定义的标题属性来渲染表头文字。 在表格内容部分,我们可以利用v-for指令循环遍历数据源,并使用列定义的字段属性来获取数据,并渲染表格内容。 在Table组件,我们还可以添加一些事件处理函数,例如点击表头可以进行排序。使用Vue的事件绑定可以实现这一功能。 此外,我们还可以为Table组件添加一些样式,并通过CSS类名动态绑定来实现外部样式的自定义。 最后,我们可以在其他Vue组件引入Table组件,并传入需要的属性值。这样就可以在应用多次使用Table组件,实现代码的复用和模块化。 总结起来,封装一个table组件可以通过创建一个Vue组件,并利用Vue的指令和语法来动态渲染表格的表头和内容。通过props来接收传入的属性值,使用事件绑定来实现一些交互功能,还可以为组件添加样式。 ### 回答3: Vue3的封装Table组件可以通过以下步骤实现: 1. 创建一个Table组件的.vue文件,命名为Table.vue。 2. 在Table.vue,定义组件的模板结构,包括表格的表头和表体。可以使用Vue3语法的`<template>`标签来编写模板。 3. 定义Table组件的props属性,以接收父组件传入的数据。可以使用Vue3语法的`<script setup>`标签来定义props。 4. 在Table.vue,使用Vue3语法的`<script setup>`标签,引入自定义的composable函数,用于获取和处理表格数据。可以使用Vue3提供的Composition API来编写composable函数。例如,可以使用`onMounted`函数来在组件挂载时获取数据,使用`computed`函数来计算表格的列数等。 5. 在Table.vue,使用Vue3语法的`<script setup>`标签,导出Table组件及其props属性。 6. 在父组件,引入Table组件,并使用`<Table :data="tableData" />`的方式传递数据给Table组件。其,tableData是父组件定义的data属性,用于存储表格数据。 7. 在父组件,可以使用`<script>`标签定义tableData属性,并赋初值。 通过以上步骤,我们可以完成Vue3Table组件封装。在实际使用,可以根据具体需求对Table组件进行进一步的功能扩展和样式优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值