Reputation: 906
I am building a React web app that converts a text into an array. I want the user to click on the final output and be able to copy it on the clipboard.
I am following the of many websites and tutorial. I am very new to ReactJS and I don't know what's wrong with my code!
This is the function I
copyToClipboard() {
const {array} = this.state
const textToCopy = "const myArray =" + JSON.stringify(array)
textToCopy.select()
document.execCommand("copy")
this.setState({copySuccess: true})
}
The function is called by this button. The button works fine:
<button onClick={this.copyToClipboard.bind(this)} id="copy-to-clipboard" className="btn btn-normal">Copy to clipboard</button>
I think the problem is in this part of the function below, but I don't know how to fix it!
textToCopy.select()
document.execCommand("copy")
Link to the whole app + code:
https://codepen.io/Nerdifico/pen/MWKPdNX?editors=0010
Upvotes: 2
Views: 20292
Reputation: 199
export const CopyTextIcon: React.FC = () => {
function copyToClipboard() {
const tempInput = document.createElement('input')
tempInput.value = 'text'
document.body.appendChild(tempInput)
tempInput.select()
document.execCommand('copy')
document.body.removeChild(tempInput)
}
return (
<div onClick={()=>copyToClipboard('topRight')}>
<img src="/images/ic-SHARE.svg" alt="share" />
</div>
)
}
Upvotes: 0
Reputation: 293
const copyToClipboard = (content: any) => {
const el = document.createElement('textarea');
el.value = content;
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
};
Here is my solution, it contains 3 steps:
Upvotes: 7
Reputation: 777
As @Rosen mentioned you should use copy on DOM element
Something like this
<textarea
ref={(textarea) => this.textArea = textarea}
value='Some text to copy'
/>
and then in your function call it
copyToClipboard = (e) => {
this.textArea.select();
document.execCommand('copy');
};
Upvotes: 1