React 复制文本,在很多场景能用到。但是网上一大堆,有些有兼容问题,适配以及测试麻烦。
- 方式一:copy-to-clipboard 插件
- 方式二:原生js处理
- 方式三:clipboard 插件
方式一:copy-to-clipboard 插件
安装:
npm install --save copy-to-clipboard
或
cnpm install --save copy-to-clipboard
或者
yarn add copy-to-clipboard
调用:
import React from 'react';
import copy from 'copy-to-clipboard';
import { Toast } from 'antd-mobile'; // 不需要提示 可注释
const Demo = () => {
// 复制内容
function copyCot(cot) {
copy(cot);
Toast.info('复制成功', 2, '', false); // 不需要提示 可注释
}
return (
<div onClick={() => copyCot('复制内容内容内容内容')}>复制</div>
)
};
export default Demo;
.
方式二:原生js处理
import React from 'react';
import { Toast } from 'antd-mobile';
const Demo = () => {
// 复制内容
function copyCot(cot) {
const pEle = document.createElement('p');
pEle.innerHTML = cot || '';
document.body.appendChild(pEle);
const range = document.createRange(); // 创造range
window.getSelection().removeAllRanges(); //清除页面中已有的selection
range.selectNode(pEle); // 选中需要复制的节点
window.getSelection().addRange(range); // 执行选中元素
const copyStatus = document.execCommand("Copy"); // 执行copy操作
Toast.info(copyStatus ? '复制成功' : '复制失败', 2, '', false); // 不需要提示 可注释
document.body.removeChild(pEle);
window.getSelection().removeAllRanges(); //清除页面中已有的selection
}
return (
<div
className='btn'
onClick={() => copyCot('复制内容内容内容内容')}
>复制</div>
)
};
export default Demo;
.
方式三:clipboard 插件
安装:
npm install --save clipboard
或
cnpm install --save clipboard
或者
yarn add clipboard
调用:
import React, { useEffect } from 'react';
import { Toast } from 'antd-mobile'; // 不需要提示 可注释
import Clipboard from 'clipboard';
const Demo = () => {
// 复制内容 useEffect 或者 useMemo、useCallback 处理下,防止多次创建
useEffect(() => {
const copy = new Clipboard('.copyEle');
copy.on('success', e => {
Toast.info('复制成功', 2, '', false); // 不需要提示 可注释
});
copy.on('error', function (e) {
Toast.info('复制失败', 2, '', false); // 不需要提示 可注释
});
}, [])
return (
<div
data-clipboard-text="复制内容内容内容内容"
className="copyEle"
>点击</div>
)
};
export default Demo;
差不多这三种比较实用。vue 类似差不多,改造下也能用。