使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui
(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用:
1. 封装的图片上传组件 ImageUploader.vue
<template><div class="image-uploader-container"><div class="upload-title">照片</div><van-uploaderv-model="fileList":max-count="9" :after-read="handleAfterRead":before-delete="handleBeforeDelete"upload-text="添加图片":preview-size="80"preview-imageclass="uploader-wrapper"><!-- 自定义添加图片的默认插槽内容,模拟截图样式 --><template #default><div class="custom-upload-btn"><van-icon name="photograph" size="32" color="#999" /><div class="upload-tip">添加图片</div></div></template></van-uploader></div>
</template><script>
import { Uploader, Icon } from 'vant';
import 'vant/lib/index.css'; export default {name: 'ImageUploader',components: {vanUploader: Uploader,vanIcon: Icon},data() {return {fileList: [] };},methods: {// 图片上传成功回调handleAfterRead(file) {// vant 的 after-read 会返回文件对象,需转成 vant 要求的 fileList 格式const newFile = {url: file.content, // 可扩展其他属性,比如文件名称等name: file.file.name };this.fileList.push(newFile); },// 删除图片前的回调,用于确认删除逻辑(也可直接返回 true 直接删除)handleBeforeDelete(file, index) {// 这里可加删除确认逻辑,比如弹出提示框return true; }}
};
</script><style scoped>
.image-uploader-container {border: 1px solid #409eff;border-radius: 4px;padding: 10px;
}
.upload-title {font-size: 16px;color: #333;margin-bottom: 10px;
}
.uploader-wrapper {display: flex;flex-wrap: wrap;gap: 10px;
}
/* 自定义添加按钮样式 */
.custom-upload-btn {width: 80px;height: 80px;border: 1px dashed #ccc;border-radius: 4px;display: flex;flex-direction: column;justify-content: center;align-items: center;color: #999;cursor: pointer;
}
.upload-tip {margin-top: 4px;font-size: 12px;
}
/* 调整上传后图片预览样式,让删除按钮位置更贴近截图 */
.van-uploader__preview {position: relative;
}
.van-uploader__preview-delete {position: absolute;top: -6px;right: -6px;background-color: rgba(0, 0, 0, 0.7);border-radius: 50%;padding: 2px 6px;color: #fff;font-size: 12px;
}
</style>
2. 组件使用示例(在其他页面中引入 )
<template><div class="page-container"><h2>示例页面</h2><ImageUploader /></div>
</template><script>
import ImageUploader from './ImageUploader.vue';export default {name: 'ExamplePage',components: {ImageUploader}
};
</script><style scoped>
.page-container {padding: 20px;
}
</style>
代码功能拆解与说明
1. 基础功能实现
- 组件引入与注册:从
vant
中引入Uploader
(上传组件 )和Icon
(图标组件 ),并在当前组件中注册,同时引入vant
的基础样式文件vant/lib/index.css
(若项目已全局引入vant
样式,可省略 )。 van-uploader
配置:v-model="fileList"
:双向绑定已上传图片列表数据,用于展示已上传的图片。:max-count="9"
:限制最多可上传 9 张图片,可根据需求调整。:after-read="handleAfterRead"
:图片上传成功(读取完成 )后的回调函数,用于将上传的文件处理后加入fileList
展示。:before-delete="handleBeforeDelete"
:删除图片前的回调,可在这里加删除确认逻辑,示例中直接返回true
允许删除,实际项目可结合van-dialog
等组件做确认提示。upload-text="添加图片"
:默认上传按钮的文本,不过这里用了自定义插槽覆盖,所以该属性实际作用不大,主要是配合组件逻辑。:preview-size="80"
:设置预览图片的尺寸,单位为px
,和截图中图片大小适配。preview-image
:开启图片预览功能,点击已上传图片可查看大图。
- 自定义添加按钮:通过
#default
插槽,自定义“添加图片”的显示样式,用van-icon
展示相机图标,下方加文字提示,模拟截图中的样式。
2. 样式适配
- 容器与标题:给组件最外层容器加蓝色边框和圆角,设置标题样式,贴近截图布局。
- 自定义添加按钮:设置添加按钮的宽高、边框样式(虚线 )、图标和文字样式,模拟截图中“添加图片”区域的外观。
- 预览图片与删除按钮:调整
vant
上传后预览图片的样式,让删除按钮(van-uploader__preview-delete
)位置更贴近截图,通过绝对定位放到图片右上角,优化显示效果。
3. 功能扩展点
- 图片上传逻辑:当前
handleAfterRead
只是简单将文件转成fileList
格式展示,实际项目中,通常需要结合后端接口,把文件真正上传到服务器,可修改handleAfterRead
方法,调用接口上传文件,成功后再把服务器返回的图片地址存入fileList
,示例如下:
handleAfterRead(file) {// 假设 uploadFileToServer 是调用后端接口上传文件的方法,返回 PromiseuploadFileToServer(file.file).then((res) => {const newFile = {url: res.data.imageUrl, name: file.file.name };this.fileList.push(newFile); }).catch((err) => {console.error('上传失败:', err);// 可在这里提示用户上传失败});
}
- 删除逻辑增强:若要实现删除图片时同时调用后端接口删除服务器上的文件,可在
handleBeforeDelete
中发起接口请求,成功后再返回true
删除前端列表数据,示例:
handleBeforeDelete(file, index) {return new Promise((resolve, reject) => {// 假设 deleteFileFromServer 是调用后端删除接口的方法,入参是图片地址等deleteFileFromServer(file.url).then(() => {resolve(true); }).catch((err) => {console.error('删除失败:', err);reject(false); });});
}
- 图片尺寸限制与裁剪:如果需要限制上传图片的尺寸、进行裁剪等操作,可结合
vant
的Uploader
组件的before-read
钩子,在图片读取前进行处理,比如使用canvas
裁剪图片,或者判断图片尺寸不符合要求时提示用户重新选择。
这样就完整实现了截图中照片上传、预览、删除的功能,并封装成了可复用的 Vue2 组件,方便在其他页面中通过简单引入即可使用,后续还能根据实际业务需求进一步扩展和优化 。
相关文章:
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...