一个很小的交互功能,网上搜了一下有一个 vue3-clipboard 直接支持vue3,到github仓库看了下,原作者已经不维护这个项目了:
推荐使用 vueuse 自带的 useclipboard 功能,由 vue 团队维护,稳定性基本没问题
官网链接:useClipboard | VueUse
官网的例子如下:
import { useClipboard } from '@vueuse/core'
const source = ref('Hello')
const { text, copy, copied, isSupported } = useClipboard({ source })
<div v-if="isSupported">
<button @click='copy(source)'>
<!-- by default, `copied` will be reset in 1.5s -->
<span v-if='!copied'>Copy</span>
<span v-else>Copied!</span>
</button>
<p>
Current copied: <code>{{ text || 'none' }}</code>
</p>
</div>
<p v-else>
Your browser does not support Clipboard API
</p>
上面的例子并不具备通用性,我们实际应用肯定需要再次封装,下面给出我封装的效果,在 Table 的每一行中,有一个name提供快捷拷贝展示效果如下:
这样用图标代替复制的按钮样式会更加美观一点
在ts工具类中封装的通用拷贝方法,只需要传入要复制的参数即可:
import {Component, h} from "vue";
import Icon from '@ant-design/icons-vue';
import { useClipboard } from '@vueuse/core'
import { message } from 'ant-design-vue';
const { copy, isSupported } = useClipboard();
export function renderDesignIcon (icon: Component, conf:any=null) {
return h(Icon,conf, { component: () => h(icon,) })
}
export function handleCopy (text:string) {
if (!isSupported) {
message.error("您的浏览器不支持Clipboard API");
return;
}
copy(text);
message.success(`复制成功:${text}`);
}
然后在使用的时候,只需要在 CopyOutlined 图标的点击事件上,调用这个方法即可:
在 vue 模版中调用
CopyOutlined @click="handleCopy(text)" style="color: gray;"> </CopyOutlined>
在render函数中调用:
{
title: "应用名",
dataIndex: "applicationName",
width: '180px',
customRender: ({text, record, index, column}) => {
return h('div',{}, [
`${record.applicationName} `,
renderDesignIcon(CopyOutlined, {
style: { color: 'gray' },
onClick: () => {
handleCopy(record.applicationName)
}
})
] )
},
}