React一键复制
<p> 如题,我们怎么在React或者其他的框架中实现一键复制呢,实际上实现一键复制的代码与框架无关,因为他是用的是原生的API,下面我们用React来实现一下</p><p> <span style="font-size: 16px"><strong> 效果:</strong></span></p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1459059/201912/1459059-20191220005351509-207324161.gif" alt=""></p>
<p> </p>
<p> </p>
<p> </p>
<p> <span style="font-size: 16px"><strong>核心代码:</strong></span></p>
<p> 直接将红框处改为需要复制的元素类名。(获取元素时注意一下我用的是querySelector)</p>
<p> 将该事件绑定到元素上,即可。完整代码在最下方</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1459059/201912/1459059-20191220004421200-1939237735.png" alt=""></p>
<p> <span style="font-size: 15px"><strong> 完整代码:</strong></span></p>
<p><span style="font-size: 15px"><strong> <span style="font-size: 13px">注意:Icon和message均是来自于antd组件库,如若没装antd,改成别的元素即可</span></strong></span></p>
<div class="cnblogs_code">
<pre>import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
import </span>'./App.css'<span style="color: rgba(0, 0, 0, 1)">;
import {Icon, message} from </span>'antd'<span style="color: rgba(0, 0, 0, 1)">;
class App extends React.Component{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">一键复制功能</span>
<span style="color: rgba(0, 0, 0, 1)"> copy() {
const copyEle </span>= document.querySelector('.contentText') <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取要复制的节点</span>
const range = document.createRange(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创造range</span>
window.getSelection().removeAllRanges(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除页面中已有的selection</span>
range.selectNode(copyEle); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 选中需要复制的节点</span>
window.getSelection().addRange(range); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 执行选中元素</span>
const copyStatus = document.execCommand("Copy"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 执行copy操作</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 对成功与否定进行提示</span>
<span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (copyStatus) {
message.success(</span>'复制成功'<span style="color: rgba(0, 0, 0, 1)">);
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
message.fail(</span>'复制失败'<span style="color: rgba(0, 0, 0, 1)">);
}
window.getSelection().removeAllRanges(); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清除页面中已有的selection</span>
<span style="color: rgba(0, 0, 0, 1)"> }
render() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><div className="App">
<div className="content">
<p className="contentTitle">
<<span style="color: rgba(0, 0, 0, 1)">Icon
type</span>="copy"<span style="color: rgba(0, 0, 0, 1)">
onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span>.copy}/>
</p>
<p className="contentText"><span style="color: rgba(0, 0, 0, 1)">
我是要被复制的内容啊!!!
</span></p>
</div>
</div>
<span style="color: rgba(0, 0, 0, 1)"> );
}
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> App;</pre>
</div>
<p> </p>
<p> <span style="font-size: 16px"><strong>原理:</strong></span></p>
<p><span style="font-size: 14px"> 我们来看一下具体的步骤:(具体API使用可以查阅MDN)</span></p>
<p><span style="font-size: 14px"> 1. </span>document.querySelector('.contentText') 获取需要复制的节点</p>
<p> 2. document.createRange(); 创造一个区域</p>
<p> 3. window.getSelection().removeAllRanges(); 将所有选区都清除(即被按住鼠标划中选择的部分)</p>
<p> 4. range.selectNode(copyEle); 选中区域要包含的对象</p>
<p> 5. document.execCommand("Copy"); execCommand方法允许运行命令来操纵可编辑内容区域的元素。</p>
<p> 6.判断成功与否</p>
<p> 7.window.getSelection().removeAllRanges(); 将所有选区都清除(即被按住鼠标划中选择的部分)</p>
<p> </p>
<p><span style="font-size: 14px"> </span></p>
<p><span style="font-size: 14px">通过以上的步骤,一键复制就做好啦!!</span></p>
</div>
<div id="MySignature" role="contentinfo">
语雀链接🔗https://www.yuque.com/suihangadam
归来卧占楼千尺,梦落沧波明月舟。<br><br>
来源:https://www.cnblogs.com/suihang/p/12071117.html
頁:
[1]