まとめ
2021年5月4日現在、 Dropzone.js を Vue.js から簡単に使えるようにするためのライブラリの状況は、
- rowanwins/vue-dropzone: A Vue.js component for Dropzone.js – a drag’n’drop file uploads utility with image previews はインストールできたがエラーで使えなかった。
- Yaxian/vue3-dropzone: HTML5 drag-drop zone with vue3 は使えた。
環境
- Laravel 6 上の Vue.js 3 の SPA
- Laravel 6 、 Vue.js 3 のプロジェクトに Vue.js のルートとなるシングルファイルコンポーネント (SFC) を指定するメモ – oki2a24 の続き
rowanwins/vue-dropzone: A Vue.js component for Dropzone.js – a drag’n’drop file uploads utility with image previews
npm install --save-dev vue2-dropzone
次の laravel/resources/js/views/Vue2Dropzone.vue
を追加しました。 Vue Router も修正しておりますが、割愛します。
<template>
<h1>vue2-dropzone sample</h1>
<p>
<a href="https://github.com/rowanwins/vue-dropzone" target="_blank"
>rowanwins/vue-dropzone: A Vue.js component for Dropzone.js - a
drag’n’drop file uploads utility with image previews</a
>
は Vue.js 3 では動かない。
</p>
<vue-dropzone
id="dropzone"
ref="myVueDropzone"
:options="dropzoneOptions"
></vue-dropzone>
</template>
<script>
import vue2Dropzone from "vue2-dropzone";
import "vue2-dropzone/dist/vue2Dropzone.min.css";
import { reactive } from "vue";
export default {
name: "Vue2Dropzone",
components: {
vueDropzone: vue2Dropzone,
},
setup() {
const dropzoneOptions = reactive({
url: "https://httpbin.org/post",
thumbnailWidth: 150,
maxFilesize: 0.5,
headers: { "My-Awesome-Header": "header value" },
});
return {
dropzoneOptions,
};
},
};
</script>
例えば次のようなエラーとなってしまいました。
app.js:56452 Uncaught (in promise) TypeError: Cannot read property '_c' of undefined
やはり、という感じです。というのも、 Vue 3 Support · Issue #578 · rowanwins/vue-dropzone というページがあり、対応されていないのがわかっていたためです。
Yaxian/vue3-dropzone: HTML5 drag-drop zone with vue3
npm install --save-dev vue3-dropzone
次の laravel/resources/js/views/Vue2Dropzone.vue
を追加しました。やはり Vue Router も修正しておりますが、割愛します。
<template>
<h1>vue3-dropzone sample</h1>
<p>
<a href="https://github.com/Yaxian/vue3-dropzone" target="_blank"
>Yaxian/vue3-dropzone: HTML5 drag-drop zone with vue3</a
>
は Vue.js 3 では動く。
</p>
<div>
<div v-bind="getRootProps()">
<input v-bind="getInputProps()" />
<p v-if="isDragActive">Drop the files here ...</p>
<p v-else>Drag 'n' drop some files here, or click to select files</p>
</div>
<button @click="open">open</button>
</div>
</template>
<script>
import { useDropzone } from "vue3-dropzone";
export default {
name: "Vue3Dropzone",
setup() {
function onDrop(acceptFiles, rejectReasons) {
console.log(acceptFiles);
console.log(rejectReasons);
}
const { getRootProps, getInputProps, ...rest } = useDropzone({ onDrop });
console.log(rest);
return {
getRootProps,
getInputProps,
...rest,
};
},
};
</script>
http://localhost/vue3_dropzone
へアクセスするとこちらはエラーもなく、動きました!コンソールのログをみてみても、選択、ドロップ共にファイルを取得できています。使えそうです。
あと気になっているのは次のことです。
- スタイルが一切無いが当てる方法はわかっていない。
- 選択したりドロップしたりしたファイルは、配列としていっぺんに得られる。したがって並列にアップロードなどはこのライブラリではできないのか、もっとよく調べればできるのか、よくわかっていない。
- ドキュメントは react-dropzone/react-dropzone: Simple HTML5 drag-drop zone with React.js. を見たほうが良さそう。このライブラリを真似て作ったようなので。
おわりに
Yaxian/vue3-dropzone: HTML5 drag-drop zone with vue3 は使えそうに思ましたが、そもそも Dropzone.js をよく知らないので本当にうまく使えるのかどうか、どうやってカスタマイズして自分の使いたいように使うのか、がわからない、というオチとなりました。
やはり Dropzone.js を一度実際にいじってみた方が良さそうに感じております。
以上です。