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

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.mfbz.cn/a/326148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )

一、依赖库匹配 依赖库匹配 : 依赖库由三部分组成 依赖库分组依赖库名称依赖库版本号 只有三者都对上 , 依赖库才能匹配上 , 如 dependencies {implementation androidx.appcompat:appcompat:1.3.1 }依赖库分组为 androidx.appcompat , 依赖库名称为 appcompat , 依赖库版本…

QT DAY6作业

1.学生管理系统&#xff0c;基于QT的数据库中数据表的增删改查 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句类 #include <QSqlRecord> //数据库记…

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书到手啦!

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书拿到手啦&#xff01; 近期正在报考的工信部颁发的人工智能证书还有&#xff1a; 《计算机视觉处理设计开发工程师》中级 2024年1月24日至28日-北京 《自然语言与语音处理设计开发工程师》中级 第二期 20…

定位Linux下写句柄错误问题

编写代码时发现对于以下can 写资源句柄时出现的错误不是很能分析&#xff0c;但是如果将错误码打印出来后&#xff0c;清晰了很多&#xff0c;并且还可以查看。 int Can::Write(const struct can_frame *send_frame) { int result;std::cout << "before write s_ :…

嵌入式系统采用linux系统,怎样保证实时性?

嵌入式系统采用linux系统&#xff0c;怎样保证实时性&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&am…

跨平台进程/任务管理服务——Meproc的配置

配置 Meproc的配置非常简单&#xff0c;只有以下几个配置选项。 Conf [ip: 0.0.0.0,port: 8606,log_level: debug,log_dir: /tmp,web: [ip: 127.0.0.1,port: 8606,],bootstrap_cmd: , ];ip 是 Meproc 服务监听 HTTP 请求的地址。port 是Meproc服务监听HTTP请求的端口。log_l…

操作系统详解(5.2)——信号(Signal)的题目进阶

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 操作系统详解(5.1)——信号(Signal)的相…

网络安全笔记-SQL注入

文章目录 前言一、数据库1、Information_schema2、相关函数 二、SQL注入分类1、联合查询注入&#xff08;UNION query SQL injection&#xff09;语法 2、报错注入&#xff08;Error-based SQL injection&#xff09;报错注入分类报错函数报错注入原理 3、盲注布尔型盲注&#…

kubernetes入门到进阶(6)

打破次元壁&#xff1a;容器该如何与外界互通互联 在前面的几个章节里&#xff0c;我们已经学习了容器&#xff0c;镜像&#xff0c;镜像仓库的概念和用法&#xff0c;也知道了应该如何创建镜像&#xff0c;再以容器的形式启动应用。 不过&#xff0c;用容器来运行busybox、hel…

程序员有哪些接s单的渠道?

这题我会&#xff01;程序员接单的渠道那可太多了&#xff0c;想要接到合适的单子&#xff0c;筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道&#xff0c;可以参考以下这些方向。 首先&#xff0c;程序员要对接单有一个基本的概念&#xff1a;接单渠道可以先粗…

DNS在线测试,CA证书

DNS验证方式如何验证 在线测试&#xff1a;DiG GUI - DiG Online, DiG Web Interface, DiG DNS, Google Dig, Online Dig, Dig Tool letsencrypt证书申请&#xff1a; https://letsencrypt.osfipin.com/user-0408/order/detail?id63mvyl 锐成云-管理中心 第一步&#xff1a…

EV7050AN(压控锯振荡器) 输出:LV-PECL /低相位抖动

低相位抖动18 fs类型。* 3频率范围 750MHz ~ 1100MHz1500MHz ~ 2200MH函数输出关闭(OE) /待机(ST)电源电压3.3 V类型绝对拉力范围50 10 6最小/30 10 6分钟。外形尺寸7.0 5.0 1.6 (t) mm输出LV-PECL应用程序OTN(40GbE,100GbE,400GbE)&#xff0c;高速adc和dac&#xff0c;测…

程序在FLASH中的执行效率比RAM中高?

背景 通常的说法是&#xff0c;程序在RAM中运行的效率比FLASH中的运行效率高&#xff0c;但是你见过程序在FLASH中运行比在RAM中运行效率高的芯片吗&#xff1f; 1 系统结构简介 想要了解芯片是如何取指的&#xff0c;需要对MCU系统的结构有一定的了解&#xff0c;特别是对I…

Access数据库模糊查询

Access数据库模糊查询的方法 1.使通配符: 在 Access 数据库中&#xff0c;有两种通配符可供使用&#xff0c;分别是"?"和"*"。 "?"表示匹配一个字符。 "*"表示匹配任意多个字符 1例如&#xff1a;如果要查询姓氏以"王"开…

jsonschema,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - jsonschema。 Github地址&#xff1a;https://github.com/python-jsonschema/jsonschema JSON&#xff08;JavaScript Object Notation&#xff09;是…

windows server 2019 云服务器看不见硬盘的解决方案

刚拿的windows server 服务器看不见硬盘&#xff0c;这是因为没有初始化数据盘的原因。 解决方案如下&#xff1a; 单击“服务器管理器”仪表盘。 弹出“服务器管理器”窗口&#xff0c;如图1所示。 “服务器管理器”页面右上方选择“工具 > 计算机管理”。 弹出“计算机管…

零花钱也能设计精美网页!推荐几个免费设计素材站点!

UI设计师最怕什么&#xff1f; 没有创意&#xff0c;没有灵感&#xff0c;没有思路&#xff01; 在哪里可以得到idea&#xff1f;别担心&#xff0c;往下看&#xff01; 你知道网络有多大&#xff0c;你想要什么吗&#xff1f;今天&#xff0c;我想和大家分享一些宝藏网页设…

二叉树的深度遍历

目录 深度优先遍历&#xff1a; 二叉树节点定义&#xff1a; 递归法&#xff1a; 前序 中序 后序 迭代法&#xff1a; 前序 中序 后序 迭代法&#xff08;统一写法&#xff09; 前序 中序 后序 广度优先遍历&#xff1a; 二叉树的遍历方法包括两种&#xff1a…

城市酷选模式开发(门店免单排队返利系统)

城市酷选模式开发&#xff08;门店免单排队返利系统&#xff09;【阿巴】城市酷选商城开发免单排队返利小程序搭建、城市酷选模式开发、城市酷选系统商城开发、城市酷选APP系统开发、城市酷选 每经AI快讯&#xff0c;有投资者在投资者互动平台提问&#xff1a;“以塑代钢”已成…

CXYGZL-程序员工作流,持续迭代升级中

概述 现在开源的工作流引擎&#xff0c;基本都是以BPMN.js为基础的&#xff0c;导致使用门槛过高&#xff0c;非专业人员无法驾驭。本工作流借鉴钉钉/飞书的方式&#xff0c;以低代码方式降低用户使用门槛&#xff0c;即使是普通企业用户也可以几分钟内就能搭建自己的工作流引…
最新文章