Appearance
vxeTable 配置扩展
TIP
模板的表行数据使用 vxe-table 组件渲染, 预设了一些配置,但 vxe-table 还有很多可选的属性配置,允许混合到分组配置中。
预设的表行配置
vue
<script setup lang="ts">
// 用于本地 vxe-grid 组件使用,减少配置
import {
viewVxeTableConfig,
editVxeTableConfig,
fullVxeGridProps,
} from "@qqt-product/ui";
</script>
ts
import { VxeGridProps } from "vxe-table";
export const editVxeTableConfig: VxeGridProps = {
border: true,
stripe: true,
resizable: true,
autoResize: true,
keepSource: true,
// height: 'auto',
showOverflow: true,
showHeaderOverflow: true,
columnKey: true,
highlightHoverRow: true,
size: "mini",
align: "center",
headerAlign: "center",
// data: [],
mouseConfig: {
area: true, // 是否开启单元格区域选取
extension: true, // 是否开启右下角延伸按钮
},
clipConfig: {
isCut: false,
isPaste: false,
},
keyboardConfig: {
isClip: true, // 是否开启复制粘贴功能
isEdit: true, // 是否开启单元格选择编辑
isTab: true, // 是否开启TAB键左右移动功能
isArrow: true, // 是否开启非编辑状态下,上下左右移动功能
isEnter: true, // 是否开启回车移动上下行移动
isDel: true, // 是否开启删除键功能
isMerge: true, // 是否开合并和取消合并功能
isFNR: true, // 是否开启查找和替换功能
isChecked: true, // 是否开启空格键切换复选框和单选框状态
enterToTab: false, // 是否将回车键行为改成 Tab 键行为
},
radioConfig: {
highlight: true,
},
checkboxConfig: {
highlight: true,
},
editConfig: {
trigger: "click",
mode: "row",
showStatus: true,
},
menuConfig: {
body: {
options: [
[
{ code: "FILLDOWN_CELL", name: "向下填充", visible: false },
{
code: "COPY_CELL",
name: "复制 (Ctrl+C)",
prefixIcon: "fa fa-copy",
},
// { code: 'CLEAR_CELL', name: '清除内容 (Del)' },
// { code: 'CUT_CELL', name: '剪贴 (Ctrl+X)', prefixIcon: 'fa fa-cut' },
// { code: 'PASTE_CELL', name: '粘贴 (Ctrl+V)', prefixIcon: 'fa fa-paste' }
],
// 引入 echarts 和 vxe-table-plugin-charts 之后可以直接使用,也可以自行实现
[
{
name: "创建图表",
prefixIcon: "fa fa-area-chart",
children: [
{
code: "CHART_BAR_X_AXIS",
name: "横向柱状图 - 自由选择",
prefixIcon: "fa fa-bar-chart",
},
{
code: "CHART_BAR_X_AXIS",
name: "横向柱状图 - 固定类别",
prefixIcon: "fa fa-bar-chart",
params: { category: "a" },
},
{
code: "CHART_BAR_Y_AXIS",
name: "纵向柱状图 - 自由选择",
prefixIcon: "fa fa-bar-chart",
},
{
code: "CHART_BAR_Y_AXIS",
name: "纵向柱状图 - 固定类别",
prefixIcon: "fa fa-bar-chart",
params: { category: "a" },
},
{
code: "CHART_LINE",
name: "折线图 - 自由选择",
prefixIcon: "fa fa-line-chart",
},
{
code: "CHART_LINE",
name: "折线图 - 固定类别",
prefixIcon: "fa fa-line-chart",
params: { category: "a" },
},
{
code: "CHART_PIE",
name: "饼图 - 自由选择",
prefixIcon: "fa fa-pie-chart",
},
{
code: "CHART_PIE",
name: "饼图 - 固定类别",
prefixIcon: "fa fa-pie-chart",
params: { category: "a" },
},
],
},
],
[
{
code: "PRINT_ALL",
name: "打印",
prefixIcon: "fa fa-print",
params: { columns: ["a", "b", "c", "d", "e"] },
},
{
code: "EXPORT_ALL",
name: "导出",
prefixIcon: "fa fa-download",
params: { filename: "导出数据", type: "csv" },
},
],
],
},
},
};
ts
import { VxeGridProps } from "vxe-table";
export const viewVxeTableConfig: VxeGridProps = {
border: true,
stripe: true,
resizable: true,
autoResize: true,
showOverflow: true,
keepSource: true,
showHeaderOverflow: true,
size: "mini",
height: "auto",
headerAlign: "center",
columnKey: true,
editConfig: {
trigger: "dblclick",
mode: "cell",
showStatus: true,
},
checkboxConfig: {
highlight: true,
reserve: true,
trigger: "cell",
},
toolbarConfig: {
slots: { buttons: "toolbar_buttons" },
print: true,
zoom: true,
perfect: true,
},
sortConfig: { remote: true },
clipConfig: {
isCut: false,
isPaste: false,
},
fnrConfig: {
isFind: true, //是否启用查找功能
isReplace: false,
},
mouseConfig: {
area: true, // 是否开启单元格区域选取
extension: true, // 是否开启右下角延伸按钮
},
keyboardConfig: {
isClip: true, // 是否开启复制粘贴功能
isTab: true, // 是否开启TAB键左右移动功能
isArrow: true, // 是否开启非编辑状态下,上下左右移动功能
isFNR: true, // 是否开启查找和替换功能
enterToTab: false, // 是否将回车键行为改成 Tab 键行为
},
menuConfig: {
body: {
options: [
[
{
code: "COPY_CELL",
name: "复制 (Ctrl+C)",
prefixIcon: "fa fa-copy",
},
],
// 引入 echarts 和 vxe-table-plugin-charts 之后可以直接使用,也可以自行实现
[
{
name: "创建图表",
prefixIcon: "fa fa-area-chart",
children: [
{
code: "CHART_BAR_X_AXIS",
name: "横向柱状图 - 自由选择",
prefixIcon: "fa fa-bar-chart",
},
{
code: "CHART_BAR_X_AXIS",
name: "横向柱状图 - 固定类别",
prefixIcon: "fa fa-bar-chart",
params: { category: "a" },
},
{
code: "CHART_BAR_Y_AXIS",
name: "纵向柱状图 - 自由选择",
prefixIcon: "fa fa-bar-chart",
},
{
code: "CHART_BAR_Y_AXIS",
name: "纵向柱状图 - 固定类别",
prefixIcon: "fa fa-bar-chart",
params: { category: "a" },
},
{
code: "CHART_LINE",
name: "折线图 - 自由选择",
prefixIcon: "fa fa-line-chart",
},
{
code: "CHART_LINE",
name: "折线图 - 固定类别",
prefixIcon: "fa fa-line-chart",
params: { category: "a" },
},
{
code: "CHART_PIE",
name: "饼图 - 自由选择",
prefixIcon: "fa fa-pie-chart",
},
{
code: "CHART_PIE",
name: "饼图 - 固定类别",
prefixIcon: "fa fa-pie-chart",
params: { category: "a" },
},
],
},
],
],
},
},
};
冻结表头
WARNING
当布局模板 pattern 配置为 平铺格式 tab 时,如果行内容过多滚动时表头会跟随滚动,不方便查看,通过动态设置表行高度冻结表头
vue
<script setup lang="ts">
import { ref, reactive, onBeforeMount } from "vue";
// 配置
const options = reactive<Partial<GlobalPageLayoutTypes.EditPageLayoutProps>>({
localConfig: {
groups: [
{
groupName: "询价行信息",
groupNameI18nKey: "i18n_title_RFQLineInformation",
groupCode: "purchaseEnquiryItemList",
groupType: "item",
sortOrder: "2",
extend: {
// 注: vxe-table 相关属性须配置在 vxeGridConfig 中
vxeGridConfig: {
height: 500,
rowConfig: {
height: 102,
},
},
},
},
],
},
});
onBeforeMount(() => {
// 动态获取屏幕高度
const clientHeight = document.documentElement.clientHeight;
const maxHeight = clientHeight - 314;
options.localConfig?.groups?.forEach((group) => {
if (group.groupCode === "purchaseEnquiryItemList") {
if (group.extend?.vxeGridConfig) {
group.extend.vxeGridConfig.height = maxHeight;
}
}
});
});
</script>
事件监听
TIP
编辑模板、详情模板监听的 vxe 表格绑定的事件,可根据 groupCode 区分各表行实例,其他参数可参考vxe 官方文档
vue
<template>
<div class="edit-page">
<q-edit-page-layout
ref="layoutRef"
v-bind="options"
@itemListAdd="handleItemListAdd"
@supplierAdd="handleSupplierAdd"
@customPublish="handleCustomPublish"
@back="back"
@pageBack="handlePageBack"
@vxe_keydown="handleVxeKeydown"
@vxe_headerCellClick="handleVxeHeaderCellClick"
@vxe_headerCellDblclick="handleVxeHeaderCellDblclick"
@vxe_headerCellMenu="handleVxeHeaderCellMenu"
@vxe_cellClick="handleVxeCellClick"
@vxe_cellDblclick="handleVxeCellDblclick"
@vxe_cellMenu="handleVxeCellMenu"
@vxe_footerCellClick="handleVxeFooterCellClick"
@vxe_footerCellDblclick="handleVxeFooterCellDblclick"
@vxe_footerCellMenu="handleVxeFooterCellMenu"
@vxe_radioChange="handleVxeRadioChange"
@vxe_checkboxChange="handleVxeCheckboxChange"
@vxe_checkboxAll="handleVxeCheckboxAll"
@vxe_scroll="handleVxeScroll"
@vxe_zoom="handleVxeZoom"
@vxe_custom="handleVxeCustom"
@vxe_cell_area_cut="handleGridCellAreaCut"
@vxe_cell_area_copy="handleGridCellAreaCopy"
@vxe_cell_area_paste="handleGridCellAreaPaste"
></q-edit-page-layout>
</div>
</template>
<script setup lang="tsx">
// vxe表格事件 start
// 当表格被激活且键盘被按下时会触发的事件
const handleVxeKeydown = (params: GlobalPageLayoutTypes.KeydownEventParams) => {
console.log("vxe_keydown", params);
};
// 表头单元格被点击时会触发该事件
const handleVxeHeaderCellClick = (
params: GlobalPageLayoutTypes.HeaderCellClickEventParams
) => {
console.log("vxe_headerCellClick", params);
};
// 表头单元格被双击时会触发该事件
const handleVxeHeaderCellDblclick = (
params: GlobalPageLayoutTypes.HeaderCellDblclickEventParams
) => {
console.log("vxe_headerCellDblclick", params);
};
// 只对 menu-config 配置时有效,表头单元格被鼠标右键时触发该事件
const handleVxeHeaderCellMenu = (
params: GlobalPageLayoutTypes.HeaderCellMenuEventParams
) => {
console.log("vxe_headerCellMenu", params);
};
// 单元格被点击时会触发该事件
const handleVxeCellClick = (
params: GlobalPageLayoutTypes.CellClickEventParams
) => {
console.log("vxe_cellClick", params);
};
// 单元格被双击时会触发该事件
const handleVxeCellDblclick = (
params: GlobalPageLayoutTypes.CellDblclickEventParams
) => {
console.log("vxe_cellDblclick", params);
};
// 只对 menu-config 配置时有效,单元格被鼠标右键时触发该事件
const handleVxeCellMenu = (
params: GlobalPageLayoutTypes.CellMenuEventParams
) => {
console.log("vxe_cellMenu", params);
};
// 表尾单元格被点击时会触发该事件
const handleVxeFooterCellClick = (
params: GlobalPageLayoutTypes.FooterCellClickEventParams
) => {
console.log("vxe_footerCellClick", params);
};
// 表尾单元格被双击时会触发该事件
const handleVxeFooterCellDblclick = (
params: GlobalPageLayoutTypes.FooterCellDblclickEventParams
) => {
console.log("vxe_footerCellDblclick", params);
};
// 只对 menu-config 配置时有效,表尾单元格被鼠标右键时触发该事件
const handleVxeFooterCellMenu = (
params: GlobalPageLayoutTypes.FooterCellMenuEventParams
) => {
console.log("vxe_footerCellMenu", params);
};
// 只对 type=radio 有效,当手动勾选并且值发生改变时触发的事件
const handleVxeRadioChange = (
params: GlobalPageLayoutTypes.RadioChangeEventParams
) => {
console.log("vxe_radioChange", params);
};
// 只对 type=checkbox 有效,当手动勾选并且值发生改变时触发的事件
const handleVxeCheckboxChange = (
params: GlobalPageLayoutTypes.CheckboxChangeEventParams
) => {
console.log("vxe_checkboxChange", params);
};
// 只对 type=checkbox 有效,当手动勾选全选时触发的事件
const handleVxeCheckboxAll = (
params: GlobalPageLayoutTypes.CheckboxAllEventParams
) => {
console.log("vxe_checkboxAll", params);
};
// 表格滚动时会触发该事件
const handleVxeScroll = (params: GlobalPageLayoutTypes.ScrollEventParams) => {
console.log("vxe_scroll", params);
};
// 当最大化或还原操作被手动点击时会后触发该事件
const handleVxeZoom = (params: GlobalPageLayoutTypes.ZoomEventParams) => {
console.log("vxe_zoom", params);
};
// 如果与工具栏关联,在自定义列按钮被手动点击后会触发该事件
const handleVxeCustom = (params: GlobalPageLayoutTypes.CustomEventParams) => {
console.log("vxe_custom", params);
};
// 只对 keyboard-config.isClip 配置时有效,在单元格被剪贴时会触发该事件
const handleGridCellAreaCut = (
params: GlobalPageLayoutTypes.CellAreaCutParams
) => {
console.log("cut params :>> ", params);
};
// 只对 keyboard-config.isClip 配置时有效,在单元格被复制时会触发该事件
const handleGridCellAreaCopy = (
params: GlobalPageLayoutTypes.CellAreaCopyParams
) => {
console.log("copy params :>> ", params);
};
// 只对 keyboard-config.isClip 配置时有效,在单元格被粘贴时会触发该事件
const handleGridCellAreaPaste = (
params: GlobalPageLayoutTypes.CellAreaPasteParams
) => {
console.log("paste params :>> ", params);
};
// vxe表格事件 end
</script>
vue
<template>
<div class="detail-page">
<q-detail-page-layout
ref="layoutRef"
v-bind="options"
@itemListAdd="handleItemListAdd"
@supplierAdd="handleSupplierAdd"
@customPublish="handleCustomPublish"
@back="back"
@pageBack="handlePageBack"
@vxe_keydown="handleVxeKeydown"
@vxe_headerCellClick="handleVxeHeaderCellClick"
@vxe_headerCellDblclick="handleVxeHeaderCellDblclick"
@vxe_headerCellMenu="handleVxeHeaderCellMenu"
@vxe_cellClick="handleVxeCellClick"
@vxe_cellDblclick="handleVxeCellDblclick"
@vxe_cellMenu="handleVxeCellMenu"
@vxe_footerCellClick="handleVxeFooterCellClick"
@vxe_footerCellDblclick="handleVxeFooterCellDblclick"
@vxe_footerCellMenu="handleVxeFooterCellMenu"
@vxe_radioChange="handleVxeRadioChange"
@vxe_checkboxChange="handleVxeCheckboxChange"
@vxe_checkboxAll="handleVxeCheckboxAll"
@vxe_scroll="handleVxeScroll"
@vxe_zoom="handleVxeZoom"
@vxe_custom="handleVxeCustom"
></q-detail-page-layout>
</div>
</template>
<script setup lang="tsx">
// vxe表格事件 start
// 当表格被激活且键盘被按下时会触发的事件
const handleVxeKeydown = (params: GlobalPageLayoutTypes.KeydownEventParams) => {
console.log("vxe_keydown", params);
};
// 表头单元格被点击时会触发该事件
const handleVxeHeaderCellClick = (
params: GlobalPageLayoutTypes.HeaderCellClickEventParams
) => {
console.log("vxe_headerCellClick", params);
};
// 表头单元格被双击时会触发该事件
const handleVxeHeaderCellDblclick = (
params: GlobalPageLayoutTypes.HeaderCellDblclickEventParams
) => {
console.log("vxe_headerCellDblclick", params);
};
// 只对 menu-config 配置时有效,表头单元格被鼠标右键时触发该事件
const handleVxeHeaderCellMenu = (
params: GlobalPageLayoutTypes.HeaderCellMenuEventParams
) => {
console.log("vxe_headerCellMenu", params);
};
// 单元格被点击时会触发该事件
const handleVxeCellClick = (
params: GlobalPageLayoutTypes.CellClickEventParams
) => {
console.log("vxe_cellClick", params);
};
// 单元格被双击时会触发该事件
const handleVxeCellDblclick = (
params: GlobalPageLayoutTypes.CellDblclickEventParams
) => {
console.log("vxe_cellDblclick", params);
};
// 只对 menu-config 配置时有效,单元格被鼠标右键时触发该事件
const handleVxeCellMenu = (
params: GlobalPageLayoutTypes.CellMenuEventParams
) => {
console.log("vxe_cellMenu", params);
};
// 表尾单元格被点击时会触发该事件
const handleVxeFooterCellClick = (
params: GlobalPageLayoutTypes.FooterCellClickEventParams
) => {
console.log("vxe_footerCellClick", params);
};
// 表尾单元格被双击时会触发该事件
const handleVxeFooterCellDblclick = (
params: GlobalPageLayoutTypes.FooterCellDblclickEventParams
) => {
console.log("vxe_footerCellDblclick", params);
};
// 只对 menu-config 配置时有效,表尾单元格被鼠标右键时触发该事件
const handleVxeFooterCellMenu = (
params: GlobalPageLayoutTypes.FooterCellMenuEventParams
) => {
console.log("vxe_footerCellMenu", params);
};
// 只对 type=radio 有效,当手动勾选并且值发生改变时触发的事件
const handleVxeRadioChange = (
params: GlobalPageLayoutTypes.RadioChangeEventParams
) => {
console.log("vxe_radioChange", params);
};
// 只对 type=checkbox 有效,当手动勾选并且值发生改变时触发的事件
const handleVxeCheckboxChange = (
params: GlobalPageLayoutTypes.CheckboxChangeEventParams
) => {
console.log("vxe_checkboxChange", params);
};
// 只对 type=checkbox 有效,当手动勾选全选时触发的事件
const handleVxeCheckboxAll = (
params: GlobalPageLayoutTypes.CheckboxAllEventParams
) => {
console.log("vxe_checkboxAll", params);
};
// 表格滚动时会触发该事件
const handleVxeScroll = (params: GlobalPageLayoutTypes.ScrollEventParams) => {
console.log("vxe_scroll", params);
};
// 当最大化或还原操作被手动点击时会后触发该事件
const handleVxeZoom = (params: GlobalPageLayoutTypes.ZoomEventParams) => {
console.log("vxe_zoom", params);
};
// 如果与工具栏关联,在自定义列按钮被手动点击后会触发该事件
const handleVxeCustom = (params: GlobalPageLayoutTypes.CustomEventParams) => {
console.log("vxe_custom", params);
};
// vxe表格事件 end
</script>
表行编辑规则
WARNING
注意, vxe-table 表格组件, 原 activeMethod 方法已弃用, 使用 beforeEditMethod api 方法替换
vue
<script setup lang="ts">
// 配置
const options = reactive<Partial<GlobalPageLayoutTypes.EditPageLayoutProps>>({
localConfig: {
groups: [
{
groupName: "分包信息",
groupCode: "purchaseBiddingHeadList",
groupType: "item",
sortOrder: "2",
extend: {
// 注: vxe-table 相关属性须配置在 vxeGridConfig 中
vxeGridConfig: {
editConfig: {
trigger: "click", // 点击触发编辑
mode: "row", // 行编辑模式
/**
* @description: 表行编辑规则
* @param {Object} pageData 页面所有数据, ref响应对象,注意在使用时须带上.value
* @param {Object} row 表行数据
* @param {number} rowIndex 表行索引值
* @param {Object} column 列配置
* @param {number} columnIndex 列索引
* @return {boolean} 返回布尔值, 为 true 时允许编辑
*/
beforeEditMethod(
pageData,
{ row, rowIndex, column, columnIndex }
) {
console.log("row :>> ", row);
console.log("rowIndex :>> ", rowIndex);
console.log("column :>> ", column);
console.log("columnIndex :>> ", columnIndex);
console.log("pageData :>> ", pageData.value);
if (
pageData.value.mustMaterialNumber === "0" ||
columnIndex === 2
) {
return false;
}
return true;
},
},
},
},
},
],
},
});
</script>
js
function getPageConfig ( Vue ) {
return {
ditLayout: 'tab',
tempRole: 'purchase',
examineLayout: 'tab',
groups: [
{
groupName: '分包信息',
groupNameI18nKey: 'i18n_field_zsVH_268adaad',
groupCode: 'purchaseBiddingHeadList',
groupType: 'item',
sortOrder: '2',
},
{
groupName: '分包明细',
groupNameI18nKey: 'i18n_field_zsRH_268da877',
groupCode: 'purchaseBiddingItemList',
groupType: 'item',
sortOrder: '3',
extend: {
vxeGridConfig: {
editConfig: {
trigger: 'dblclick', // 双击触发编辑
mode: 'cell', // 单元格编辑模式
/**
* @description: 表行编辑规则
* @param {Object} pageData 页面所有数据, ref响应对象,注意在使用时须带上.value
* @param {Object} row 表行数据
* @param {number} rowIndex 表行索引值
* @param {Object} column 列配置
* @param {number} columnIndex 列索引
* @return {boolean} 返回布尔值, 为 true 时允许编辑
*/
beforeEditMethod(pageData, { row, rowIndex, column, columnIndex }) {
console.log('row :>> ', row)
console.log('rowIndex :>> ', rowIndex)
console.log('column :>> ', column)
console.log('columnIndex :>> ', columnIndex)
console.log('pageData :>> ', pageData.value)
if (pageData.value.test === '1' || columnIndex === 3) {
return false
}
return true
},
},
}
}
},
],
formFields: [],
itemColumns: [],
}
单元格动态样式配置
🙌 🌰 采购协同 > 寻源协同 > 物料主数据
vue
<template>
<div class="detail-page">
<q-detail-page-layout
ref="layoutRef"
v-bind="options"
></q-detail-page-layout>
</div>
</template>
<script setup lang="tsx">
import type {
VxeColumnSlotTypes,
VxeTableDataRow,
VxeTablePropTypes,
} from "vxe-table";
// 表头动态样式配置
const headerCellStyle: VxeTablePropTypes.HeaderCellStyle<VxeTableDataRow> = ({
column,
}) => {
if (column.field === "requireDate") {
return {
backgroundColor: "#f60",
color: "#ffffff",
};
}
};
// 行动态样式配置
const rowStyle: VxeTablePropTypes.RowStyle<VxeTableDataRow> = ({
rowIndex,
}) => {
if ([2, 3, 5].includes(rowIndex)) {
return {
backgroundColor: "red",
color: "#ffffff",
};
}
};
// 单元格动态样式配置
const cellStyle: VxeTablePropTypes.CellStyle<VxeTableDataRow> = ({
row,
column,
}) => {
if (column.field === "requireQuantity") {
if (row.requireQuantity >= 300) {
return {
backgroundColor: "#187",
};
} else {
return {
backgroundColor: "#2db7f5",
};
}
}
};
// 配置
const options = reactive<Partial<GlobalPageLayoutTypes.EditPageLayoutProps>>({
// 本地页面数据配置
localConfig: {
groups: [
{
groupName: "竞价行信息",
groupCode: "purchaseEbiddingItemList",
groupType: "item",
sortOrder: "2",
extend: {
vxeGridConfig: {
headerCellStyle,
rowStyle,
cellStyle,
},
},
},
],
},
});
</script>