1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】ドラッグ&ドロップでファイルアップロードをNext.jsで実装する

Last updated at Posted at 2024-04-02

はじめに

この記事は react-dropzone の使い方の備忘録です。

インストール

npm install react-dropzone

最小セットでドラッグ&ドロップを実装する

app/page.tsx
"use client"
import { useDropzone } from "react-dropzone";

export default function Home() {
  const onDrop = (files: File[]) => {
    console.log(files);
  }

  const { getRootProps, getInputProps } = useDropzone({ onDrop });

  return (
    <div {...getRootProps()} style={{ border: "1px solid #ff7f50", width: 200, height: 150 }}>
      <input {...getInputProps()} />
      <p>ここにファイルをドラッグ&ドロップしてください。</p>
    </div>
  );
}

大事 なのは getRootPropsgetInputPropsonDrop3点 です。

getRootProps
ドラッグ&ドロップファイルアップロード が作動してほしい範囲に渡します。
この場合 divタグ赤枠 を付けているので 赤枠の中作動 します。

getInputProps
getRootProps を渡した タグの中inputタグ に使用します。

useDropzone に渡された onDrop
ドラッグ&ドロップ されたタイミングで発火する callback関数 です。
callback関数第1引数 には ドラッグ&ドロップ された ファイル群 が渡されます。

実際のアップロード処理は onDrop関数 内に記述することになります。

image.png

描画内容 はこうなります。
赤枠の中クリックドラッグ&ドロップ することで
ファイルアップロード を行えます。

範囲内でドラッグされていることを判定して当てるCSSを変更する

app/page.tsx
"use client"
import { useDropzone } from "react-dropzone";

export default function Home() {
  const onDrop = (files: File[]) => {
    console.log(files);
  }

  const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });

  return (
    <div {...getRootProps()} 
    style={ isDragActive ? 
    { border: "1px solid #3eb370", width: 200, height: 150, marginTop: 25, marginLeft: 50} : 
    { border: "1px solid #ff7f50", width: 200, height: 150, marginTop: 25, marginLeft: 50}}>
      <input {...getInputProps()} />
      <p>ここにファイルをドラッグ&ドロップしてください。</p>
    </div>
  );
}

大事 なのは
1.useDropzone から isDragActive を取り出していること
2.divstyleborder の色を isDragActiveフラグ によって変更していること
2点 です。

isDragActive は 範囲内でドラッグされていることを判定する フラグ です。
isDragActive を使うことで ドラッグされている時だけ という条件を使えます。

範囲内のボタンクリックのみでエクスプローラーを開くようにする

大事なのは
1. useDropzonenoClick: trueを渡して範囲内のクリックを無効化する
2. 戻り値からopenを取り出して、buttonタグのonClickに渡す
の2点です。

app/page.tsx
"use client"
import { useDropzone } from "react-dropzone";

export default function Home() {
  const onDrop = (files: File[]) => {
    console.log(files);
  }

  const { getRootProps, getInputProps, isDragActive, open } = useDropzone({ onDrop, noClick: true });

  return (
    <div {...getRootProps()} 
    style={ isDragActive ? 
    { border: "1px solid #3eb370", width: 200, height: 150, marginTop: 25, marginLeft: 50} : 
    { border: "1px solid #ff7f50", width: 200, height: 150, marginTop: 25, marginLeft: 50}}>
      <input {...getInputProps()} />
      <p>ここにファイルをドラッグ&ドロップしてください。</p>
      <button onClick={open}>ファイルを選択</button>
    </div>
  );
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?