手写拖动上传组件(Vue3/React)

news/2024/11/18 7:24:46/

Vue3版本

<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"><divclass="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>

React版本

import { Box, SxProps, Theme } from "@mui/material";
import { ChangeEvent, InputHTMLAttributes, PropsWithChildren, useState } from "react";interface DragUploadProps {onFileChange: (files: FileList) => void;sx?: SxProps<Theme>;className?: string;accept?: InputHTMLAttributes<HTMLInputElement>["accept"];
}/*** @function React.Component* @description 拖动上传文件*/
export default function DragUpload(props: PropsWithChildren<DragUploadProps>) {const { sx = {}, className, accept } = props;const [show, setShow] = useState(true);//   const [border];const onFileChange = (e: ChangeEvent<HTMLInputElement>) => {const files = e.target.files;handleFile(files);};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(files);};const handleFile = (files: FileList) => {console.log(files);setShow(false);Promise.resolve().then(() => {setShow(true);});props.onFileChange(files);// setTimeout(() => {//   setShow(true);// }, 0);};return (<label htmlFor="upload-id">{/* @ts-ignore */}<BoxonDragLeave={preventDefaultEvent}onDragEnter={preventDefaultEvent}onDragOver={onDragOver}onDrop={onDrop}sx={{ borderRadius: 1.5, border: "1px dashed", ...sx }}className={"pointer " + className}>{props.children}{show && <input onChange={onFileChange} accept={accept} style={{ display: "none" }} type="file" name="" id="upload-id" />}</Box></label>);
}

http://www.ppmy.cn/news/12840.html

相关文章

Python实战项目1——自动获取小说工具

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

接口性能测试避坑 Django+Nginx+uwsgi接口性能调优postman Apifox ab

Django开发了个接口供外部调用&#xff0c;Django的并发性能弱早有所闻&#xff0c;所以采用DjangoNginxuwsgi架构来提高并发量。然后使用测试工具测试并发量。服务器配置&#xff1a;CPU 2&#xff0c;内存8G接口内容只有3句&#xff1a;request_data {"code":&quo…

Java基础学习笔记(十六)—— IO流

IO流1 IO流1.1 IO流概述1.2 IO流的分类1.3 IO流的使用场景2 File类2.1 File类概述2.2 File类构造方法2.3 File类常用方法2.4 File类案例3 字节流3.1 字节流写数据3.2 字节流写数据的三种方式3.3 字节流写数据加异常处理3.4 字节流读数据3.5 字节流复制文件4 字节缓冲流4.1 字节…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《7》

不知不觉已是第七篇了&#xff0c;发觉这篇论文所涉及的知识点特别多&#xff0c;我的个人习惯是先把论文看一遍&#xff0c;了解这个大概&#xff0c;然后将源码运行一遍&#xff0c;熟悉下这个模型带来的大概效果是怎么样的&#xff0c;然后就阅读源码了&#xff0c;从源码中…

NTP(Network Time Protocol)协议详解

一、NTP的基本概念&#xff1a; NTP(Network Time Protocol)------网络时间协议-----应用层协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。 二、采用NTP的目的&#xff1a; 是对网络内所有具有时钟的设备进行时钟同步&#xff0c;使网络内所有设备的时钟…

【Linux】六、Linux 基础IO(二)|重定向|如何理解 Linux一切皆文件|缓冲区

目录 五、重定向 5.1 什么是重定向 5.2 系统调用 dup2 5.3 三种重定向测试 5.3.1 输出重定向(>) 5.3.2 追加重定向(>>) 5.3.3 输入重定向(<) 5.4 父子进程拷贝问题 六、如何理解 Linux一切皆文件 七、缓冲区 7.1 认识缓冲区 7.2 缓冲区的刷新策略 …

【微信小程序】动态设置导航栏标题

&#x1f3c6;今日学习目标&#xff1a;第十八期——动态设置导航栏标题 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;25分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目录前言使用配置文件…

vue组件传值方式有哪些

Vue 作为一个轻量级的前端框架&#xff0c;核心两大特性就是响应式编程和组件化。 本文针对组件之间传值做详细讲解。 Vue就是由一个一个的组件构成的&#xff0c;组件化是它的精髓&#xff0c;也是最强大的功能之一。而组件实例的作用域是相互独立的&#xff0c;这就意味着不…