In reactJS, how to copy text to clipboard?

前端 未结 21 1868
刺人心
刺人心 2020-12-02 04:43

I\'m using ReactJS and when a user clicks a link I want to copy some text to the clipboard.

I am using Chrome 52 and I do not need to support any other browsers.

相关标签:
21条回答
  • 2020-12-02 05:09

    Best solution with react hooks, no need of external libraries for that

    import React, { useState } from 'react';
    
    const MyComponent = () => {
    const [copySuccess, setCopySuccess] = useState('');
    
    // your function to copy here
    
      const copyToClipBoard = async copyMe => {
        try {
          await navigator.clipboard.writeText(copyMe);
          setCopySuccess('Copied!');
        } catch (err) {
          setCopySuccess('Failed to copy!');
        }
      };
    
    return (
     <div>
        <Button onClick={() => copyToClipBoard('some text to copy')}>
         Click here to copy
         </Button>
      // after copying see the message here
      {copySuccess}
     </div>
    )
    }

    check here for further documentation about navigator.clip board , navigator.clipboard documentation navigotor.clipboard is supported by a huge number of browser look here supported browser

    0 讨论(0)
  • 2020-12-02 05:09

    here is my code:

    import React from 'react'
    
    class CopyToClipboard extends React.Component {
    
      textArea: any
    
      copyClipBoard = () => {
        this.textArea.select()
        document.execCommand('copy')
      }
    
      render() {
        return (
          <>
            <input style={{display: 'none'}} value="TEXT TO COPY!!" type="text" ref={(textarea) => this.textArea = textarea}  />
            <div onClick={this.copyClipBoard}>
            CLICK
            </div>
          </>
    
        )
      }
    }
    
    export default CopyToClipboard
    
    0 讨论(0)
  • 2020-12-02 05:10

    I've taken a very similar approach as some of the above, but made it a little more concrete, I think. Here, a parent component will pass the url (or whatever text you want) as a prop.

    import * as React from 'react'
    
    export const CopyButton = ({ url }: any) => {
      const copyToClipboard = () => {
        const textField = document.createElement('textarea');
        textField.innerText = url;
        document.body.appendChild(textField);
        textField.select();
        document.execCommand('copy');
        textField.remove();
      };
    
      return (
        <button onClick={copyToClipboard}>
          Copy
        </button>
      );
    };
    
    0 讨论(0)
  • 2020-12-02 05:11

    You should definitely consider using a package like @Shubham above is advising, but I created a working codepen based on what you described: http://codepen.io/dtschust/pen/WGwdVN?editors=1111 . It works in my browser in chrome, perhaps you can see if there's something I did there that you missed, or if there's some extended complexity in your application that prevents this from working.

    // html
    <html>
      <body>
        <div id="container">
    
        </div>
      </body>
    </html>
    
    
    // js
    const Hello = React.createClass({
      copyToClipboard: () => {
        var textField = document.createElement('textarea')
        textField.innerText = 'foo bar baz'
        document.body.appendChild(textField)
        textField.select()
        document.execCommand('copy')
        textField.remove()
      },
      render: function () {
        return (
          <h1 onClick={this.copyToClipboard}>Click to copy some text</h1>
        )
      }
    })
    
    ReactDOM.render(
    <Hello/>,
      document.getElementById('container'))
    
    0 讨论(0)
  • 2020-12-02 05:11

    Found best way to do it. i mean the fastest way: w3school

    https://www.w3schools.com/howto/howto_js_copy_clipboard.asp

    Inside a react functional component. Create a function named handleCopy:

    function handleCopy() {
      // get the input Element ID. Save the reference into copyText
      var copyText = document.getElementById("mail")
      // select() will select all data from this input field filled  
      copyText.select()
      copyText.setSelectionRange(0, 99999)
      // execCommand() works just fine except IE 8. as w3schools mention
      document.execCommand("copy")
      // alert the copied value from text input
      alert(`Email copied: ${copyText.value} `)
    }
    
    <>
                  <input
                    readOnly
                    type="text"
                    value="exemple@email.com"
                    id="mail"
                  />
                  <button onClick={handleCopy}>Copy email</button>
    
    </>
    

    If not using React, w3schools also have one cool way to do this with tooltip included: https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_copy_clipboard2

    If using React, a cool think to do: Use a Toastify to alert the message. https://github.com/fkhadra/react-toastify This is the lib very easy to use. After installation, you may be able to change this line:

     alert(`Email copied: ${copyText.value} `)
    

    For something like:

    toast.success(`Email Copied: ${copyText.value} `)
    

    If you want to use it, dont forget to Install toastify. import ToastContainer and also toasts css:

    import { ToastContainer, toast } from "react-toastify"
    import "react-toastify/dist/ReactToastify.css"
    

    and add the toast container inside return.

    import React from "react"
    
    import { ToastContainer, toast } from "react-toastify"
    import "react-toastify/dist/ReactToastify.css"
    
    
    export default function Exemple() {
      function handleCopy() {
        var copyText = document.getElementById("mail")
        copyText.select()
        copyText.setSelectionRange(0, 99999)
        document.execCommand("copy")
        toast.success(`Hi! Now you can: ctrl+v: ${copyText.value} `)
      }
    
      return (
        <>
          <ToastContainer />
          <Container>
                    <span>E-mail</span>
                  <input
                    readOnly
                    type="text"
                    value="myemail@exemple.com"
                    id="mail"
                  />
                  <button onClick={handleCopy}>Copy Email</button>
          </Container>
        </>
      )
    }
    
    0 讨论(0)
  • 2020-12-02 05:12

    For those people who are trying to select from the DIV instead of the text field, here is the code. The code is self-explanatory but comment here if you want more information:

         import React from 'react';
         ....
    
        //set ref to your div
              setRef = (ref) => {
                // debugger; //eslint-disable-line
                this.dialogRef = ref;
              };
    
              createMarkeup = content => ({
                __html: content,
              });
    
        //following function select and copy data to the clipboard from the selected Div. 
       //Please note that it is only tested in chrome but compatibility for other browsers can be easily done
    
              copyDataToClipboard = () => {
                try {
                  const range = document.createRange();
                  const selection = window.getSelection();
                  range.selectNodeContents(this.dialogRef);
                  selection.removeAllRanges();
                  selection.addRange(range);
                  document.execCommand('copy');
                  this.showNotification('Macro copied successfully.', 'info');
                  this.props.closeMacroWindow();
                } catch (err) {
                  // console.log(err); //eslint-disable-line
                  //alert('Macro copy failed.');
                }
              };
    
                  render() {
                        return (
                            <div
                              id="macroDiv"
                              ref={(el) => {
                                this.dialogRef = el;
                              }}
                              // className={classes.paper}
                              dangerouslySetInnerHTML={this.createMarkeup(this.props.content)}
                            />
                        );
                }
    
    0 讨论(0)
提交回复
热议问题