【Vue3+Vite+Ts+element-plus】 使用tsx 动态表格封装

系列文章目录

【Vue3+Vite+Ts+element-plus】
超级详细 最新 vite4+vue3+ts+element-plus+eslint-prettier 项目搭建流程
【Vue3+Vite+Ts+element-plus】使用tsx实现左侧栏菜单无限层级封装
【Ts 系列】
TypeScript 从入门到进阶之基础篇(一) ts类型篇


文章目录

  • 系列文章目录
  • 前言
  • 一、必要插件安装
    • 1.安装
    • 2.配置
  • 二、table 封装实现步骤
    • 1.创建
    • 2.封装
    • 3、使用


前言

在我们日常开发中 会经常用到表格 特别是后台管理系统 几乎大部分页面都涉及到表格,使用好的表格封装能为我们节省很多开发时间,也能让代码清晰易懂,接下来我们将从零使用tsx 二次封装一下element-plus的表格。

一、必要插件安装

我们需要创建一个vue3项目 我用的是vite去创建vue3+ts 项目的 ,这里就不多讲项目的创建了 ,如果要详细的项目搭建流程可参考:超级详细 最新 vite4+vue3+ts+element-plus+eslint-prettier 项目搭建流程
在使用tsx之前 我们要安装一些插件 使我们的项目支持tsx

1.安装

//下面3种安装方式选择一种 推荐pnpm
yarn add @vitejs/plugin-vue-jsx
//or
npm install @vitejs/plugin-vue-jsx -D
//or
pnpm install @vitejs/plugin-vue-jsx -D

2.配置

在 vite.config.ts 文件中挂载

import vueJsx from '@vitejs/plugin-vue-jsx'
export default defineConfig({plugins: [ vueJsx()]
})

tsconfig.json 文件中

{// include 需要包含tsx
"include": ["src/*", "src/**/*.vue", "src/**/*.tsx", "src/**/*.jsx", "src/**/*.ts", "src/**/*.js"],"compilerOptions": {// 在.tsx文件里支持JSX"jsx": "preserve",}
}

二、table 封装实现步骤

1.创建

首先我们在项目的 components 文件夹下 新建 DynamicTable 文件夹, 并在DynamicTable* 文件夹下新建 DynamicTable.vue文件

2.封装

在封装表格之前 我们要了解 在通常的表格中 有哪些情况会出现 例如: 表格可能涉及到分页 、可能涉及到接口的请求、也可能表格中的每一行 可内容自定义 等情况 。首先我们先将表格和分页写出来先 代码如下

<script lang="tsx">
import { ElTable } from 'element-plus'
export default {props: {//表格数据tableData: {type: Array,default: () => [],},//表格列数据tableColumns: {type: Array,default: () => [],},//表格配置项configuration: {type: Object,default: () => ({}),},//分页下拉选择pageSizes: {type: Array,default: () => [10, 20, 50, 100],},//分页组件的样式paginationLayout: {type: String,default: () => 'total,sizes,prev, pager, next,jumper',},//是否为分页按钮添加背景色background: {type: Boolean,default: true,},//请求函数request: {type: Function,default: () => {return Function},},//是否开启单选highlightCurrentRow: {type: Boolean,default: () => {return false},},//是否在打开页面时默认加载表格请求 默认为 trueisLoadRequest: {type: Boolean,default: () => {return true},},//表格勾选的数据selectedList: {type: Array,default: () => {return []},},//获取表格勾选的行数据getAllSelectedList: {type: Array,default: () => {return []},},//表格行禁用tableDisable: {type: Function,default: () => {return Function},},//分页是否只有一页时隐藏hideOnSinglePage: {type: Boolean,default: () => {return false},},//是否自定义转换isCustomConversion: {type: Boolean,default: () => {return false},},//返回转换好的数据customConversion: {type: Function,default: () => {return Function},},//是否自定义分页isCustomPage: {type: Boolean,default: () => {return false},},// 接收自定义分页返回的参数customPage: {type: Function,default: () => {return Function},},},emits: ['handleSelectionChange','update:selectedList','update:getAllSelectedList','update:tableData','getResultData','selectable',],setup(props, { slots, expose, emit }) {const singleTableRef = ref<InstanceType<typeof ElTable>>()//表格加载const loading = ref(false)const clientWidth = ref(document.documentElement.clientWidth)onMounted(() => {window.onresize = () => {return (() => {clientWidth.value = document.documentElement.clientWidth})()}})const getWidth = (width: string) => {return `${clientWidth.value * (parseInt(width) / 1440.0)}px`}//设置表格 Column/const setTableColumn = () => {return props.tableColumns.map((item: any) => {if (!item.slot) {return (<el-table-column{...item}width={item.type === 'selection' ? getWidth(item.width) : item.width}selectable={selectable}></el-table-column>)} else {return (<el-table-column{...item}selectable={selectable}width={item.slotName === 'operation'? getWidth(item.width): item.width}>{{default: (scope: any) => slots[item.slotName]?.(scope),}}</el-table-column>)}})}/*** 分页相关配置*///表格数据const tableData = ref(props.tableData as any[])//第几页const currentPage = ref(1)//每页的数量const pageSize = ref(10)//总数量const total = ref(props.tableData.length)const getData = ref({})watch(props.tableData,(nel) => {tableData.value = nel},{ deep: true },)//数据请求const refreshTable = async (datas: any = {}, reset = true) => {if (reset) {currentPage.value = 1}loading.value = truegetData.value = datastry {const { result }: any = await props.request({...datas,pageNo: props.isCustomPage ? 1 : currentPage.value,pageSize: pageSize.value,})const { totalPage }: any = result.pageInfo//判断要跳转的页是否没有了 是的话回到接口返回的最后一页if (!reset && totalPage < currentPage.value && currentPage.value > 1) {currentPage.value = totalPagerefreshTable(datas, reset)}//表格数据转换赋值tableData.value = resultemit('getResultData', result, tableData.value)//总条数赋值total.value = props.isCustomPage? props.customPage(): result.pageInfo && result.pageInfo.totalSize? Number(result.pageInfo.totalSize): 0loading.value = false} catch (err) {tableData.value = []loading.value = false}}//是否默认开启请求props.isLoadRequest ? refreshTable(getData.value) : ''onMounted(() => {getData.value = {}})//page-size 改变时触发const handleSizeChange = (val: number) => {console.log(`${val} items per page`)refreshTable(getData.value, false)}//current-page 改变时触发const handleCurrentChange = (val: number) => {console.log(`current page: ${val}`)refreshTable(getData.value, false)}//勾选事件const selectedList = ref<string[]>([])const handleSelectionChange = (val: any) => {selectedList.value = val.map((item: any) => item.id)emit('update:getAllSelectedList', val)emit('update:selectedList', selectedList.value)}const selectable = (row: any) => {return props.tableDisable(row)}//选中项高亮const tableRowClassName = ({ row }: { row: any }) => {return selectedList.value.indexOf(row.id) ? 'warning-row' : 'success-row'}/**获取页数 和每页数量 */const getPageSizeAndCurrentPage = () => {return {currentPage: currentPage.value,pageSize: pageSize.value,}}/**设置页数 和每页数量 */const setCurrentPage = (current: any) => {currentPage.value = current}const tableRowStype = () => {return {borderRadius: '15px',overflow: 'hidden',}}// 使用 expose 暴露组件内部的方法expose({refreshTable,getPageSizeAndCurrentPage,setCurrentPage,})return () => (<div class="table-style table"><el-tablemax-height="800px"ref="singleTableRef"class="custom-table"row-key="id"v-loading={loading.value}data={tableData.value}row-class-name={tableRowClassName}row-style={tableRowStype}cell-style={{ textAlign: 'center' }}onSelectionChange={handleSelectionChange}{...props.configuration}>{setTableColumn()}</el-table><el-paginationsmallv-model:current-page={currentPage.value}v-model:page-size={pageSize.value}total={total.value}highlightCurrentRow={props.highlightCurrentRow}background={props.background}layout={props.paginationLayout}onCurrentChange={handleCurrentChange}onSizeChange={handleSizeChange}popper-class="popperClass"hideOnSinglePage={props.hideOnSinglePage}></el-pagination></div>)},
}
</script>

3、使用

在需要使用的引入使用 并 创建一个ts文件用于存放列的配置即可

    <dynamic-tableref="dynamicTableRef"class="dynamic-table":request="request.listPagesBrand":tableColumns="tableColumns":isLoadRequest="false":tableDisable="selectable"><template #internal="scope">{{ scope.row.internal === 1 ? '是' : '否' }}</template><template #operation="scope"><el-buttontype="primary"link@click="editbrand(scope.row.id)":disabled="!!Number(scope.row.internal)">编辑</el-button><el-divider direction="vertical" /><delete-button:data="[scope.row.id]":request="request.delBatchBrand"@requestCallback="() => submitSearch(false)":disabled="!!Number(scope.row.internal)"type="primary"link></delete-button></template></dynamic-table>
//Table 表头定义
const tableColumns: any = [{type: 'selection',width: '70px',},{prop: 'brandName',label: '品牌',showOverflowTooltip: true,},{prop: 'englishLogo',label: '英文标识',showOverflowTooltip: true,},{slot: true,slotName: 'internal',label: '内置',showOverflowTooltip: true,},{slot: true,slotName: 'operation',width: '200px',label: '操作',},
]export default tableColumns

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

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

相关文章

论文阅读_大语言模型_Llama2

英文名称: Llama 2: Open Foundation and Fine-Tuned Chat Models 中文名称: Llama 2&#xff1a;开源的基础模型和微调的聊天模型 文章: http://arxiv.org/abs/2307.09288 代码: https://github.com/facebookresearch/llama 作者: Hugo Touvron 日期: 2023-07-19 引用次数: 11…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️…

SWC 流程

一个arxml 存储SWC &#xff08;可以存多个&#xff0c;也可以一个arxml存一个SWC&#xff09;一个arxml 存储 composition &#xff08;只能存一个&#xff09;一个arxml 存储 system description (通过import dbc自动生成system) 存储SWC和composition的arxml文件分开&#…

如何用好免费的ChatGPT

如何用好免费的ChatGPT 前言ChatGPT使用入口在线体验地址&#xff1a;点我体验 ChatGPT介绍ChatGPT初级使用技巧初级使用技巧&#xff1a;清晰明了的问题表达 ChatGPT中级使用语法中级使用语法&#xff1a;具体化问题并提供背景信息 ChatGPT高级使用高级使用&#xff1a;追问、…

安防监控系统/视频云存储/视频监控平台EasyCVR无法级联上级平台,该如何解决?

安防视频监控系统EasyCVR平台能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也…

Linux三大搜索指令的区别

find&#xff1a;可以在指定的路径下进行文件的搜索 —— 真的在磁盘文件中查找 例如find /usr/bin/ -name ls which 可以在指令路径下&#xff0c;/usr/bin,搜索指令文件 例如&#xff1a;which ls whereis:在系统特定的路径下查找&#xff0c;既可以找到可执行程序&#xff…

设计模式之观察者(发布订阅)模式

观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新自己 class Program{static void Main(string[] args){ConcreteSubject concreteSu…

字符串函数

目录 一、求字符串长度 strlen 用法&#xff1a; 注意&#xff1a; 用例&#xff1a; 二、长度不受限制的字符串函数 strcpy 用法&#xff1a; 注意&#xff1a; 用例: strcat 用法&#xff1a; 注意&#xff1a; 用例&#xff1a; strcmp 用法&#xff1a; 三…

Vue系列(三)之 基础语法下篇【事件处理,表单综合案例,组件通信】

一. 事件处理 在 Vue.js 中&#xff0c;v-on 指令被用于监听 DOM 事件&#xff0c;并在事件触发时执行相应的方法&#xff0c;这些方法就是事件处理器。v-on 指令有简写形式 &#xff0c;例如 click"handleClick" 会监听点击事件并执行 handleClick 方法。 事件处理…

1小时掌握Python操作Mysql数据库之pymysql模块技术

大家好&#xff0c;我是python222小锋老师。前段时间卷了一套 Python3零基础7天入门实战 近日锋哥又卷了一波课程&#xff0c;Python操作Mysql数据库的pymysql技术&#xff0c;文字版视频版。1小时掌握。 视频版教程 1小时掌握Python操作Mysql数据库之pymysql模块技术 文字版…

RHCSA_Linux 从命令行管理文件

目录 一、文件命令规范&#xff1a; 二、创建链接文件 1、创建软链接文件 2、创建硬链接文件 三、目录操作命令 1、创建目录 -- mkdir 2、统计目录及文件的空间占用情况 -- du 3、删除目录文件 四、创建、删除普通文件 1、创建普通文件 2、删除普通文件 五、数据流和…

golang实现远程控制主机

文章目录 ssh原理使用golang远程下发命令使用golang远程传输文件 ssh原理 说到ssh原理个人觉得解释最全的一张图是这张华为画的 Connection establishment 这一步就是建立tcp连接 version negotiation 这一步是ssh客户端(连接者)和被ssh服务端(连接者)进行协议的交换&#xf…

Redis桌面管理工具Redis Desktop Manager mac中文版功能特色

Redis Desktop Manager for Mac是一款实用的Redis可视化工具。RDM支持SSL / TLS加密&#xff0c;SSH隧道&#xff0c;基于SSH隧道的TLS&#xff0c;为您提供了一个易于使用的GUI&#xff0c;可以访问您的Redis数据库并执行一些基本操作&#xff1a;将键视为树&#xff0c;CRUD键…

Springboot整合分页插件pagehelper

首先需要有一定的springbootmybatis的基础&#xff0c;才能使用顺畅 项目结构如下 引入依赖&#xff0c;springboot版本选的是2.7.16版本&#xff0c;jdk选的17&#xff0c; <!--分页插件--> <dependency><groupId>com.github.pagehelper</groupId><…

静态通讯录

今天我们分享一下静态通讯录详细解释和代码&#xff0c;之前分享过的只是通讯录的代码&#xff0c;但是我们没有进行讲解和解释&#xff0c;今天我们一边分享它的代码一边解释原因&#xff0c;让大家可以手撕通讯录。现在开始我们的学习吧。 首先我们应该要有三个文件&#xf…

java面试题-jvm基础知识

1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&a…

计算机丢失msvcp140_1.dll的解决办法,丢失msvcp140_1.dll的原因

丢失 msvcp140_1.dll 是一个常见的错误信息&#xff0c;通常会在尝试运行某些程序时出现。msvcp140_1.dll 是一个动态链接库文件&#xff0c;它包含了许多 C标准库函数的实现&#xff0c;这些函数在许多程序中都是必需的。因此&#xff0c;如果丢失了该文件&#xff0c;程序可能…

微软最热门的10款前端开源项目!

本文来盘点微软开源的十大前端项目&#xff0c;这些项目在 Github 上获得了超过 45 万 Star&#xff01; Visual Studio Code Visual Studio Code 是一款由微软开发的开源的代码编辑器。它支持多种编程语言&#xff0c;如C、C、C#、Python、JavaScript 和 TypeScript 等&…

记一次linux下pip安装包时出错及奇怪的解决过程

一、问题说明 如图&#xff0c;在使用pip安装测速工具speedtest-cli时&#xff0c;终端提示“Externally managed environment &#xff08;从外部管理的环境&#xff09;”&#xff0c;导致无法安装该库。 二、问题解决 1 尝试提示的解决方案&#xff0c;改用命令apt inst…

c++获取当前时间的字符串

代码 void getNowTimePrefix(std::string& prefix) {std::time_t nowTime;struct tm* p new tm;std::time(&nowTime);localtime_s(p, &nowTime);int year p->tm_year 1900;int month p->tm_mon 1;int day p->tm_mday;int hour p->tm_hour;int …