如何使用反应挂钩将 HTML 复制到剪贴板?

How to copy HTML to clipboard using react hooks?

我有一个包含 table 的部分,现在我希望用户能够将 table 的 HTML 代码复制到剪贴板。

这是我在代码沙箱上的解决方案:live demo

Js代码如下

import React, { useState, useRef } from "react";

export default function App() {
  const tableRef = useRef(null);
  const [copySuccess, setCopySuccess] = useState("");

  const copyToClipboard = (e) => {
    const code =tableRef.current.innerHTML;
    console.log('code', code);
    document.execCommand("copy");
    e.target.focus();
    setCopySuccess("Copied!");
  };

  return (
    <div className="App">
      <div ref={tableRef} className="table">
        <table>
          <thead>
            <tr>
              <th>#</th>
              <th>First Name</th>
              <th>Last Name</th>
              <th>Username</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>1</td>
              <td>Mark</td>
              <td>Otto</td>
              <td>@mdo</td>
            </tr>
          </tbody>
        </table>
      </div>

      {document.queryCommandSupported("copy") && (
        <div>
          <button onClick={copyToClipboard}>Copy</button>
          {copySuccess}
        </div>
      )}
    </div>
  );
}

很遗憾,这不是复制 HTML 代码。

我需要更改什么才能将 HTML 复制到剪贴板。?

这里有什么问题?

问题是它将 selected/highlighted 文本复制到剪贴板,因此您只需要在 运行 execCommand 之前以编程方式执行此操作。

  1. 添加隐藏输入(设置不可见和位置absolute/off-screen)
  2. 在复制函数中,将该输入的值设置为 html
  3. select 带有 select 事件的隐藏输入
  4. execCommand(‘复制’);

编辑

它可能适用于隐藏或设置显示的输入类型:none;但我依稀记得几年前我这样做时阻止了 select 事件。