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.pswp.cn/news/166079.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166079.shtml
英文地址,請注明出處:http://en.pswp.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;并且能夠成為大群眾廣為認可和接受的行為和選擇。設計農機電招平臺的目的就是借助計算…