#子传父父传子props和emits #封装的table #vue3

news2024/9/22 10:08:07

#子传父&父传子props和emits #封装的table #vue3

父组件:emits defineEmits props
子组件:
在这里插入图片描述

子组件

<template>
 <el-table v-bind="$attrs" ref="innerTableRef" v-loading="loading" border :data="tableData"
    @sort-change="handleSortChange">
<el-table-column v-for="{
      label,
      prop,
      type,
      align,
      width,
      tooltip,
      meta,
      fixed,
      reserveSelection,
      sortable,
    } in visibleColumns" :key="prop" :align="align ?? 'center'" :width="width" :label="label" :prop="prop"
      :show-overflow-tooltip="tooltip ?? true" :type="type" :fixed="fixed" :reserve-selection="reserveSelection"
      :sortable="sortable">
      <template #default="{ row, column: { rawColumnKey } }">
        <template v-if="type === 'operate'">
          <div class="flex justify-evenly">
            <slot :row="row" name="operate" />
          </div>
        </template>
        <template v-else-if="prop">
          <template v-if="type === 'radio'">
            <el-radio v-model="radioVal" class="none-label" :label="row[prop]" @input="onRadioInput(row)" />
          </template>
          <template v-else-if="type === 'link'">
            <template v-if="!meta">
              <el-link class="cell-link" type="primary"
                @click="$emit(`click${getFirstCharUpperCaseProperty(rawColumnKey)}`, row)">{{ row[prop] }}
              </el-link>
            </template>
          </template>
          <template v-else-if="type === 'tag' && meta">
            <el-tag v-if="row[prop] != null" effect="dark" :type="getMetaType(row[prop], meta, 'tag')">
              {{ getMetaLabel(row[prop], meta, 'tag') }}
            </el-tag>
          </template>
          <template v-else-if="type === 'custom'">
            <slot :name="rawColumnKey" :row="row" />
          </template>

          <span v-else>{{ row[prop] }}</span>
        </template>
      </template>
    </el-table-column>
  </el-table>
</template>


<script setup lang="ts">

const emits = defineEmits<{
  sortChange: [data: { column: any, prop: string, order: any }]
}>()
// 表格排序改变事件
function handleSortChange(data: { column: any, prop: string, order: any }) {
  emits('sortChange', data)
}


父组件

<template>
<div class="bg-white rounded-md p-2.5 shadow">
    <table-component v-model:page-index="queryParams.pageIndex" v-model:page-size="queryParams.pageSize"
      :table-config="tableData.tableConfig" :table-data="tableData.data" :loading="tableData.loading"
      :total="tableData.totalRows" @fetch="fetchData" @click-sys-uni-code="onClickCode" @sortChange="handleSortChange">

      <template #btn>
        <el-button v-permission="['production_processing:add']" :icon="Plus" type="primary" @click="onHeadEvent('add')">
          添加
        </el-button>
      </template>
      <template #operate="{ row }">
        <el-link v-permission="['production_processing:input']" :icon="View" type="primary"
          @click="onRow('input', row)">
          {{ row.set == true ? '编辑' : '录入' }}
        </el-link>
        <el-link v-permission="['production_processing:delete']" :icon="Delete" type="danger"
          @click="onRow('delete', row)">
          删除
        </el-link>
      </template>
      <template #status="{ row }">
        <template v-if="row.status == ASSEMBLY_ATATUS.PROGRRESS">
          <el-progress :text-inside="true" :stroke-width="15" :percentage="row.progressNumber" />
        </template>
        <template v-if="row.status == ASSEMBLY_ATATUS.NO">
          <el-tag effect="dark" type="danger">未开始</el-tag>
        </template>
        <template v-if="row.status == ASSEMBLY_ATATUS.COMPLETED">
          <el-tag effect="dark" type="success">已完成</el-tag>
        </template>
        <template v-if="row.status == ASSEMBLY_ATATUS.CLOSED">
          <el-tag effect="dark" type="info">已关闭</el-tag>
        </template>
      </template>

      <template #doneTimePreset="{ row }">
        {{ row.doneTimePreset }}
        <triangle border-color="red" title="超"
          v-if="dateVal(nowDate) <= dateVal(row.doneTimePreset) || dateVal(row.doneTimePreset) <= dateVal(row.doneTimeFact)" />
      </template>
      <template #doneTimeFact="{ row }">
        {{ row.doneTimeFact == '' ? '' : row.doneTimeFact.substring(0, 10) }}
        <triangle border-color="red" title="超" v-if="dateVal(nowDate) <= dateVal(row.doneTimeFact)" />
      </template>

    </table-component>
  </div>
<script setup lang="ts">
const queryParams = ref({
  fBillNo: '', //订单编号
  sysUniCode: '', //系统序列码
  fMaterialNumber: '', //物料编号
  fMaterialName: '', //物料名称
  fMaterialSpecification: '', //规格型号
  status: [] as number[], //状态 0未开始 1进行中 2已完成
  srcProjectType: null, //源项目类型 1合同 2研发 3维修
  srcSysUniCode: '', //源项目系统序列码
  pageIndex: 1,
  pageSize: 10,
  outsource: false, //是否筛选加工外协
  OrderBy: null,
  Desc: true
})
const tableData = ref({
  tableConfig: [
    {
      label: '序号',
      type: 'index',
      width: 60
    },
    {
      label: '系统序列号',
      prop: 'sysUniCode',
      type: 'link'
    },
    {
      label: '订单编号',
      prop: 'fBillNo'
    },
    {
      label: '物料编码',
      prop: 'fMaterialNumber'
    },
    {
      label: '物料名称',
      prop: 'fMaterialName'
    },
    {
      label: '规格型号',
      prop: 'fMaterialSpecification'
    },
    {
      label: '单位',
      prop: 'fUnit',
      width: '90'
    },
    {
      label: '数量',
      prop: 'fAmount',
      width: '90'
    },
    {
      label: '合格品入库数量',
      prop: 'okInStock',
      width: '130'
    },
    {
      label: '进度',
      prop: 'status',
      type: 'custom',
      width: '200'
    },
    {
      label: '当前工序',
      prop: 'currProcedure'
    },
    {
      label: '预计完成时间',
      prop: 'doneTimePreset',
      type: 'custom',
      sortable: 'custom',
    },
    {
      label: '实际完成时间',
      prop: 'doneTimeFact',
      type: 'custom',
      sortable: 'custom',
    },
    {
      label: '来源项目',
      prop: 'srcProjectType',
      type: 'tag',
      meta: {
        tagConfig: [
          {
            label: '合同项目',
            value: SOURCE_PROJECT.CONTRACT,
            type: 'primary'
          },
          {
            label: '研发项目',
            value: SOURCE_PROJECT.RESEARCH,
            type: 'warning'
          },
          {
            label: '维修项目',
            value: SOURCE_PROJECT.SERVICE,
            type: 'danger'
          }
        ]
      }
    },
    {
      label: '来源序列号',
      prop: 'srcSysUniCode'
    },
    {
      label: '操作',
      type: 'operate',
      width: 150
    }
  ],
  data: [],
  loading: false,
  totalRows: 0
})
// 排序
function handleSortChange(data: { prop: string, order: string }) {
  console.log(data, 222)
  // 有排序
  if (data.order) {
    console.log(data.prop, (data.prop === 'doneTimePreset' ? 1 : 2));
    queryParams.value.OrderBy = (data.prop === 'doneTimePreset' ? 1 : 2)
    queryParams.value.Desc = (data.order === 'descending')
  } else {
    // 没排序-使用默认排序
    queryParams.value.OrderBy = null
  }
  // 还原成第一页并重新发起请求
  queryParams.value.pageIndex = 1
  fetchData()
}


怎么说呢还是得多看多写

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

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

相关文章

鸿蒙HarmonyOS开发:如何灵活运用动画效果提升用户体验

文章目录 一、动画概述1、动画的目的 二、显式动画 (animateTo)1、接口2、参数3、AnimateParam对象说明4、示例5、效果 三、属性动画 (animation)1、接口2、参数3、AnimateParam对象说明4、系统可动画属性4、示例5、效果 一、动画概述 动画的原理是在一个时间段内&#xff0c;…

QT使用ui文件创建窗口

目录 带ui文件 添加状态栏 资源文件的使用 添加文件资源 使用文件资源 带ui文件 编辑 添加状态栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 添加状态栏ui->statusbar->addWidget(new QLab…

codeforces查看题解

文章目录 1. 步骤一&#xff1a;右键单击箭头指向位置&#xff0c;根据提示打开链接2. 步骤二&#xff1a;左键单击箭头指向位置3. 结果&#xff1a;红线上方是参考代码&#xff0c;下方是测试样例4. 补充&#xff1a;① 右边这个方框可以筛选想要查看代码的状态(Accepted、Wro…

AI在医学领域:残差扩散模型预测特发性肺纤维化 (IPF)

关键词&#xff1a; IPF 进展预测、残差扩散模型、临床信息 特发性肺纤维化&#xff08;Idiopathic Pulmonary Fibrosis&#xff0c;IPF&#xff09;是一种严重且不可逆的肺部疾病&#xff0c;它会导致肺部组织出现瘢痕和增厚&#xff0c;从而引起呼吸困难。。及时对IPF进行治…

Unity入门4——常用接口

C#中常用类和接口 DateTime&#xff1a;表示某个时刻 DateTime.Now&#xff1a;拿到系统当前时间DtaTime.TimeOfDay&#xff1a;获取此实例当天的时间 Quaternion&#xff1a;用来旋转&#xff0c;采用四元数&#xff0c;由w&#xff08;实部&#xff09;和x,y,z&#xff08;虚…

ChinaJoy 2024: 维塔士携自研游戏亮相,探讨数据驱动游戏开发

2024年7月30日,上海——全球领先的视频游戏开发公司维塔士精彩亮相第二十一届中国国际数码互动娱乐展览会(ChinaJoy),并首次公开自研游戏《唐传奇:琵琶行》DEMO试玩。在展会首日举办的2024中国游戏开发者大会(CGDC)上,来自维塔士西安工作室的执行制作人熊鹏昱受邀发表题为《维塔…

springboot的拦截器,监听器,过滤器,servlet的使用(三大组件)

目录 1. 拦截器1.1 简介1.2 使用 2. 监听器2.1 简介2.2 使用 3. 过滤器3.1 简介3.2 使用 4. servlet4.1 简介4.2 使用 5. 例子6. 心得 1. 拦截器 1.1 简介 Spring Boot 拦截器&#xff08;Interceptor&#xff09;是Spring MVC中用于在请求处理流程中执行某些操作的组件。它们…

Open3D 三维重建-Alpha Shapes (α-形状)

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.1.1函数 2.1.2参数详解 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新…

08-PCB工程文件的创建

1.创建工程文件 2.创建原理图库 3.创建PCB元件库 4.创建原理图 5.创建PCB 6.改名&#xff0c;保持和项目名一致 最后save。

uniapp获取swiper中子组件的内容高度

swiper有默认高度,如果不单独设置一个具体高度&#xff0c;swiper后面的内容将不会展示 这里展示的例子是: swiper中放有一个子组件,想要完整展示子组件的内容&#xff0c;swiper就需要获取到子组件的内容高度并设置 <!-- 注意: 这里的单位是 px,不是rpx --><swiper…

【STM32】IO口取反 | 寄存器方式 | 异或运算符 | 原理

目录 STM32 IO口取反 | 寄存器方式 | 异或运算符 | 原理1. 引言2. GPIO基础知识2.1 GPIO概述2.2 STM32的GPIO架构2.3 GPIO寄存器简介 3. GPIO引脚取反原理3.1 寄存器操作实现取反3.2 异或运算符的应用 4. 示例代码4.1 基础示例&#xff1a;LED闪烁4.2 应用实例&#xff1a;继电…

大数据面试SQL(三):每分钟在线直播人数

文章目录 每分钟在线直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计&#xff0c;前提是主播名称唯一…

【初阶数据结构题目】16.用队列实现栈

用队列实现栈 点击链接答题 思路&#xff1a; 出栈&#xff1a;找不为空的队列&#xff0c;将size-1个数据导入到另一个队列中。 入栈&#xff1a;往不为空队列里面插入数据 取栈顶元素&#xff1a; 例如&#xff1a; 两个队列&#xff1a; Q1&#xff1a;1 2 3Q2&#xff1a;…

『大模型笔记』从API到Agent:万字长文洞悉LangChain工程化设计

『大模型笔记』从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计 具体内容来自&#xff1a;从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计

Spring源码解析(30)之AOP拦截链执行过程

一、前言 在上一节中我们介绍了AOP动态代理对象的创建过程&#xff0c;并且看到了Spring AOP在生成calllBacks的时候第一个拦截器就是&#xff1a;DynamicAdvisorInterceptor&#xff0c;所以我们通过代理对象执行对应的方法的时候就如跳入到这个拦截器中&#xff0c;接下来我们…

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR 文章目录 【RISC-V设计-07】- RISC-V处理器设计K0A之CSR1.简介2.顶层设计3.端口说明4.寄存器说明5.代码设计6.总结 1.简介 控制和状态寄存器&#xff08;Control and Status Register&#xff0c;简称CSR&#xff09;是用于控制和…

使用历史版本比对法排查C++程序中的内存泄漏问题

目录 1、问题描述 2、使用Process Explorer实时查看程序的虚拟内存占用 2.1、对于内存泄漏问题&#xff0c;需要查看程序占用的虚拟内存 2.2、Windows任务管理器中看不到程序进程占用的虚拟内存&#xff0c;使用Process Explorer工具可以看到 2.3、通过Process Explorer工…

通世智库:姚力渟——第一次走进缓和医疗

2024年7月9日&#xff0c;我因工作原因&#xff0c;第一次以工作者的视角走进了位于北京市中心最具盛名的协和医院缓和医疗门诊&#xff0c;亲临现场去感受缓和医疗给患者及家属的贴心温暖和有益帮助。在此之前&#xff0c;我是一个惧怕医院&#xff0c;并时刻抱着能不去医院就…

Waterfox水狐浏览器:追求性能与隐私的64位网络探索者

大家好&#xff0c;今天电脑天空要为大家详细介绍一款基于Mozilla Firefox源代码开发的浏览器——Waterfox&#xff08;水狐浏览器&#xff09;。它专为64位系统优化&#xff0c;致力于提供更快速、更高效的浏览体验&#xff0c;并高度重视用户隐私保护。 主要特点 1. 高性能…

Stable Diffusion绘画 | 图生图-批量处理

批量处理中&#xff0c;对待处理图片的要求&#xff1a;宽高比一致 修改提示词后批量处理 调整参数&#xff1a; 确保宽高与原图一致增加一定的重绘幅度 调整提示词信息&#xff1a; 批量处理后&#xff0c;出图如下所示&#xff1a; 修改模型后批量处理 恢复提示词&#xf…