vue使用右击复制功能
使用的库xe-clipboard
右击复制的

实际使用到的库是
xe-clipboard
<template>
<div>
<vxe-table
border
show-footer
:row-config="{isCurrent: true}"
:column-config="{isCurrent: true}"
:footer-method="footerMethod"
:data="tableData"
:menu-config="menuConfig"
@menu-click="contextMenuClickEvent"
>
<vxe-column type="seq" width="60"></vxe-column>
<vxe-column field="name" title="Name" sortable></vxe-column>
<vxe-column field="sex" title="Sex"></vxe-column>
<vxe-column field="age" title="Age"></vxe-column>
<vxe-column field="address" title="Address"></vxe-column>
</vxe-table>
</div>
</template>
<script lang="ts" setup>
import {ref, reactive} from 'vue';
import {VXETable, VxeTablePropTypes, VxeColumnPropTypes, VxeTableEvents} from 'vxe-table';
import XEClipboard from 'xe-clipboard';
interface RowVO {
id: number;
name: string;
role: string;
sex: string;
age: number;
address: string;
}
const tableData = ref<RowVO[]>([
{id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'test abc'},
{id: 10002, name: 'Test2', role: 'Test', sex: 'Women', age: 22, address: 'Guangzhou'},
{id: 10003, name: 'Test3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai'},
{id: 10004, name: 'Test4', role: 'Designer', sex: 'Women', age: 36, address: 'Guangzhou'},
{id: 10005, name: 'Test5', role: 'Develop', sex: 'Women', age: 24, address: 'Shanghai'},
{id: 10006, name: 'Test6', role: 'Designer', sex: 'Man', age: 34, address: 'test abc'}
]);
const menuConfig = reactive<VxeTablePropTypes.MenuConfig<RowVO>>({
className: 'my-menus',
header: {
options: [[{code: 'exportAll', name: '导出所有.csv'}]]
},
body: {
options: [
[{code: 'copy', name: '复制', prefixIcon: 'vxe-icon-copy', className: 'my-copy-item'}],
[
{code: 'remove', name: '删除', prefixIcon: 'vxe-icon-delete-fill color-red'},
{
name: '筛选',
children: [
{code: 'clearFilter', name: '清除筛选'},
{code: 'filterSelect', name: '按所选单元格的值筛选'}
]
},
{
code: 'sort',
name: '排序',
prefixIcon: 'vxe-icon-sort color-blue',
children: [
{code: 'clearSort', name: '清除排序'},
{code: 'sortAsc', name: '升序', prefixIcon: 'vxe-icon-sort-alpha-asc color-orange'},
{code: 'sortDesc', name: '倒序', prefixIcon: 'vxe-icon-sort-alpha-desc color-orange'}
]
},
{code: 'print', name: '打印', disabled: true}
]
]
},
footer: {
options: [[{code: 'clearAll', name: '清空数据'}]]
}
});
const contextMenuClickEvent: VxeTableEvents.MenuClick<RowVO> = ({menu, row, column}) => {
switch (menu.code) {
case 'copy':
// 示例
if (row && column) {
if (XEClipboard.copy(row[column.field])) {
VXETable.modal.message({content: '已复制到剪贴板!', status: 'success'});
}
}
break;
default:
VXETable.modal.alert(`点击了 ${menu.name} 选项`);
}
};
const meanNum = (list: RowVO[], field: VxeColumnPropTypes.Field) => {
let count = 0;
list.forEach((item) => {
count += Number(item[field]);
});
return count / list.length;
};
const footerMethod: VxeTablePropTypes.FooterMethod<RowVO> = ({columns, data}) => {
return [
columns.map((column, columnIndex) => {
if (columnIndex === 0) {
return '平均';
}
if (['age', 'rate'].includes(column.field)) {
return meanNum(data, column.field);
}
return null;
})
];
};
</script>
<style lang="scss">
.my-menus {
background-color: #f8f8f9;
}
.my-menus .vxe-ctxmenu--link {
width: 200px;
}
.my-copy-item {
font-weight: 700;
font-style: oblique;
}
.color-red {
color: red;
}
.color-blue {
color: blue;
}
.color-orange {
color: orange;
}
</style>

浙公网安备 33010602011771号