react封装复制和获取粘贴板hooks

直接上代码

function useClipboard() {
    const ref = useRef(null);

    const copyToClipboard = useCallback(function (text?: string | number | null) {
      return new Promise<string | number>(function (res, rej) {
        try {
          let copyText = text;

          if (!copyText) {
            copyText = (ref.current as unknown as HTMLInputElement)?.value;
          }

          if (!copyText) {
            const error = 'The copied content cannot be empty';
            rej(error);
            return;
          }

          if (typeof copyText !== 'string' && typeof copyText !== 'number') {
            const error = 'The copied content must be a string or a number';
            rej(error);
            return;
          }

          navigator.clipboard
            .writeText(copyText.toString())
            .then(function () {
              res(copyText as string | number);
            })
            .catch(function (err) {
              rej(err);
            });
        } catch (error) {
          rej(error);
        }
      });
    }, []);

    const getClipboard = useCallback(function () {
      return navigator.clipboard.readText();
    }, []);

    return [ref, { copyToClipboard, getClipboard }] as const;
  }

使用

无输入框的example

  const [, { copyToClipboard }] = useClipboard();

  async function copy() {
    await copyToClipboard('copy');
  }

  return <button onClick={copy}>copy</button>;

有输入框的example

  const [ref, { copyToClipboard }] = useClipboard();

  return (
    <>
      <input ref={ref} />
      <button onClick={() => copyToClipboard()}>copy</button>
    </>
  );
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值