手写拖动上传组件(Vue3)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
<script setup lang="ts">
import { reactive, nextTick } from "vue";
import { useMainStore } from "../../../store";
const store = useMainStore();

const props = defineProps<{ accept?: string }>();

const emits = defineEmits<{ (e: "fileChange", value: File): void }>();

const data = reactive({
  borderColor: "#000",
  file: null as File,
  show: true,
});

const handleFile = (file: File) => {
  console.log(file);
  data.file = file;
  emits("fileChange", file);
};

const preventDefaultEvent = (e: DragEvent) => {
  e.preventDefault();
  data.borderColor = "#000";
};

const onDragOver = (e: DragEvent) => {
  console.log("OVER", store.themeColor);
  e.preventDefault();
  data.borderColor = store.themeColor;
};

const onDrop = (e: DragEvent) => {
  data.borderColor = "#000";
  e.stopPropagation();
  e.preventDefault();
  const files = e.dataTransfer.files;
  const file = files[0];
  if (!file) {
    return;
  }
  handleFile(file);
};

const onFileChange = (e: Event) => {
  data.show = false;
  handleFile((e.target as HTMLInputElement).files[0]);
  nextTick(() => {
    data.show = true;
  });
};
</script>

<template>
  <label for="upload-id">
    <div
      class="upload-container flex"
      :style="{ borderColor: data.borderColor }"
      @dragleave="preventDefaultEvent"
      @dragenter="preventDefaultEvent"
      @dragover="onDragOver"
      @drop="onDrop"
      ref="select_frame"
    >
      <p>{{ data.file?.name }}</p>
    </div>
    <input v-if="data.show" @change="onFileChange" :accept="props.accept" style="display: none" type="file" name="" id="upload-id" />
  </label>
</template>

<style scoped lang="less">
@import "../../../assets/style/theme.less";
.upload-container {
  width: 400px;
  height: 200px;
  background-color: #eee;
  border-radius: 6px;
  border: 1px dashed;
}
.upload-container:hover {
  border-color: @primary !important;
}
</style>

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: vue