Vue3(setup)中使用vue-cropper图片上传裁剪插件,复制代码直接使用

最近在项目中用到上传裁剪,看了一下代码,觉得这插件可可以。梳理了一下代码分享给大家

前端UI组件element-plus

如果你也用到了 ,快速帮你解决了问题,别忘记点赞收藏

1.首先看效果图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 因为版本vue-cropper 众多 ,虽然网上有各种写法 为了保证能运行 直接copy代码就能用
  2. 直接在package.json中添加依赖 "vue-cropper": "^1.0.9",
  3. 在这里插入图片描述
    然后安装依赖npm install

5 创建一个公用组件

imgcropper.vue

<template><el-dialogv-model="isModel"title="裁剪图片"width="1000px"destroy-on-closecenterdraggable><div class="main"><div class="tip"><div class="tip-text">上传说明"vue-cropper": "^1.0.9"版本</div></div><el-row :gutter="20"><el-col span="14"><div class="mainbox"><vue-cropperref="cropper":img="option.img":outputSize="option.outputSize":outputType="option.outputType":info="option.info":canScale="option.canScale":autoCrop="option.autoCrop":autoCropWidth="option.autoCropWidth":autoCropHeight="option.autoCropHeight":fixed="option.fixed":fixedNumber="option.fixedNumber":full="option.full":fixedBox="option.fixedBox":canMove="option.canMove":canMoveBox="option.canMoveBox":original="option.original":centerBox="option.centerBox":height="option.height":infoTrue="option.infoTrue":maxImgSize="option.maxImgSize":enlarge="option.enlarge":mode="option.mode"@realTime="realTime"></vue-cropper><div class="main-btn"><el-button  size="sm" @click="rotateLeft">↺ 向左旋转15°</el-button><el-button  size="sm" @click="rotateRight">↻ 向左旋转15°</el-button><el-button  size="sm" @click="changeScale(1)"><el-icon type="elui-icon-add-circle" color="#fff"></el-icon>+ 放大</el-button><el-button  size="sm" @click="changeScale(-1)" >- 缩小</el-button ><el-button type="danger" size="sm" @click="changeReset"  >重置</el-button ></div></div></el-col><el-col span="10"><div class="preview-model"><div class="preview" style="width: 200px; height: 200px" v-if="previews.url"><el-imagelazystyle="width: 100px; height: 100px":src="previews.url":zoom-rate="1.2":max-scale="7":min-scale="0.2":preview-src-list="srcList":initial-index="4"@load="lookImg"/></div><div class="upload-btn"><el-upload v-model="file"  :on-change="selectImg"><el-button type="primary" size="sm">选择图片</el-button></el-upload><el-button type="success" style="margin-left: 10px;" size="sm" @click="uploadFile">确认上传</el-button></div></div></el-col></el-row></div></el-dialog></template>
<script setup>
import { ref, reactive ,watch,defineExpose} from "vue";
import { VueCropper } from "vue-cropper";import "vue-cropper/dist/index.css";
const isModel = ref(false);
const name = ref();
const file = ref();
const previews = ref({});
const previewImg = ref();
const cropper = ref(null);
const emit = defineEmits([""]);const option = reactive({img: "",name: "",outputSize: 1, //裁剪生成图片的质量(可选0.1 - 1)outputType: "png", //裁剪生成图片的格式(jpeg || png || webp)info: true, //图片大小信息canScale: true, //图片是否允许滚轮缩放autoCrop: true, //是否默认生成截图框autoCropWidth: 200, //默认生成截图框宽度autoCropHeight: 200, //默认生成截图框高度fixed: false, //是否开启截图框宽高固定比例fixedNumber: [1.53, 1], //截图框的宽高比例full: false, //false按原比例裁切图片,不失真fixedBox: false, //固定截图框大小,不允许改变canMove: true, //上传图片是否可以移动canMoveBox: true, //截图框能否拖动original: false, //上传图片按照原始比例渲染centerBox: true, //截图框是否被限制在图片里面height: false, //是否按照设备的dpr 输出等比例图片infoTrue: false, //true为展示真实输出图片宽高,false展示看到的截图框宽高maxImgSize: 3000, //限制图片最大宽度和高度enlarge: 1, //图片根据截图框输出比例倍数mode: "100% 100%", //图片默认渲染方式
});//预览
const srcList = ref([])//当再次打开时 清空图片
watch(isModel, (val) => {if (!val) {previews.value = {};option.img = ''srcList.value = []}
});//实时预览
const realTime = (data) => {previews.value = data;option.autoCropWidth = data.img.width;option.autoCropHeight = data.img.height;
};//图片缩放
const changeScale = (num) => {num = num || 1;cropper.value.changeScale(num);
};// 向左旋转
const rotateLeft = () => {cropper.value.rotate = cropper.value.rotate - 15 / 90;//直接旋转90度cropper.value.rotateLeft()
};//向右旋转
const rotateRight = () => {cropper.value.rotate = cropper.value.rotate + 15 / 90;//直接旋转90度// cropper.value.rotateRight()
};// 重置
const changeReset = () => {cropper.value.refresh();
};//图片预览图片
const lookImg = () => {cropper.value.getCropBlob((data) => {file.value = data;let img = window.URL.createObjectURL(data);srcList.value.push(img)});
};//选择图片
const selectImg = (e) => {//这里需要注意 每个UI组件 返回的数据格式不一样   需要什么取什么srcList.value = [];option.img = URL.createObjectURL(e.raw);option.name = e.raw.name;};/*** @function 确认上传** */
const uploadFile = () => {cropper.value.getCropBlob((data) => {if (data) {data.fileName = option.name;}emit("uploadImgSuccess", data);});
};/*** @function 开启弹窗* */
const open = () => {isModel.value = true;
};/*** @function 关闭* */
const close = () => {isModel.value = false;
};defineExpose({open,close,
});
</script>
<style lang="scss" scoped>
.main {box-sizing: border-box;min-height: 450px;padding: 20px;.tip {display: flex;align-items: center;margin-bottom: 20px;.tip-text {color: red;}}.mainbox {width: 100%;height: 300px;}.preview-model {display: flex;flex-direction: column;justify-content: flex-start;align-items: center;.preview {overflow: hidden;}.upload-btn {display: flex;width: 100%;justify-content: space-evenly;margin-top: 20px;}}.main-btn {display: flex;justify-content: center;margin-top: 20px;}
}</style>

直接在页面中使用 例如index.vue

index.vue 
<template><div class='content'><el-button type="danger" @click="addimg">上传图片 </el-button><img v-if="imgurl" :src="imgurl" alt="" width='200' height="100"><comCutimgcropper   ref="imgref"    @uploadImgSuccess="uploadImgSuccess"  ></comCutimgcropper></div>
</template><script setup>
import comCutimgcropper from '../components/imgcropper.vue'
import { ref ,watch} from 'vue'
import {useRoute, useRouter} from 'vue-router'
const router = useRouter();
const imgref = ref(null);
const imgurl = ref("");const addimg = () => {imgref.value.open();
}const uploadImgSuccess = data => {//调用接口// uploadImage(data)//这里为了展示 直接 写死一张图片 关闭弹框imgurl.value = "https://img2.baidu.com/it/u=3354585195,1512541150&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1700845200&t=636a3f6d0f2d46b6753a203f48801a98"imgref.value.close()}
const uploadImage = async data => {console.log(data)//这里就是跟后台约定好需要传递什么参数const params = {file: data,fileName: data.fileName, }//上传接口const res = await uploads(params);if (res && res.code === 200) {//页面上显示图片 后端返回的图片地址imgurl.value = res.data.url;//关闭弹窗imgref.value.close()}
}/*** axiso 封装一般这么写 都是采用 FormData的形式  注意请求头 headers    'Content-Type': 'multipart/form-data'* * export const uploads = params => {const data = new FormData()data.append('file', params.file, params.fileName)return request({headers: {'Content-Type': 'multipart/form-data'},url: '/,method: 'post',data,})
}*/</script>

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

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

相关文章

阿里云windwos 安装oracle数据库,外部用工具连接不上,只能在服务器本机通过127.0.0.1 连接

1. 首先检查阿里云服务器安全组端口是否开放 oracle 数据库端口 2. 其次找到oracle 安装的目录&#xff0c;打开这俩个文件&#xff0c;将localhost 修改为 服务器本机名称 3.重启oracle 监听服务&#xff0c;就可以连接了

ModuleNotFoundError: No module named ‘Tkinter‘

ModuleNotFoundError: No module named ‘Tkinter’ Windows 不要用 import tkinter 用from tkinter import * from tkinter import * root Tk() w Label(root, text"Hello, world!") w.pack() root.mainloop()mac python 3.10版本 brew install python-tk3.1…

技术部工作职能规划分析

前言 技术部的职能。以下是一个基本的框架,其中涵盖了技术部在公司中的关键职能和子职能。 主要职能 技术部门的主要职能分为以下几个板块: - 技术规划与战略: 制定技术规划和战略,与业务团队合作确定技术需求。 研究和预测技术趋势,引领公司在技术创新和数字化转型方…

基于springboot实现智慧党建系统项目【项目源码】计算机毕业设计

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

【Unity细节】Unity中为什么用字符串加载对象,检查多便都加载不出来—(命名细节)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

【Python】itertools模块,补充:可迭代对象、迭代器

Python中 itertools模块创建高效迭代器、处理序列数据集。 此模块所有函数返回迭代器&#xff0c;可用for循环获取迭代器中的内容&#xff0c;也可用list(...)用列表形式显示内容。 import itertools[ x for x in dir(itertools) if not x.startswith(_)] # 结果&#xff1a;…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

Centos/Linux安装Apahce出现bug汇总

源码安装Apache软件 使用软件&#xff1a;Apahce2.4.58&#xff0c;apr1.5.2&#xff0c; apr-util1.5.4 1.下载apr、apr-util和Apache软件&#xff1b; 2.安装apr压缩包&#xff0c;步骤如下&#xff1a; 第一、解压缩 tar zxvf apr-1.5.2.tar.gz第二、安装 cd /usr/local/sr…

RAID的应用场景以及优缺点

RAID 0(条带化)&#xff1a; 工作原理&#xff1a; 数据被分成块&#xff0c;每个块写入不同的驱动器&#xff0c;以并行方式提高读写性能。 优势&#xff1a; 卓越的性能提升&#xff0c;特别是对于大型文件的读写操作。 劣势&#xff1a; 完全没有冗余&#xff0c;一个驱动器…

MFC 中创建并显示二维码

1.创建并显示 QRcode* pQR_Encode; pQR_Encode QRcode_encodeString("12345678901234567890", 0, QR_ECLEVEL_H, QR_MODE_8, 1); if (pQR_Encode) { int nBmpWidth pQR_Encode->width; //获取控件的边界大小 CRect rect; Ge…

通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践

最近研究GPT&#xff0c;深入的从transfomer的原理和代码看来一下&#xff0c;现在把学习的资料和自己的理解整理一下。 这个文章写的很通俗易懂&#xff0c;把transformer的来龙去脉&#xff0c;还举例了很多不错的例子。 Transformer通俗笔记&#xff1a;从Word2Vec、Seq2S…

6 个有效且可用的顶级 Android 数据恢复工具

经过测试 42 种数据恢复软件产品&#xff0c;发现奇客数据恢复安卓版是 Android 设备的最佳选择。 过去几十年来&#xff0c;我一直在科技行业工作&#xff0c;经常帮助人们应对计算机灾难&#xff0c;包括丢失数据。 Android 数据恢复应用程序不在您的设备上运行&#xff0c…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行&#xff0c;使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&#xff0c;去掉行注释 若需要将多行进行单行注释&#xff0c;只需要选中要注释的多行&#xff0c;然后使用 Ctrl /&#xff0c; 添加行注释&#xff0c;再次使用&a…

【PTA题目】L1-6 整除光棍 分数 20

L1-6 整除光棍 分数 20 全屏浏览题目 切换布局 作者 翁恺 单位 浙江大学 这里所谓的“光棍”&#xff0c;并不是指单身汪啦~ 说的是全部由1组成的数字&#xff0c;比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如&#xff0c;111111就可以被…

leetcode中“复杂的二分”类题目

复杂的二分题目难点 第 410、1011、1482、1552、1760、2187、2226 题 1 根据题意确定二分的数据范围 2 避免死循环: 决定是int m (leftright1)/2还是int m (leftright)/2 3 返回结果的指针是left还是right 1 LC875. 爱吃香蕉的珂珂 class Solution {public int minEati…

聚焦数据要素跨域运营,构建数据要素统一大市场地方数据局局长闭门会正式召开

11月23日&#xff0c;在第二届全球数字贸易博览会期间&#xff0c;杭州市数据资源局、中国电子云、杭州数据交易所联合组织各地数据主管部门&#xff0c;召开构建数据要素统一大市场地方数据局局长闭门会&#xff0c;交流数据要素统一大市场构建思路&#xff0c;共探公共数据运…

写给女朋友的python软件开发教程——从入门到实践01——总体规划

文章目录 学习路径chatGPT文心一言 学习资源推荐理论学习——一些这些分别录制视频讲解&#xff08;后面会更&#xff09;实战——以自己想开发的一个软件为例进行教学 学习路径 问&#xff1a; 我已经有python基础了&#xff0c;想快速学会用python的pyqt开发单机软件&#x…

人人都会Blazor—— 3.2 组件

Blazor 应用是使用 Razor 组件(非正式地称为 Blazor 组件或组件)构建的。 组件是用户界面 (UI) 的自包含部分,具有用于启用动态行为的处理逻辑。 组件可以嵌套、重用、在项目间共享,并可在 MVC 和 Razor Pages 应用中使用。 组件呈现为浏览器文档对象模型 (DOM) 的内存中表…

通过一个例子理解pytest的fixture的使用

需求 希望编写登陆web后做一些操作的测试用例&#xff0c;使用pytest框架具体测试用例执行前&#xff0c;需要先拿到web的token&#xff0c;这个获取token的动作只执行一次 例一 先上测试用例代码 adminpc-1:~$ cat my_test.py import pytestclass TestWebLogin:pytest.fi…

基于springboot实现农机电招平台系统项目【项目源码+论文说明】

基于springboot实现农机电招平台系统演示 摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算…