|
@@ -1,67 +1,67 @@
|
|
|
<!-- -->
|
|
|
<template>
|
|
|
- <div class="y-tabs">
|
|
|
- <el-table v-loading="loading" :data="tableData" @row-click="props.rowClick"
|
|
|
- @selection-change="props.selectionChange" :row-key="props.getRowKey"
|
|
|
- :border="props.border"
|
|
|
- :row-style="tableRowClassName" table-layout="auto">
|
|
|
- <!-- 默认插槽 -->
|
|
|
- <slot></slot>
|
|
|
- <template v-for="item in tableColumns" :key="item">
|
|
|
- <!-- selection || index -->
|
|
|
- <el-table-column
|
|
|
- v-bind="item"
|
|
|
- :align="item.align ?? 'center'"
|
|
|
- :reserve-selection="item.type == 'selection'"
|
|
|
- v-if="item.type == 'selection' || item.type == 'index'"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- ></el-table-column>
|
|
|
- <!-- expand 支持 tsx 语法 && 作用域插槽 (tsx > slot) -->
|
|
|
- <el-table-column v-bind="item" :align="item.align ?? 'center'" v-if="item.type === 'expand'" v-slot="scope" :show-overflow-tooltip="true">
|
|
|
- <component :is="item.render" :row="scope.row" v-if="item.render"> </component>
|
|
|
- <slot :name="item.type" :row="scope.row" v-else></slot>
|
|
|
- </el-table-column>
|
|
|
- <!-- 普通渲染 -->
|
|
|
- <el-table-column
|
|
|
- v-bind="item"
|
|
|
- :align="item.align ?? 'center'"
|
|
|
- v-if="!item.type && item.prop && item.name !== item.prop"
|
|
|
- v-slot="scope" :show-overflow-tooltip="true"
|
|
|
- >
|
|
|
- <div v-if="item.prop=='T_wait_audit'" style="color: red;">
|
|
|
- {{ scope.row[item.prop]==true?'待审核':'' }}
|
|
|
- </div>
|
|
|
- <el-tooltip v-if="item.ellipsis" effect="dark" :content="scope.row[item.prop]" placement="bottom">
|
|
|
- {{ scope.row[item.prop] }}
|
|
|
- </el-tooltip>
|
|
|
- <slot v-if="item.fixed" :name="item.fixed" :row="scope.row"></slot>
|
|
|
- </el-table-column>
|
|
|
- <!-- 自定义slot -->
|
|
|
- <el-table-column
|
|
|
- v-bind="item"
|
|
|
- :align="item.align ?? 'center'"
|
|
|
- v-if="!item.type && item.prop && item.name === item.prop"
|
|
|
- v-slot="scope" :show-overflow-tooltip="true"
|
|
|
- >
|
|
|
- <slot :name="item.prop" :row="scope.row"></slot>
|
|
|
- </el-table-column>
|
|
|
- </template>
|
|
|
- <!-- 插入表格最后一行之后的插槽 -->
|
|
|
- <template #append>
|
|
|
- <slot name="append"> </slot>
|
|
|
- </template>
|
|
|
- <!-- 表格无数据情况 -->
|
|
|
- <template #empty>
|
|
|
- <el-empty></el-empty>
|
|
|
- </template>
|
|
|
- </el-table>
|
|
|
- <!-- 分页组件 -->
|
|
|
- <div style="margin-top: 20px;">
|
|
|
- <el-pagination v-model:current-page="pageable.pageNum" v-model:page-size="pageable.pageSize"
|
|
|
- :layout="props.layout" :total="pageable.total"
|
|
|
- @size-change="handleSizeChange" @current-change="handleCurrentChange" />
|
|
|
+ <div class="y-tabs">
|
|
|
+ <el-table v-loading="loading" :data="tableData" @row-click="props.rowClick"
|
|
|
+ @selection-change="props.selectionChange" :row-key="props.getRowKey"
|
|
|
+ :border="props.border"
|
|
|
+ :row-style="tableRowClassName" table-layout="auto">
|
|
|
+ <!-- 默认插槽 -->
|
|
|
+ <slot></slot>
|
|
|
+ <template v-for="item in tableColumns" :key="item">
|
|
|
+ <!-- selection || index -->
|
|
|
+ <el-table-column
|
|
|
+ v-bind="item"
|
|
|
+ :align="item.align ?? 'center'"
|
|
|
+ :reserve-selection="item.type == 'selection'"
|
|
|
+ v-if="item.type == 'selection' || item.type == 'index'"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ ></el-table-column>
|
|
|
+ <!-- expand 支持 tsx 语法 && 作用域插槽 (tsx > slot) -->
|
|
|
+ <el-table-column v-bind="item" :align="item.align ?? 'center'" v-if="item.type === 'expand'" v-slot="scope" :show-overflow-tooltip="true">
|
|
|
+ <component :is="item.render" :row="scope.row" v-if="item.render"> </component>
|
|
|
+ <slot :name="item.type" :row="scope.row" v-else></slot>
|
|
|
+ </el-table-column>
|
|
|
+ <!-- 普通渲染 -->
|
|
|
+ <el-table-column
|
|
|
+ v-bind="item"
|
|
|
+ :align="item.align ?? 'center'"
|
|
|
+ v-if="!item.type && item.prop && item.name !== item.prop"
|
|
|
+ v-slot="scope" :show-overflow-tooltip="true"
|
|
|
+ >
|
|
|
+ <div v-if="item.prop=='T_wait_audit'" style="color: red;">
|
|
|
+ {{ scope.row[item.prop]==true?'待审核':'' }}
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ <el-tooltip v-if="item.ellipsis" effect="dark" :content="scope.row[item.prop]" placement="bottom">
|
|
|
+ {{ scope.row[item.prop] }}
|
|
|
+ </el-tooltip>
|
|
|
+ <slot v-if="item.fixed" :name="item.fixed" :row="scope.row"></slot>
|
|
|
+ </el-table-column>
|
|
|
+ <!-- 自定义slot -->
|
|
|
+ <el-table-column
|
|
|
+ v-bind="item"
|
|
|
+ :align="item.align ?? 'center'"
|
|
|
+ v-if="!item.type && item.prop && item.name === item.prop"
|
|
|
+ v-slot="scope" :show-overflow-tooltip="true"
|
|
|
+ >
|
|
|
+ <slot :name="item.prop" :row="scope.row"></slot>
|
|
|
+ </el-table-column>
|
|
|
+ </template>
|
|
|
+ <!-- 插入表格最后一行之后的插槽 -->
|
|
|
+ <template #append>
|
|
|
+ <slot name="append"> </slot>
|
|
|
+ </template>
|
|
|
+ <!-- 表格无数据情况 -->
|
|
|
+ <template #empty>
|
|
|
+ <el-empty></el-empty>
|
|
|
+ </template>
|
|
|
+ </el-table>
|
|
|
+ <!-- 分页组件 -->
|
|
|
+ <div style="margin-top: 20px;">
|
|
|
+ <el-pagination v-model:current-page="pageable.pageNum" v-model:page-size="pageable.pageSize"
|
|
|
+ :layout="props.layout" :total="pageable.total"
|
|
|
+ @size-change="handleSizeChange" @current-change="handleCurrentChange" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
@@ -70,46 +70,42 @@ import { useTable } from '@/hooks/useTable'
|
|
|
import { TableProps } from 'element-plus'
|
|
|
import { ColumnProps } from './interface/index'
|
|
|
interface ProTableProps extends Partial<Omit<TableProps<any>, 'data'>> {
|
|
|
- columns: ColumnProps[] // 列配置项
|
|
|
- requestApi: (params: any) => Promise<any> // 请求表格数据的api ==> 必传
|
|
|
- dataCallback?: (data: any) => any // 返回数据的回调函数,可以对数据进行处理 ==> 非必传
|
|
|
- title?: string // 表格标题,目前只在打印的时候用到 ==> 非必传
|
|
|
- pagination?: boolean // 是否需要分页组件 ==> 非必传(默认为true)
|
|
|
- layout?: string
|
|
|
- initParam?: any // 初始化请求参数 ==> 非必传(默认为{})
|
|
|
- border?: boolean // 是否带有纵向边框 ==> 非必传(默认为true)
|
|
|
- toolButton?: boolean // 是否显示表格功能按钮 ==> 非必传(默认为true)
|
|
|
- selectId?: string // 当表格数据多选时,所指定的 id ==> 非必传(默认为 id)
|
|
|
- displayHeader?: boolean // 是否隐藏头部
|
|
|
- rowClick?: (row: any, column: any, event: any) => void // 点击行
|
|
|
- selectionChange?: (row: any) => void // 选择函数
|
|
|
- getRowKey?: ((row: any) => string) | string // 用于优化select勾选框
|
|
|
- tableRowClassName?: (data: any) => CSSProperties
|
|
|
+ columns: ColumnProps[] // 列配置项
|
|
|
+ requestApi: (params: any) => Promise<any> // 请求表格数据的api ==> 必传
|
|
|
+ dataCallback?: (data: any) => any // 返回数据的回调函数,可以对数据进行处理 ==> 非必传
|
|
|
+ title?: string // 表格标题,目前只在打印的时候用到 ==> 非必传
|
|
|
+ pagination?: boolean // 是否需要分页组件 ==> 非必传(默认为true)
|
|
|
+ layout?: string
|
|
|
+ initParam?: any // 初始化请求参数 ==> 非必传(默认为{})
|
|
|
+ border?: boolean // 是否带有纵向边框 ==> 非必传(默认为true)
|
|
|
+ toolButton?: boolean // 是否显示表格功能按钮 ==> 非必传(默认为true)
|
|
|
+ selectId?: string // 当表格数据多选时,所指定的 id ==> 非必传(默认为 id)
|
|
|
+ displayHeader?: boolean // 是否隐藏头部
|
|
|
+ rowClick?: (row: any, column: any, event: any) => void // 点击行
|
|
|
+ selectionChange?: (row: any) => void // 选择函数
|
|
|
+ getRowKey?: ((row: any) => string) | string // 用于优化select勾选框
|
|
|
+ tableRowClassName?: (data: any) => CSSProperties
|
|
|
}
|
|
|
// 接受父组件参数,配置默认值
|
|
|
const props = withDefaults(defineProps<ProTableProps>(), {
|
|
|
- columns: () => [],//渲染表格
|
|
|
- pagination: true,
|
|
|
- // layout: 'total, prev, pager, next, jumper',
|
|
|
- layout: ' prev, pager, next',
|
|
|
- initParam: {},//请求参数
|
|
|
- border: false,
|
|
|
- toolButton: true,
|
|
|
- selectId: 'id',
|
|
|
- searchCol: () => ({ xs: 1, sm: 2, md: 2, lg: 3, xl: 4 })
|
|
|
+ columns: () => [],//渲染表格
|
|
|
+ pagination: true,
|
|
|
+ // layout: 'total, prev, pager, next, jumper',
|
|
|
+ layout: ' prev, pager, next',
|
|
|
+ initParam: {},//请求参数
|
|
|
+ border: false,
|
|
|
+ toolButton: true,
|
|
|
+ selectId: 'id',
|
|
|
+ searchCol: () => ({ xs: 1, sm: 2, md: 2, lg: 3, xl: 4 })
|
|
|
})
|
|
|
|
|
|
-watch(() =>props.columns , (toPath:any) => {
|
|
|
- console.log('表头',toPath)
|
|
|
- props.selectionChange
|
|
|
-}, {immediate:true,deep: true })
|
|
|
|
|
|
// 表格操作 Hooks
|
|
|
const { tableData, getTableList, pageable, loading, handleSizeChange, handleCurrentChange } = useTable(
|
|
|
- props.requestApi,
|
|
|
- props.initParam,
|
|
|
- props.pagination,
|
|
|
- props.dataCallback
|
|
|
+ props.requestApi,
|
|
|
+ props.initParam,
|
|
|
+ props.pagination,
|
|
|
+ props.dataCallback
|
|
|
)
|
|
|
|
|
|
getTableList()
|
|
@@ -118,24 +114,24 @@ const tableColumns = ref<ColumnProps[]>(props.columns)
|
|
|
|
|
|
//暴露方法
|
|
|
defineExpose({
|
|
|
- getTableList,tableColumns,props
|
|
|
+getTableList,tableColumns,props
|
|
|
})
|
|
|
|
|
|
</script>
|
|
|
<style lang="scss">
|
|
|
.y-tabs {
|
|
|
- background: var(--y-card-background);
|
|
|
- border-radius: var(--y-radius);
|
|
|
- margin-top: var(--y-margin);
|
|
|
+ background: var(--y-card-background);
|
|
|
+ border-radius: var(--y-radius);
|
|
|
+ margin-top: var(--y-margin);
|
|
|
|
|
|
- &-headers {
|
|
|
- border-bottom: var(--y-border);
|
|
|
- box-sizing: border-box;
|
|
|
- padding: var(--y-padding);
|
|
|
- }
|
|
|
+ &-headers {
|
|
|
+ border-bottom: var(--y-border);
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: var(--y-padding);
|
|
|
+ }
|
|
|
|
|
|
- &-item {
|
|
|
- padding: var(--y-padding);
|
|
|
- }
|
|
|
+ &-item {
|
|
|
+ padding: var(--y-padding);
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|