Vue3+TS项目封装一个公共的el-table组件二次封装

news2024/11/19 3:23:40

前言

支持动态传入列,列内容可以指定插槽,指定格式化显示

样式没太写,主要分享基础功能封装

效果

Table组件代码BaseTable.vue

<template>
  <el-table :data="data" border>
    <template v-for="col in columns" :key="col.prop">
      <el-table-column :prop="col.prop" :label="col.label" :width="col.width" show-overflow-tooltip>
        <template #default="{ row }">
          <slot v-if="col.slot" :name="col.slot"></slot>
          <!-- 因为这个内容不是通过表格的prop直接绑定的,所以表格自带的溢出省略号失效,自己写下 -->
          <div v-else class="text-overflow">{{ getFormatter(col, row[col.prop]) }}</div>
        </template>
      </el-table-column>
    </template>
  </el-table>
  <br>
  <template v-if="isShowPage">
    <el-pagination v-model:currentPage="currentPage1" v-model:page-size="pageSize1" :page-sizes="[10, 20, 30, 40]"
      background layout="total, sizes, prev, pager, next, jumper" :total="totalSize" @size-change="sizeChange"
      @current-change="currentChange" />
  </template>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';

export interface BaseTableConfig {
  data: any[];
  columns: TableColumn[];
  current?: number;
  pageSize?: number;
  totalSize?: number;
  [key: string]: any;
}
export interface TableColumn {
  prop?: string;
  label: string;
  slot?: string;
  width?: number;
  formatter?: Function;
  [key: string]: any;
}
const emit = defineEmits(['update:pageSize', 'update:currentPage', 'pageChange'])
const props = defineProps({
  data: {
    type: Array,
    default: () => ([])
  },
  columns: {
    type: Array<any>,
    default: () => ([])
  },
  currentPage: {
    type: Number,
    default: 1,
  },
  pageSize: {
    type: Number,
    default: 10,
  },
  totalSize: {
    type: Number,
    default: 0,
  },
  isShowPage: {
    type: Boolean,
    default: true,
  }
});
const currentPage1 = ref(props.currentPage);
const pageSize1 = ref(props.pageSize);
const getFormatter = (col: any, value: any) => {
  if (col.formatter) {
    return col.formatter(value);
  }
  return value;
}
const sizeChange = (val: number) => {
  emit('update:pageSize', val);
  emit('pageChange');
}
const currentChange = (val: number) => {
  emit('update:currentPage', val);
  emit('pageChange');
}
</script>
<style scoped>
.text-overflow {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
</style>

页面中使用组件

<template>
  <div>总条数:{{ tbConfig.totalSize }};当前页:{{ tbConfig.current }};每页条数:{{ tbConfig.pageSize }}</div>

  <BaseTable :data="tbConfig.data" :columns="tbConfig.columns" v-model:currentPage="tbConfig.current"
    v-model:pageSize="tbConfig.pageSize" :totalSize="tbConfig.totalSize" @pageChange="pageClick">
    <template #avatar="{ row }">
      这一列用插槽自定义内容{{ row?.avatar }}
    </template>
    <template #op>
      <el-button type="danger">删除</el-button>
    </template>
  </BaseTable>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { BaseTableConfig, TableColumn } from './BaseTable.vue';
import BaseTable from './BaseTable.vue';

const tbConfig: BaseTableConfig = reactive({
  data: [
    { id: 1, name: 'Ahsh', avatar: 'img1.png', ifKey: true },
    { id: 2, name: 'Rjjds', avatar: 'img2.png', ifKey: false },
    { id: 3, name: 'Ukkd特别长长长长长长长长长长的名字', avatar: 'img3.png', ifKey: true },
  ],
  columns: <TableColumn[]>[
    { prop: 'id', label: '序号', width: 100 },
    { prop: 'name', label: '名称', width: 200 },
    { prop: 'avatar', label: '图标', slot: 'avatar', width: 200 },
    { prop: 'ifKey', label: '是否开放', formatter: formatBoolean },
    { label: '操作', slot: 'op' },
  ],
  current: 1,
  pageSize: 10,
  totalSize: 0,
});

function formatBoolean(val: Boolean) {
  return val ? '是' : '否';
}

function pageClick() {
  // TODO监听到当前页或者每页条数变化,重新查询列表
  console.log('get-data');
}
</script>
<style scoped></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue+MySQL的画师约稿平台系统

系统展示 用户界面 画师界面 管理员界面 系统背景 基于SpringBootVueMySQL的画师约稿平台系统的背景&#xff0c;主要源于数字艺术行业的快速发展与画师、客户双方需求的日益增长。在传统的约稿方式中&#xff0c;往往存在沟通效率低下、交易过程不透明等问题&#xff0c;这限制…

Pandas读取某列、某行数据——loc、iloc区别

loc&#xff1a;通过行、列的名称或标签来索引 iloc&#xff1a;通过行、列的索引位置来寻找数据 首先&#xff0c;我们先创建一个DataFrame生成数据 import pandas as pddata {a:[1,2,3,4,5],b:[6,7,8,9,10],c:[11,12,13,14,15] } data pd.DataFrame(data) print(data) 运行…

IO模型---BIO、NIO、IO多路复用、AIO详解

本篇将想给详细解释一下什么是BIO、NIO、IO多路复用以及AIO~ 同步的阻塞(BIO)和非阻塞(NIO)的区别 BIO&#xff1a;线程发来IO请求后&#xff0c;一直阻塞着IO线程&#xff0c;需要缓冲区这边数据准备好之后&#xff0c;才会进行下一步的操作。 举个&#x1f330;&#xff1…

2024秋季云曦开学考

web ezezssrf 打开环境&#xff0c;代码审计 看起来有点多&#xff0c;要绕过五层 第一层&#xff1a;存在弱比较&#xff0c;使用数组或0e绕过 yunxi[]1&wlgf[]2 yunxis878926199a&wlgfs155964671a 第二层&#xff1a;存在强比较&#xff0c;此处使用string限制…

c++(继承、模板进阶)

一、模板进阶 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中…

装饰器模式decorator

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/decorator 将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为 调用过程 当你调用 encoded.writeData(salaryRecords); 时&#xff0c;控制流首先进入 CompressionDecorator 的 writeData …

微信小程序原生支持TS、LESS、SASS能力探究

文章目录 原生支持开始使用旧项目新建项目TS声明文件更新 功能说明less 使用全局变量sass 使用全局变量 可以参考原文 在之前开发小程序中&#xff0c;无法使用 less/sass 等 css 预编译语言&#xff0c;也无法使用 TS 进行开发&#xff0c;但在最新的编辑器版本中&#xff0c…

面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶&#xff0c;接下来我们将进行模版的进阶学习&#xff0c;介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或…

如何处理DDOS攻击问题

随着信息技术的飞速发展&#xff0c;网络已成为现代社会不可或缺的一部分&#xff0c;极大地便利了个人社交和商业活动。然而&#xff0c;网络空间在创造无限机遇的同时&#xff0c;也潜藏着诸多威胁&#xff0c;其中分布式拒绝服务攻击&#xff08;DDoS&#xff0c;Distribute…

利用Idea远程调试

注意&#xff1a;远程调试不要应用在正式环境中&#xff0c;即便是测试环境也只建议在开发网段使用 在实际的开发过程中&#xff0c;为了验证测试环境的一些问题&#xff0c;且问题在本地不可复现&#xff0c;可以使用远程debug的形式来进行问题定位&#xff0c;而不用循环进行…

如何使用智能合约铸造 NFT —— 以 NftMarket 合约为例

系列文章目录 使用Pinata在IPFS上存储NFT图片的实践&#x1f6aa; scaffold-eth-2使用详细教程&#x1f6aa; 文章目录 系列文章目录前言一、使用到的 OpenZeppelin 库1.1. ERC721 合约1.2. ERC721URIStorage 合约1.3. Counters 合约 二、编写合约代码2.1. 准备NFT元数据2.2. …

【重学 MySQL】二十七、七种 join 连接

【重学 MySQL】二十七、七种 join 连接 union 的使用UNION 的基本用法示例UNION ALL 的用法 七种 join 连接代码实现语法格式小结 union 的使用 UNION 在 SQL 中用于合并两个或多个 SELECT 语句的结果集&#xff0c;并默认去除重复的行。如果希望包含重复行&#xff0c;可以使…

设计模式-行为型模式-访问者模式

访问者模式难以实现&#xff0c;且应用该模式可能会导致代码可读性变差&#xff0c;可维护性变差&#xff0c;除非必要&#xff0c;不建议使用&#xff1b; 1.访问者模式定义 允许在运行时将一个或多个操作应用于一组对象&#xff0c;将操作与对象结构分离&#xff1b; 访问者…

K8s1.28 部署Dashboard获取登录信息

Kubernetes Dashboard 是一个基于 Web 的用户界面&#xff0c;用户可以通过它管理和监控 Kubernetes 集群。它提供了对容器化应用程序的概览、集群资源的状态查看、以及对服务和容器的简单操作管理。 配置 Dashboard 访问的方式&#xff1a; Kubernetes 中的服务类型默认是 C…

语音识别相关概念

声音如何保存成数字信号&#xff1f; 声音是听觉对声波产生的感知&#xff0c;而声波是一种在时间和振幅上连续的模拟量&#xff0c;本质是介质的振动&#xff0c;&#xff0c;比如空气的振动。那么只需要把这个振动信号记录下来&#xff0c;并用一串数字来表达振动信号振动的…

中学生考试成绩在线查询系统

时代在发展&#xff0c;社会在进步&#xff0c;传统的成绩发布方式已经显得力不从心了。老师们&#xff0c;是时候尝试一种更高效、更安全的成绩查询方式了。 还在为如何保护学生隐私而头疼&#xff1f;还在担心成绩的公平性和准确性&#xff1f;易查分小程序将这些这些问题都将…

vue+IntersectionObserver + scrollIntoView 实现电梯导航

一、电梯导航 电梯导航也被称为锚点导航&#xff0c;当点击锚点元素时&#xff0c;页面内相应标记的元素滚动到视口。而且页面内元素滚动时相应锚点也会高亮。电梯导航一般把锚点放在左右两侧&#xff0c;类似电梯一样。 二、scrollIntoView() 介绍 scrollIntoView() 方法会…

加密软件有哪些数据防护功能?

1.文件透明加密&#xff1a;采用透明加密技术&#xff0c;自动对指定类型的敏感文件进行实时加密&#xff0c;确保数据在存储和传输过程中的安全性。 2.权限管理与访问控制&#xff1a;通过细粒度的权限管理&#xff0c;控制员工对敏感数据的访问权限&#xff0c;包括读取、修…

基于SpringBoot+Vue的预制菜平台系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

蓝桥杯真题——数星星

输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5 输出样例&#xff1a; 1 2 1 1 0 分析&#xff1a; 根据题目&#xff0c;是逐行读入数据&#xff0c;我们要求每颗星星左下方的星星数量&#xff0c;就是要迅速求一个区间内的值 于是我们联想到树状数组来解决问题 代码演示…