vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

news2025/2/22 4:32:31

vue3.2中的<script setup>语法

在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格;

这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格:

子组件的代码:这样封装不会改变antd 官网示例参数的传递方式
<template>
<!--  v-bind处理a-table 传递过来的参数-->
  <a-table ref="KldTable" class="kld-table" v-bind="attrs">
    <!-- 处理 slots ,动态渲染插槽需要使用这种方式-->
    <template v-for="key in renderArr " #[key]="{ record, column, text, index }">

<!-- 通过这个插槽传递数据给父组件,做一些编辑提交的操作等等 -->
      <slot :name="key" :text="text" :column="column" :record="record" :index="index"></slot>
    </template>
  </a-table>
</template>

<script lang="ts">
import { ref,useSlots  } from 'vue';

import { Table } from 'ant-design-vue';
export default {
  name: "KldTable",
  setup(_, { attrs, emit }) {
// 插槽的实例
    const slots = useSlots()
    const renderArr = Object.keys(slots)
    return {
      attrs,
      listeners: emit,
      KldTable: ref(),
renderArr 
    };
  },
  components: {
    ATable: Table
  }
};
</script>

 父组件的使用:子组件全局注册了,所以父组件没有引入

<template>
    <kld-table :columns="columns" :data-source="dataSource">
        <!-- 通过columns 里面对象来遍历生成 可编辑的组件, 不能编辑序号是因为是因为没有传过去slots , 所以及时columns里面包含序号,但是由于表格组件渲染插槽没有他,所以不会序号不可编辑,通过给操作自定义一个属性,来避免渲染生成操作-->
        <template v-slot:[item.dataIndex]="{ record, text, column }" v-for="item in columns">
            <!-- 通过v-for生成 因为每个选项都需要变成input框所以用遍历,但是操作一列有自己的方式所以不需要,于是我就在操作一列无需添加插件属性slots,表示他不一样 -->
            <div :key="item.dataIndex">
                <span v-if="!record.isEdit">
                    <span v-if="item.type === 'Select'">
                        {{ getLabel(column.options, text) }}
                    </span>
                    <span v-else>
                        {{ text }}
                    </span>
                </span>
                <span v-else>
                    <a-input-number size="small" v-model:value="record[item.dataIndex]"
                        v-if="item.type === 'inputNumber'"></a-input-number>
                    <a-select v-else-if="item.type === 'Select'" v-model:value="record[item.dataIndex]">
                        <a-select-option v-for="option in column.options" :key="option.value" :value="option.value">
                            {{ option.label }}
                        </a-select-option>
                    </a-select>
                    <a-input size="small" v-else v-model:value="record[item.dataIndex]"></a-input>
                </span>
            </div>
        </template>
        <!-- 自定义表头样式 -->
        <template #headerCell="{ column }">
            <template v-if="column.dataIndex === 'ResourceName'">
                <span>
                    <smile-outlined />
                    {{ column.title }}
                </span>
            </template>
        </template>
        <!-- 自定义操作区域 -->
        <template #bodyCell="{ column, record, index }">
            <template v-if="column.dataIndex === 'operation'">
                <a-button :type="record.isEdit ? 'primary' : 'text'" @click="editPoint(record, column, index)">{{
                    record.isEdit ? '完成' : '编辑' }}</a-button>
                <span v-if="!record.isEdit">
                    <a-button type="text">详情</a-button>
                    <a-popconfirm placement="top" ok-text="确认" cancel-text="取消">
                        <template #title>
                            <p>确定删除该扫描节点?</p>
                        </template>
                        <a-button type="text">删除</a-button>
                    </a-popconfirm>
                </span>
                <span v-else>
                    <a-button type="text" @click="cancelEdit(record)">取消</a-button>
                </span>
            </template>
        </template>
    </kld-table>
</template>
<script setup lang="ts">
// import MyTable from './table.vue'
import { SmileOutlined, } from '@ant-design/icons-vue';
import { message, SelectProps } from 'ant-design-vue';

const isEdit = ref<boolean>(false)
const columns = [
    {
        title: '序号',
        dataIndex: 'numbers',
        key: 'numbers',
        width: '6%'
    },
    {
        title: '资源名称',
        dataIndex: 'ResourceName',
        slots: { customRender: 'ResourceName' }, //slots这个是重点,通过这个相当于告诉表格组件我有一个具名插槽要用,名字就是customRender后面的名字, 父组件中的useSlots插槽的实例就有这个ResourceName,下面也一样
        width: '12%'
    },
    {
        title: '资源名称IP',
        dataIndex: 'IP',
        slots: { customRender: 'IP' },
        width: '12%'
    },
    {
        title: '数据库类型',
        dataIndex: 'DatabaseType',
        slots: { customRender: 'DatabaseType' },
        width: '12%'
    },
    {
        title: '数据库名',
        dataIndex: 'Dbname',
        slots: { customRender: 'Dbname' },
        width: '12%',
    },
    {
        title: 'Select选择器',
        dataIndex: 'Username',
        slots: { customRender: 'Username' },
        width: '12%',
        type: 'Select',
        options: [] as any,
    },
    {
        title: '数字类型',
        dataIndex: 'Quantity',
        slots: { customRender: 'Quantity' },
        width: '12%',
        type: 'inputNumber'
    },
    {
        title: '操作',
        dataIndex: 'operation',
    }
]
const dataSource = ref([
    {
        numbers: 1,
        Username: '1',
        Dbname: '测试2',
        DatabaseType: '3',
        ResourceName: 'ces1',
        IP: '3333',
        Quantity: 99
    }, {
        numbers: 2,
        Username: '2',
        Dbname: '测试2',
        DatabaseType: '8900',
        ResourceName: '777',
        IP: '55',
        Quantity: 101
    }
])
//当前组件挂载时设置初始 Select选择器的下拉数据
onMounted(async () => {
    const i = columns.findIndex((ele: any) => ele.dataIndex === 'Username');
    columns[i].options = [
        {
            value: '1',
            label: '文本',
        },
        {
            value: '2',
            label: '数字',
        },
    ];
});
const editPoint = (record: any, column: any, index: any) => {
    console.log(record, 666, column, index);
    if (isEdit.value) {
        message.warning('有其他项正在编辑,请先完成');
    } else {
        // 触发显示input框
        record.isEdit = true
        isEdit.value = true
    }
}
// 取消编辑
const cancelEdit = (record: any) => {
    record.isEdit = false
    isEdit.value = false
}
// 处理下拉数据回显
const getLabel = (options: SelectProps['options'], value: string) => {
    if (options?.length !== 0 && (value || value === '0')) {
        return options.find((item) => {
            return item.value === value;
        })?.label;
    }
};
</script>

效果图如下:追加显示下拉选择器,数字,已经正常输入框

 追加效果图

父组件中的删除,详情,取消,完成,按钮功能自行发挥这里就不写具体的操作细节,父组件功能还在不断更新中

仅供参考,如果有不对的还请各位大佬指教

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

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

相关文章

【实战】Jmeter连接mongoDB数据库

作为一名测试人员&#xff0c;做接口测试难免要进行基础数据校验。Jmeter本身对mysql支持的非常好&#xff0c;但是对mongoDB、cassandra等数据库要怎么连接并校验数据呢&#xff1f;本文以mongodb为例进行说明。 一、如果你有Java基础&#xff0c;可以编写java代码访问mongo …

使用numpy创建数组

目录 一&#xff1a;使用numpy.array() 二&#xff1a;使用np.zeros() 三&#xff1a;np.full() 四&#xff1a;numpy.ones() 在Python的NumPy库中&#xff0c;有几种不同的方法可以创建数组。我们演示下不同方式创建数组的例子 一&#xff1a;使用numpy.array() np.array…

python 用bisect来管理已排序的序列

已排序的序列可以用来进行快速搜索&#xff0c;而标准库的 bisect 模块给我们提供了二分查找算法。bisect.insort 让已排序的序列保持有序 bisect 模块包含两个主要函数&#xff0c;bisect 和 insort&#xff0c;两个函数都利用二分查找算法来在有序序列中查找或插入元素。 用…

133基于matlab的智能微电网粒子群优化算法

基于matlab的智能微电网粒子群优化算法&#xff0c;输出微型燃气轮机、电网输入微网运行计划、储能运行计算。程序已调通&#xff0c;可直接运行。 133智能微电网粒子群优化算法 (xiaohongshu.com)

P9842 [ICPC2021 Nanjing R] Klee in Solitary Confinement 题解(SPJ!!!)

[ICPC2021 Nanjing R] Klee in Solitary Confinement 题面翻译 给定 n , k n,k n,k 和一个长为 n n n 的序列&#xff0c;你可以选择对区间 [ l , r ] [l, r] [l,r] 的数整体加上 k k k&#xff0c;也可以不加。最大化众数出现次数并输出。 题目描述 Since the travele…

Kali Linux保姆级教程|零基础从入门到精通,看完这一篇就够了!(附工具包)

作为一名从事网络安全的技术人员&#xff0c;不懂Kali Linux的话&#xff0c;连脚本小子都算不上。 Kali Linux预装了数百种享誉盛名的渗透工具&#xff0c;使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集&#xf…

Angular系列教程之变更检测与性能优化

文章目录 前言变更检测的原理脏检查OnPush策略 示例代码总结 前言 Angular 除了默认的变化检测机制&#xff0c;也提供了ChangeDetectionStrategy.OnPush&#xff0c;用 OnPush 可以跳过某个组件或者某个父组件以及它下面所有子组件的变化检测。 在本文中&#xff0c;我们将探…

最常见的十道面试题-反射与集合

面试题一&#xff1a;Java是值传递还是引用传递&#xff1f; Java是值传递。这意味着当将一个变量传给一个方法的时候&#xff0c;我们实际上是传递的是这个变量的的副本。 但是对于对象来说&#xff0c;我们传递的是其的副本&#xff0c;我们不可以改变对象的引用本身&#…

基于Java SSM框架实现智能停车场管理系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

Maven工程 — 继承与聚合 相关知识点详解

简介&#xff1a;这篇帖子主要讲解Maven工程中的继承与聚合的相关知识点&#xff0c;用简洁的语言和小编自己的理解&#xff0c;深入浅出的说明Maven工程的继承与聚合。 目录 1、继承 1.1 继承关系的实现 1.2 版本锁定 2、聚合 2.1 聚合方法 3、总结 1、继承 图 1-1 继承…

CORS漏洞学习

CORS漏洞属于一个协议漏洞&#xff0c;具体是由于同源策略的设置问题触发的漏洞&#xff0c;漏洞利用条件较为苛刻&#xff0c;但实战中也常见。 首先要了解同源策略 什么是同源策略&#xff1f; 同源策略是一种Web浏览器安全机制&#xff0c;旨在防止网站相互攻击。 同源策…

Angular系列教程之路由守卫

文章目录 前言路由守卫的类型CanLoadCanActivateCanActivateChildCanDeactivateResolve总结 前言 在Angular中&#xff0c;路由守卫是一个非常有用的功能&#xff0c;可以帮助我们控制用户在导航过程中的权限和访问限制。通过使用路由守卫&#xff0c;我们可以拦截导航并根据需…

使用@Slf4j后引入log,idea标红

引入Slf4j注解 idea标红Cannot resolve symbol ‘log’ 引入Lombok插件 如果在Marketplace查不到时&#xff0c;不妨关闭菜单再打开试下

STM32+HAL库驱动ADXL345传感器(SPI协议)

STM32HAL库驱动ADXL345传感器&#xff08;SPI协议&#xff09; ADXL345传感器简介实物STM32CubeMX配置SPI配置片选引脚配置串口配置 特别注意&#xff08;重点部分&#xff09;核心代码效果展示 ADXL345传感器简介 ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加…

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…

0基础学java-day27(正则表达式)

一、正则快速入门 1 为什么要学习正则表达式 package com.hspedu.regexp;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** author 林然* version 1.0* 体验正则表达式的威力&#xff0c;给我们文本处理带来哪些好处*/ public class Regexp_ {public sta…

Spark与HBase的集成与数据访问

Apache Spark和Apache HBase分别是大数据处理和分布式NoSQL数据库领域的两个重要工具。在本文中&#xff0c;将深入探讨如何在Spark中集成HBase&#xff0c;并演示如何通过Spark访问和操作HBase中的数据。将提供丰富的示例代码&#xff0c;以便更好地理解这一集成过程。 Spark…

c语言将csv文件中的XY轴数据转换为html波形图

目标&#xff1a; c语言实现一个最简化的csv转html波形图显示方案。 csv文件格式&#xff1a; 共两行数据&#xff0c;第一行是x轴数据&#xff0c;第二行是y轴数据。 csv文件名分为3段: 波形图名称&#xff0c;x轴名称&#xff0c;y轴名称。 c代码&#xff1a; int csv2html…

AP上线配置流程

AP工作模式 相应地&#xff0c;AR路由器的WLAN工作模式分为FAT AP和AC两种模式&#xff0c;不同的模式对应不同的使用场景。 FAT AP模式&#xff1a;AR路由器作为FAT AP&#xff0c;独立为用户提供WLAN接入服务&#xff0c;无线网络的配置在FAT AP上单独配置。FAT AP模式主要…