<template>
<JVxeTable
ref="tableRef"
toolbar
row-number
row-selection
keep-source
:height="492"
:loading="loading"
:dataSource="dataSource"
:columns="columns"
:pagination="pagination"
style="margin-top: 8px"
@pageChange="handlePageChange"
>
<template #toolbarSuffix>
<a-button @click="handleTableGet">获取数据</a-button>
</template>
</JVxeTable>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
// noinspection ES6UnusedImports
import { Popconfirm } from 'ant-design-vue';
import { JVxeColumn, JVxeTableInstance, JVxeTypes } from '/@/components/jeecg/JVxeTable/types';
import { useMessage } from '/@/hooks/web/useMessage';
import { random } from 'lodash-es';
import { buildUUID } from '/@/utils/uuid';
import { uploadUrl } from '/@/api/common/api';
const tableRef = ref<JVxeTableInstance>();
const { createMessage } = useMessage();
const loading = ref(false);
const columns = ref<JVxeColumn[]>([
{
title: '下拉框_字典表搜索',
key: 'select_dict_search',
type: JVxeTypes.selectDictSearch,
width: 200,
async: true, // 异步搜索,默认为 true
// 字典表配置信息:数据库表名,显示字段名,存储字段名
dict: 'sys_user,realname,username',
tipsContent: '请输入查询条件',
},
{
title: 'JPopup',
key: 'popup',
type: JVxeTypes.popup,
width: 180,
popupCode: 'demo',
// field: 'name,sex,age',
// orgFields: 'name,sex,age',
// destFields: 'popup,popup_sex,popup_age',
fieldConfig: [
{ source: 'name', target: 'popup' },
{ source: 'sex', target: 'popup_sex' },
{ source: 'age', target: 'popup_age' },
],
},
{
title: 'JP-性别',
key: 'popup_sex',
type: JVxeTypes.select,
dictCode: 'sex',
disabled: true,
width: 100,
},
{
title: 'JP-年龄',
key: 'popup_age',
type: JVxeTypes.normal,
width: 80,
},
{
title: '用户选择',
key: 'userSelect',
type: JVxeTypes.userSelect,
width: 240,
},
{
title: '部门选择',
key: 'departSelect',
type: JVxeTypes.departSelect,
width: 240,
},
{
title: '单选',
key: 'radio',
type: JVxeTypes.radio,
width: 130,
options: [
{ text: '男', value: '1' },
{ text: '女', value: '2' },
],
// 允许清除选择(再点一次取消选择)
allowClear: false,
},
{
title: '上传',
key: 'upload',
type: JVxeTypes.upload,
width: 180,
btnText: '点击上传',
token: true,
responseName: 'message',
action: uploadUrl,
},
{
title: '图片上传',
key: 'image',
type: JVxeTypes.image,
width: 180,
maxCount: 6,
},
{
title: '文件上传',
key: 'file',
type: JVxeTypes.file,
width: 180,
maxCount: 2,
},
{
title: '进度条',
key: 'progress',
type: JVxeTypes.progress,
minWidth: 320,
},
]);
const dataSource = ref<any[]>([]);
const pagination = reactive({
current: 1,
pageSize: 10,
pageSizeOptions: ['10', '20', '30', '100', '200'],
total: 1000,
});
randomPage(pagination.current, pagination.pageSize, true);
// 当分页参数变化时触发的事件
function handlePageChange(event) {
// 重新赋值
pagination.current = event.current;
pagination.pageSize = event.pageSize;
// 查询数据
randomPage(event.current, event.pageSize, true);
}
/** 获取值,忽略表单验证 */
function handleTableGet() {
const values = tableRef.value!.getTableData();
console.log('获取值:', { values });
createMessage.success('获取值成功,请看控制台输出');
}
/* 随机生成分页数据 */
function randomPage(current, pageSize, $loading = false) {
if ($loading) {
loading.value = true;
}
let begin = Date.now();
let values: any[] = [];
for (let i = 0; i < pageSize; i++) {
let radio = random(0, 2);
values.push({
id: buildUUID(),
select_dict_search: ['admin', '', 'jeecg'][random(0, 2)],
progress: random(0, 100),
radio: radio ? radio.toString() : null,
});
}
dataSource.value = values;
let end = Date.now();
let diff = end - begin;
if ($loading && diff < pageSize) {
setTimeout(() => (loading.value = false), pageSize - diff);
}
}
</script>