使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

news2025/6/12 21:16:04

以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用:

1. 封装的图片上传组件 ImageUploader.vue

<template>
  <div class="image-uploader-container">
    <div class="upload-title">照片</div>
    <van-uploader
      v-model="fileList"
      :max-count="9" 
      :after-read="handleAfterRead"
      :before-delete="handleBeforeDelete"
      upload-text="添加图片"
      :preview-size="80"
      preview-image
      class="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 是调用后端接口上传文件的方法,返回 Promise
  uploadFileToServer(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); 
    });
  });
}
  • 图片尺寸限制与裁剪:如果需要限制上传图片的尺寸、进行裁剪等操作,可结合 vantUploader 组件的 before-read 钩子,在图片读取前进行处理,比如使用 canvas 裁剪图片,或者判断图片尺寸不符合要求时提示用户重新选择。

这样就完整实现了截图中照片上传、预览、删除的功能,并封装成了可复用的 Vue2 组件,方便在其他页面中通过简单引入即可使用,后续还能根据实际业务需求进一步扩展和优化 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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…

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…

华为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…

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…

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 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…

【2025年】解决Burpsuite抓不到https包的问题

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

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

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

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…