React+MaterialUIで作るコピーボタン付きTextFieldの作り方を紹介

React + MaterialUIのTextFieldに表示されている文字列を、クリップボードにコピーするボタンがついたTextFieldの作成方法を紹介します。

見た目

よく見かける以下のような見た目のものです。

ReadOnlyのTextFieldの右側にあるコピーボタンを押下するとクリップボードに文字列がコピーされます。
そして、コピーされたことをSnackbarにてユーザーに知らせます。

クリップボードにコピーするComponent

こちらのソースコードをそのままコピペして利用してください。

CopyToClipboardButton.tsx
import React, { useState } from "react";
import { IconButton, Snackbar } from "@mui/material";
import ContentCopyIcon from '@mui/icons-material/ContentCopy';

type Props = {
  text: string;
};

const CopyToClipboardButton: React.FC<Props> = (props: Props) => {
  const [open, setOpen] = useState(false);

  const handleClick = () => {
    setOpen(true);
    navigator.clipboard.writeText(props.text);
  };

  return (
    <>
      <IconButton onClick={handleClick} color="primary">
        <ContentCopyIcon />
      </IconButton>
      <Snackbar
        message="Copied to clibboard"
        anchorOrigin={{ vertical: "top", horizontal: "center" }}
        autoHideDuration={2000}
        onClose={() => setOpen(false)}
        open={open}
      />
    </>
  );
};

export default CopyToClipboardButton;
TypeScript

利用方法

以下のソースコードのTextField部分が利用方法です。
CopyToClipboardButtonタグのtextプロパティにコピーしたい文字列を入れてください。

Index.tsx
import React from 'react';
import { InputAdornment, TextField } from '@mui/material';
import CopyToClipboardButton from './CopyToClipboardButton';

const Index: React.FC = () => {
  const copyText = "Sample text";

  return (
    <TextField
      value={copyText}
      slotProps={{
        input: {
          readOnly: true,
          endAdornment: (
            <InputAdornment position="end">
              <CopyToClipboardButton text={copyText} />
            </InputAdornment>
          ),
        },
      }}
    />
  )
);
export default Index;
TypeScript

今は一旦コードのみを紹介します。
そのうち解説をしていこうかと思います。

著者

Webエンジニア歴30年、フリーランスバックエンドエンジニア。

PHP歴約30年(Laravel 7年・FuelPHP 5年・CakePHP・自作FW)、
JavaScript歴約20年(React・Vue各4年)。
AWS(EC2 / CloudFront / RDS / API Gateway など)・
GCP(BigQuery)を使ったバックエンド開発を中心に、
複数の事業会社・受託案件でシステム設計から実装・運用まで担当しています。

PHPがバージョン4の時代から書いており、
Laravelが普及する前のフレームワーク乱立期も経験しています。
「昔はこう書いていたが今はこう」という変遷を肌で知っているエンジニアとして、
単なるコマンドの使い方だけでなく、なぜそうするのかの背景まで伝えることを意識して書いています。

このブログでは、実務で実際に詰まった箇所・調べたこと・気づいたことを
そのまま記事にしています。誰かの「詰まり」が解決するきっかけになれば幸いです。

千原 耕司をフォローする

役にたったと思ったら応援をお願いします m(._.)m

JavaScriptReact
スポンサーリンク
シェアする
千原 耕司をフォローする
タイトルとURLをコピーしました