封装vue-cropper,图片裁剪组件

组件基本使用:

在这里插入图片描述

这里的action同时也可以传相对路径,比如封装了axios,那么组件源码里就不能引入元素axios,可以替换为封装的axios。传 action="/file/upload"

源代码:

<script setup>
import WuyuCropper from '@/components/wuyu-cropper/index.vue'function result(data) {console.log(data)
}// 默认头像
const defaultAvatar = 'https://img.yzcdn.cn/vant/cat.jpeg'
</script><template><wuyu-cropper @result="result":src="defaultAvatar"action="http://localhost:9090/upload/file"></wuyu-cropper>
</template><style lang="scss" scoped>
</style>

组件属性

名称类型默认值是否必需说明
maxSizeNumber5单位:MB,图片大小限制
fixedNumberArray[1,1]裁剪比例
srcString“”初始化图片回显
actionString#上传接口
headersObject{}请求头

组件事件

名称参数列表说明
result(url)裁剪结束提交后触发该事件,并传递裁剪后的图片url

组件插槽

名称参数列表说明
default自定义按钮,打开裁剪框

组件源码

环境: vue3+element plus+axios+vue-cropper,
可选:vueuse的防抖动函数 useDebounceFn,如果不需要可以去掉

pnpm add vue-cropper@1.1.4 
pnpm add @vueuse/core@11.1.0
<!--可能需要修改 submit函数,根据后端返回值做处理 -->
<script setup>
import {ref} from "vue";
import 'vue-cropper/dist/index.css'
import {VueCropper} from "vue-cropper";
import {useDebounceFn} from "@vueuse/core";
import {ElMessage} from "element-plus";
import axios from "axios";const emit = defineEmits(['result'])
const prop = defineProps({// 单位: MBmaxSize: {type: Number,default: 5},fixedNumber: {type: Array,default: () => [1, 1]},src: {type: String,default: ''},action: {type: String,default: '#'},headers: {type: Object,default: () => {}}
})
const cropperRef = ref()
const uploadRef = ref()
const visible = ref(false)
const options = ref({img: prop.src, // 图片urlfixed: true,    // 固定裁剪框大小fixedNumber: prop.fixedNumber, // 裁剪框比例autoCrop: true,filename: getFileName(prop.src)
})
const preview = ref({})
const realTime = useDebounceFn((e) => {preview.value = e
}, 500)// 获取文件名
function getFileName(url) {return url.substring(url.lastIndexOf('/') + 1)
}function open() {visible.value = trueoptions.value.img = prop.srcoptions.value.fixedNumber = prop.fixedNumberoptions.value.filename = getFileName(prop.src)
}function close() {preview.value = {}uploadRef.value.clearFiles()visible.value = false
}// 选择文件之前
function beforeUpload(file) {if (file.size / 1024 / 1024 > prop.maxSize) {ElMessage.error(`文件的大小不能超过:${prop.maxSize}MB`)return false}
}// 选择文件之后
function httpRequest({file, filename}) {options.value.filename = file.nameoptions.value.img = URL.createObjectURL(file)
}// 提交裁剪文件
function submit() {cropperRef.value.getCropBlob(async (data) => {const formData = new FormData()formData.append('file', data, options.value.filename)// 上传文件const res = await axios.post(prop.action, formData, {headers: {...prop.headers}})// 提交成功,触发result事件,传递urlemit('result', res.data.data)visible.value = false})
}function rotateRight() {cropperRef.value.rotateRight()
}function rotateLeft() {cropperRef.value.rotateLeft()
}function zoomIn() {cropperRef.value.changeScale(1)
}function zoomOut() {cropperRef.value.changeScale(-1)
}
</script><template><div @click="open"><slot><el-button>上传</el-button></slot></div><el-drawer :model-value="visible"direction="ttb"append-to-bodysize="100%"@close="close"><template #default><el-row style="height: 80%"><el-col :sm="12" class="cropper-box"><VueCropperref="cropperRef"v-if="visible":img="options.img":fixed="options.fixed":fixed-number="options.fixedNumber":autoCrop="options.autoCrop"@realTime="realTime"></VueCropper></el-col><el-col :sm="12" class="preview"><div :style="preview.div" class="preview-box"><img v-if="preview.url" class="img" :src="preview.url" :style="preview.img"/></div></el-col></el-row><el-row :gutter="10" style="margin-top: 1rem"><el-col :sm="1"><el-upload action="#":limit="1"ref="uploadRef":http-request="httpRequest":before-upload="beforeUpload"accept=".jpg,.jpeg,.png":show-file-list="false"><template #default><el-button circle type="primary" icon="UploadFilled" title="上传"/></template></el-upload></el-col><el-col :sm="1"><el-button circle :disabled="!preview.url" @click="rotateRight" icon="RefreshRight" title="右转"/></el-col><el-col :sm="1"><el-button circle :disabled="!preview.url" @click="rotateLeft" icon="RefreshLeft" title="左转"/></el-col><el-col :sm="1"><el-button circle :disabled="!preview.url" @click="zoomIn" icon="ZoomIn" title="放大"/></el-col><el-col :sm="3"><el-button circle :disabled="!preview.url" @click="zoomOut" icon="ZoomOut" title="缩小"/></el-col><el-col :sm="2"><el-button type="success" @click="submit" :disabled="!preview.url">提交</el-button></el-col></el-row></template></el-drawer>
</template><style lang="scss" scoped>
.cropper-box {height: 100%;display: flex;justify-content: center;align-items: center;
}.preview {height: 100%;display: flex;justify-content: center;align-items: center;.preview-box {height: 100%;overflow: hidden;.img {height: 100%;width: 100%;}}
}
</style>

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

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

相关文章

【基础算法总结】字符串篇

目录 一&#xff0c;算法简介二&#xff0c;算法原理和代码实现14.最长公共前缀5.最长回文子串67.二进制求和43.字符串相乘 三&#xff0c;算法总结 一&#xff0c;算法简介 字符串 string 是一种数据结构&#xff0c;它一般和其他的算法结合在一起操作&#xff0c;比如和模拟&…

远程控制软件推荐:亲测好用!

无论是在家办公、技术支持还是远程协助家人&#xff0c;一个好的远程控制工具都能让我们的工作更加高效。下面&#xff0c;我将分享我对几款流行的远程控制软件的个人体验&#xff0c;并给出我的推荐。 向日葵远程控制 直达链接&#xff1a;down.oray.com 向日葵远程控制是…

如何实现一个基于 HTML+CSS+JS 的任务进度条

如何实现一个基于 HTMLCSSJS 的任务进度条 在网页开发中&#xff0c;任务进度条是一种常见的 UI 组件&#xff0c;它可以直观地展示任务的完成情况。本文将向你展示如何使用 HTML CSS JavaScript 来创建一个简单的、交互式的任务进度条。用户可以通过点击进度条的任意位置来…

Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存

1、文件所在位置&#xff1a; 2、需要Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>3、启动时就读取放入缓存的代码&#xf…

10.8作业

优化登录框&#xff1a; 当用户点击取消按钮&#xff0c;弹出问题对话框&#xff0c;询问是否要确定退出登录&#xff0c;并提供两个按钮&#xff0c;yes|No&#xff0c;如果用户点击的Yes&#xff0c;则关闭对话框&#xff0c;如果用户点击的No&#xff0c;则继续登录 当用户点…

26.删除有序数组中的重复项

题目::26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思路:只要不和前面的数一样就可以移动指针&#xff0c;进行赋值 代码: class Solution { public:int removeDuplicates(vector<int>& nums) {int slow 0 ;for(int fast 1; fast < …

Sharding-JDBC笔记04-分库分表实战

文章目录 前言一、需求描述二、数据库设计三、环境说明四、环境准备4.1.mysql主从同步(windows)4.2.初始化数据库 五、实现步骤5.1 搭建maven工程引入maven依赖 5.2 实体类5.3 dao层5.4 服务类5.5 测试类总结 5.6 查询商品DaoService单元测试输出小结 5.7 统计商品Dao单元测试统…

许昌文旅助手:AI智能体在文旅领域的创新应用

哈哈&#xff0c;大家好&#xff0c;我是王帅旭&#xff0c;来自大禹智库&#xff0c;也是《实战AI智能体》一书的作者。今天&#xff0c;咱们就来聊聊一个超级有趣的案例——许昌文旅助手&#xff0c;看看AI智能体是如何在文旅领域大放异彩的&#xff01; 无限拓展的能力集&am…

10.8QTQMessageBox练习

QQ界面 widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置框体的大小和颜色this->setFixedSize(350,500);this->setStyleSheet("background-color:#e5f0ff;");//创建一个LineEdit edit1edit1 new QLineEdi…

面试淘天集团大模型算法工程师, 开心到飞起!!!

应聘岗位&#xff1a;淘天集团-大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a; 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通能力。 2. 技术问题 2.1 在大模型微调过程…

全网最详细的Python Locust性能测试框架实践

Locust的介绍 Locust是一个python的性能测试工具&#xff0c;你可以通过写python脚本的方式来对web接口进行负载测试。 Locust的安装 首先你要安装python2.6以上版本&#xff0c;而且有pip工具。之后打开命令行&#xff0c;分别安装locustio和pyzmq&#xff08;命令如下&…

【技术白皮书】内功心法 | 第一部分 | 数据结构与算法基础(数据结构)

数据结构与算法基础 内容简介数据结构数据模型数据结构的表现形式 基本概念数据&#xff08;Data&#xff09;数据元素&#xff08;data element&#xff09;数据结构的定义物理结构和逻辑结构逻辑结构逻辑结构表现形式二元组模型集合结构模型线性结构模型树结构模型图结构模型…

GNURadio 平台实现AM信号调制解调实验

文章目录​​ 一、AM调制解调原理 1.调制原理 2.解调原理 二、搭建的GRC流图 1.AM调制信号流图 2.AM解调信号流图 一、AM调制解调原理 1.调制原理 幅度调制&#xff08; Amplitude modulation——AM&#xff09; &#xff0c; 是常规的双边带调制&#xff0c; 即使载波的…

和鲸科技创始人范向伟:拐点即将来临,AI产业当前的三个瓶颈

在科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑已经成为引领新一轮产业革命的核心动力之一。全球企业纷纷拥抱AI技术&#xff0c;试图借助其变革力量在竞争中突围&#xff0c;然而业界对AI产业化的拐点何时来临却众说纷纭。毕竟AI技术从实验室到商业…

[SAP ABAP] INCLUDE程序创建

在ABAP中&#xff0c;INCLUDE是一种结构化编程技术&#xff0c;它允许将一段程序代码片段包含到其他程序段中&#xff0c;以便复用和维护 INCLUDE程序创建的好处 ① 代码模块化 将常用的功能或通用的子程序存放到单独的文件中&#xff0c;使得主程序更简洁、易于理解和管理 ② …

揭秘人工智能的奇幻构造:人工智能的组成及都涉及什么

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

动态内存管理练习题的反汇编代码分析(底层)

1.C语言代码 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 2.反汇编代码 VS2022x64debug #include <stdio.h>…

PCB进程初识

目录 一、什么是进程 1.课本概念 2.内核观点 二、进程的描述-PCB 1.什么是PCB 2.PCB的组织方式 3.task_struct是Linux操作系统下的PCB 4.task_struct内容分类 三、进程的查看 四、进程的创建 1.查看子进程id和父进程id 演示实例1&#xff1a; 2.fork初识 演示实例…

软件测试学习笔记丨Mitmproxy使用

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32334 一、简介 Mitmproxy是一款开源、免费的代理工具&#xff0c;支持Mac、Windows、Linux。相比其他代理工具&#xff0c;可以通过Python和Mitmproxy工具本身的插件机制&#xff0c;实现通…

npm运行时出现npm ERR! builtins is not a function报错

项目场景&#xff1a; 项目运行时什么都没动都没改突然运行不起来了&#xff0c;报错 TypeError: builtins is not a function 代码什么都没动&#xff0c;不是代码问题&#xff0c;排查后只有可能是node和npm的问题&#xff0c;所以卸载掉node重装重启 解决方案&#xff1a; …