在表格应用中,复制粘贴是用户最常用的操作之一。vxe-table 默认的复制行为是直接读取单元格的原始数据(即 field 绑定的字段值),粘贴时也直接写入该值。这在大多数简单场景下工作良好,但当遇到以下情况时,默认行为就不够用了:
vxe-table 提供了 copyMethod 和 pasteMethod 列配置,允许你精确控制每个单元格的复制和粘贴行为,从而轻松应对上述复杂场景。
配置说明 copyMethod 与 pasteMethod
在列定义中,通过 copyMethod 和 pasteMethod 函数可以自定义复制粘贴逻辑:
| 属性 | 类型 | 说明 |
|---|---|---|
| copyMethod | ({ row, column, cellValue, $event }) => string | 复制时调用,返回值将写入剪贴板。 |
| pasteMethod | ({ row, column, cellValue, pasteValue, $event }) => void | 粘贴时调用,用于自定义写入逻辑。 |
注意:这两个函数是列级别的,针对该列的所有单元格生效。如果需要全局控制,可以使用 clip-config 的事件监听。
常见场景示例
1. 下拉框列:复制显示文本,粘贴转换为键值
默认情况下,下拉框存储的是 value(如 '0'、'1'),但用户期望复制时看到的是 label(如 '女'、'男'),粘贴时又能自动将文本转回 value。
javascript
{
field: 'sex',
title: '性别',
editRender: sexEditRender, // 下拉框渲染器
copyMethod({ row, column }) {
const value = row[column.field]
// 将键值转为显示文本
return value === '1' ? '男' : '女'
},
pasteMethod({ row, column, pasteValue }) {
// 将粘贴的文本转回键值
row[column.field] = pasteValue === '男' ? '1' : '0'
}
}
2. 自定义插槽列:复制组合文本
当单元格通过插槽展示多行信息时,复制时可将这些信息拼接成一段有意义的文本。
javsacript
{
field: 'role',
title: '角色',
copyMethod({ row }) {
// 插槽展示的是"编号 + 职位",复制时拼接为更完整的描述
return `编号:${row.no1},职位:${row.role}`
}
}
3. 格式化数字/日期
复制时自动添加单位或格式化日期。
javascript
{
field: 'amount',
title: '金额',
copyMethod({ row }) {
return `¥${row.amount.toFixed(2)}`
},
pasteMethod({ row, pasteValue }) {
// 移除货币符号,转为数字
row.amount = parseFloat(pasteValue.replace(/[^0-9.]/g, ''))
}
}
代码
当使用自定义插槽模板或者需要自定义复制内容时会用到该方法

html
<template>
<div>
<vxe-grid v-bind="gridOptions"></vxe-grid>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const sexEditRender = reactive({
name: 'VxeSelect',
options: [
{ label: '女', value: '0' },
{ label: '男', value: '1' }
]
})
const gridOptions = reactive({
border: true,
height: 500,
showOverflow: true,
columnConfig: {
resizable: true
},
mouseConfig: {
area: true // 是否开启区域选取
},
areaConfig: {
multiple: true // 是否启用多区域选取功能
},
editConfig: {
mode: 'cell', // 单元格编辑模式
trigger: 'dblclick' // 双击单元格激活编辑状态
},
keyboardConfig: {
isAll: true, // 是否启用快捷键全选
isClip: true, // 是否开启复制粘贴
isEdit: true, // 是否开启任意键进入编辑(功能键除外)
isDel: true, // 是否开启删除键功能
isEsc: true // 是否开启Esc键关闭编辑功能
},
clipConfig: {
// isCopy: true, // 是否启用复制功能
// isCut: true, // 是否开启剪贴功能
// isPaste: true, // 是否开启粘贴功能
},
columns: [
{ type: 'seq', fixed: 'left', width: 60 },
{ field: 'name', fixed: 'left', title: '名字', editRender: { name: 'input' } },
{
field: 'role',
title: '角色',
editRender: { name: 'input' },
copyMethod({ row, column }) {
const cellValue = row[column.field]
return `角色:${cellValue}`
}
},
{
field: 'sex',
title: '性别',
editRender: sexEditRender,
copyMethod({ row, column }) {
// 对于下拉框的类型,自定义指定列的复制内容
const cellValue = row[column.field]
return cellValue ? (cellValue === '1' ? '男' : '女') : ''
},
pasteMethod({ row, column }) {
const cellValue = row[column.field]
// 对于下拉框的类型,自定义指定列粘贴逻辑
row[column.field] = cellValue ? (cellValue === '男' ? '1' : '0') : ''
}
},
{ field: 'num', title: '分数', editRender: { name: 'VxeNumberInput' } },
{ field: 'age', title: '年龄', editRender: { name: 'VxeNumberInput' } },
{ field: 'address', title: '地址', width: 200, editRender: { name: 'input' } }
],
data: [
{ id: 10001, name: '张三', role: '前端开发', sex: '0', num: 23, age: 28, address: '北京市17号' },
{ id: 10002, name: '李四', role: '测试人员', sex: '1', num: 23, age: 22, address: '江苏省27号' },
{ id: 10003, name: '老六', role: '项目经理', sex: '0', num: 23, age: 32, address: '深圳市19号' },
{ id: 10004, name: '小李', role: '后端开发', sex: '1', num: 456, age: 24, address: '江苏省47号' },
{ id: 10005, name: '老万', role: '设计师', sex: '1', num: 23, age: 42, address: '北京市18号' },
{ id: 10006, name: '小刘', role: '前端开发', sex: '0', num: 23, age: 38, address: '上海市17号' },
{ id: 10007, name: '老徐', role: '测试人员', sex: '1', num: 100, age: 24, address: '北京市19号' },
{ id: 10008, name: '老二', role: '设计师', sex: '0', num: 345, age: 34, address: '上海市11号' },
{ id: 10009, name: '小牛', role: '前端开发', sex: '1', num: 67, age: 52, address: '深圳市29号' },
{ id: 10010, name: '小帅', role: '测试人员', sex: '1', num: 23, age: 44, address: '北京市37号' },
{ id: 10011, name: '老魏', role: '后端开发', sex: '0', num: 56, age: 52, address: '深圳市12号' },
{ id: 10012, name: '小徐', role: '测试人员', sex: '1', num: 23, age: 16, address: '广州市16号' },
{ id: 10013, name: '小张', role: '设计师', sex: '1', num: 69, age: 16, address: '广州市46号' },
{ id: 10014, name: '老冯', role: '前端开发', sex: '0', num: 36, age: 36, address: '广州市66号' },
{ id: 10015, name: '小哥', role: '后端开发', sex: '0', num: 33, age: 47, address: '广州市56号' },
{ id: 10016, name: '李哥', role: '测试人员', sex: '1', num: 2, age: 42, address: '深圳市16号' }
]
})
</script>
进阶技巧
处理多区域复制
当用户同时选中多个不连续区域时,copyMethod 会按单元格逐个调用,无需额外处理。
2.与 clip-config 配合
- clipConfig.isCopyHeader:是否复制表头。
- clipConfig.copyProp:指定复制数据源(如 'text' 或 'value'),一般情况下 copyMethod 优先级更高。
通过 copyMethod 和 pasteMethod,vxe-table 提供了对复制粘贴行为列级别的精准控制。你可以