最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue項(xiàng)目實(shí)現(xiàn)添加圖片裁剪組件

 更新時(shí)間:2022年03月31日 11:41:27   作者:帥_帥  
這篇文章主要為大家詳細(xì)介紹了vue項(xiàng)目實(shí)現(xiàn)添加圖片裁剪組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了vue項(xiàng)目添加圖片裁剪組件的具體代碼,供大家參考,具體內(nèi)容如下

功能如下圖所示:

1、安裝命令如下

npm i vue-cropper --save

2、調(diào)用組件,引入vue-cropper

import { VueCropper } from “vue-cropper”;

3、封裝組件代碼如下:cropper.vue

<template>
? <div class="cropper_model">
? ? <el-dialog
? ? ? title="圖片剪裁"
? ? ? width="800px"
? ? ? class="cropper_model_dlg"
? ? ? :visible.sync="dialogVisible"
? ? ? append-to-body
? ? ? :close-on-click-modal="false"
? ? ? :close-on-press-escape="false"
? ? >
? ? ? <div class="cropper_content">
? ? ? ? <div class="cropper" style="text-align: center;">
? ? ? ? ? <vueCropper
? ? ? ? ? ? ref="cropper"
? ? ? ? ? ? :img="options.img"
? ? ? ? ? ? :outputSize="options.outputSize"
? ? ? ? ? ? :outputType="options.outputType"
? ? ? ? ? ? :info="options.info"
? ? ? ? ? ? :canScale="options.canScale"
? ? ? ? ? ? :autoCrop="options.autoCrop"
? ? ? ? ? ? :autoCropWidth="options.autoCropWidth"
? ? ? ? ? ? :autoCropHeight="options.autoCropHeight"
? ? ? ? ? ? :fixed="options.fixed"
? ? ? ? ? ? :fixedBox="options.fixedBox"
? ? ? ? ? ? :fixedNumber="options.fixedNumber"
? ? ? ? ? ? @realTime="previewImg"
? ? ? ? ? >
? ? ? ? ? </vueCropper>
? ? ? ? ? <div class="cropper_btns">
? ? ? ? ? ? <el-button type="primary" @click="goUpload" size="mini">
? ? ? ? ? ? ? 重新上傳
? ? ? ? ? ? </el-button>
? ? ? ? ? ? <el-button
? ? ? ? ? ? ? @click="rotateLeft"
? ? ? ? ? ? ? icon="el-icon-refresh-left"
? ? ? ? ? ? ? size="mini"
? ? ? ? ? ? ? title="左旋轉(zhuǎn)"
? ? ? ? ? ? >
? ? ? ? ? ? </el-button>
? ? ? ? ? ? <el-button
? ? ? ? ? ? ? @click="rotateRight"
? ? ? ? ? ? ? icon="el-icon-refresh-right"
? ? ? ? ? ? ? size="mini"
? ? ? ? ? ? ? title="右旋轉(zhuǎn)"
? ? ? ? ? ? >
? ? ? ? ? ? </el-button>
? ? ? ? ? ? <el-button @click="changeScale(1)" size="mini" title="放大">
? ? ? ? ? ? ? +
? ? ? ? ? ? </el-button>
? ? ? ? ? ? <el-button @click="changeScale(-1)" size="mini" title="縮小">
? ? ? ? ? ? ? -
? ? ? ? ? ? </el-button>
? ? ? ? ? </div>
? ? ? ? </div>
? ? ? ? <div class="cropper_right">
? ? ? ? ? <h3>預(yù)覽</h3>
? ? ? ? ? <!-- 預(yù)覽 -->
? ? ? ? ? <div
? ? ? ? ? ? class="cropper_preview"
? ? ? ? ? ? :style="{
? ? ? ? ? ? ? width: preview.w + 'px',
? ? ? ? ? ? ? height: preview.h + 'px',
? ? ? ? ? ? ? overflow: 'hidden',
? ? ? ? ? ? ? margin: '5px'
? ? ? ? ? ? }"
? ? ? ? ? >
? ? ? ? ? ? <div :style="preview.div">
? ? ? ? ? ? ? <img :src="preview.url" :style="preview.img" alt="" />
? ? ? ? ? ? </div>
? ? ? ? ? </div>
? ? ? ? ? <div style="margin-top: 100px;">
? ? ? ? ? ? <el-button type="primary" @click="uploadImg" :loading="loading">
? ? ? ? ? ? ? 確定上傳
? ? ? ? ? ? </el-button>
? ? ? ? ? </div>
? ? ? ? </div>
? ? ? </div>
? ? ? <!-- <div slot="footer" class="dialog-footer">
? ? ? ? <el-button @click="downLoad('blob')">下載</el-button>
? ? ? ? <el-button @click="dialogVisible = false">取消</el-button>
? ? ? ? <el-button type="primary" @click="uploadImg" :loading="loading">
? ? ? ? ? 確認(rèn)
? ? ? ? </el-button>
? ? ? </div> -->
? ? </el-dialog>
? </div>
</template>

<script>
import { VueCropper } from "vue-cropper";
export default {
? components: { VueCropper },
? data() {
? ? return {
? ? ? dialogVisible: false,
? ? ? loading: false,
? ? ? options: {
? ? ? ? img: "", // 裁剪圖片的地址
? ? ? ? outputSize: 1, // 裁剪生成圖片的質(zhì)量
? ? ? ? outputType: "png", // 裁剪生成圖片的格式
? ? ? ? info: true, // 裁剪框的大小信息
? ? ? ? canScale: true, // 圖片是否允許滾動(dòng)縮放
? ? ? ? autoCrop: true, // 是否默認(rèn)生成截圖狂
? ? ? ? autoCropWidth: 100, // 默認(rèn)生成截圖框?qū)挾?
? ? ? ? autoCropHeight: 100, // 默認(rèn)生成截圖框高度
? ? ? ? fixed: true, // 是否開啟截圖框?qū)捀吖潭ū壤?
? ? ? ? fixedNumber: [1, 1], // 截圖框的寬高比例
? ? ? ? full: true, // 是否輸出原圖比例的截圖
? ? ? ? fixedBox: true, // 固定截圖框大小 不允許改變
? ? ? ? canMove: true, // 上傳圖片是否可以移動(dòng)
? ? ? ? canMoveBox: true, // 截圖框能否拖動(dòng)
? ? ? ? original: true, // 上傳圖片按照原始比例渲染
? ? ? ? centerBox: false, // 截圖框是否被限制在圖片里面
? ? ? ? high: false, // 是否按照設(shè)備的dpr輸出等比例圖片
? ? ? ? infoTrue: true, // true為展示真實(shí)輸出圖片寬高false展示看到的截圖框?qū)捀?
? ? ? ? maximgSize: 100, // 限制圖片最大寬度和高度
? ? ? ? enlarge: 1, // 圖片根據(jù)截圖框輸出比例倍數(shù)
? ? ? ? mode: "contain" // 圖片默認(rèn)渲染方式(contain, cover, 100px, 100% auto)
? ? ? },
? ? ? preview: {}
? ? };
? },
? methods: {
? ? open(data) {
? ? ? this.options.img = window.URL.createObjectURL(data);
? ? ? this.dialogVisible = true;
? ? },
? ? close(){
? ? ? this.dialogVisible = false;
? ? },
? ? // base64轉(zhuǎn)圖片文件
? ? dataURLtoFile(dataurl, filename) {
? ? ? let arr = dataurl.split(",");
? ? ? let mime = arr[0].match(/:(.*?);/)[1];
? ? ? let bstr = atob(arr[1]);
? ? ? let len = bstr.length;
? ? ? let u8arr = new Uint8Array(len);
? ? ? while (len--) {
? ? ? ? u8arr[len] = bstr.charCodeAt(len);
? ? ? }
? ? ? return new File([u8arr], filename, { type: mime });
? ? },
? ? downLoad(type) {
? ? ? event.preventDefault();
? ? ? const aLink = document.createElement("a");
? ? ? if (type === "blob") {
? ? ? ? this.$refs.cropper.getCropBlob(data => {
? ? ? ? ? let downImg = window.URL.createObjectURL(data);
? ? ? ? ? aLink.download = "photo.png";
? ? ? ? ? aLink.href = downImg;
? ? ? ? ? aLink.click();
? ? ? ? });
? ? ? } else {
? ? ? ? this.$refs.cropper.getCropData(data => {
? ? ? ? ? let file = this.dataURLtoFile(data, "test");
? ? ? ? ? aLink.href = file;
? ? ? ? ? aLink.click();
? ? ? ? });
? ? ? }
? ? },
? ? // 左旋轉(zhuǎn)
? ? rotateLeft() {
? ? ? this.$refs.cropper.rotateLeft();
? ? },
? ? // 右旋轉(zhuǎn)
? ? rotateRight() {
? ? ? this.$refs.cropper.rotateRight();
? ? },
? ? // 放大縮小
? ? changeScale(num) {
? ? ? num = num || 1;
? ? ? this.$refs.cropper.changeScale(num);
? ? },
? ? // 實(shí)時(shí)預(yù)覽
? ? previewImg(data) {
? ? ? this.preview = data;
? ? },
? ? goUpload() {
? ? ? this.$emit("upAgain");
? ? },
? ? // 上傳圖片
? ? uploadImg() {
? ? ? let self = this;
? ? ? self.loading = true;
? ? ? this.$refs.cropper.getCropData(data => {
? ? ? ? let file = this.dataURLtoFile(data, "photo.png");
? ? ? ? // 生成文件類型
? ? ? ? self.loading = false;
? ? ? ? this.$emit("getFile",file)
? ? ? });
? ? },
? ? //自定義上傳,裁剪后調(diào)用
? }
};
</script>

<style lang="less" scoped>
.cropper_model_dlg {
? .cropper_content {
? ? margin: 0 auto;
? ? width: 700px;
? ? height: 450px;
? ? display: flex;
? ? justify-content: space-between;
? ? align-items: flex-start;
? }
? .cropper {
? ? width: 400px;
? ? height: 400px;
? ? background: yellow;
? }
? .cropper_right {
? ? width: 300px;
? ? text-align: center;
? }
? .cropper_preview {
? ? margin: 0 auto;
? ? display: inline-block;
? ? border: 1px solid #ddd;
? }
? .cropper_btns {
? ? margin-top: 20px;
? }
}
</style>

4、在其他vue組件使用,引用cropper.vue

import MyCropper from "./cropper.vue"

export default里面添加

components:{MyCropper},

html中引入

<my-cropper ref="myCropper" @getFile="getFile" @upAgain="upAgain"></my-cropper>

對(duì)應(yīng)的js方法代碼

upAgain(){
? ? ? ? ? ? ? ? this.$refs['upload'].$refs["upload-inner"].handleClick();
? ? ? ? ? ? },

getFile(file){
? ? ? ? ? ? ? ? const formData = new FormData();
? ? ? ? ? ? ? ? formData.append("file",file)
? ? ? ? ? ? ? ? uploadSelfCompanyLogo(formData).then(res =>{
? ? ? ? ? ? ? ? ? ? if (res.code === 0) {
? ? ? ? ? ? ? ? ? ? ? ? this.companyInfo.logo = res.filename;
? ? ? ? ? ? ? ? ? ? ? ? this.companyInfo.imageUrl = res.url;
? ? ? ? ? ? ? ? ? ? ? ? this.imageUrl = res.url;
? ? ? ? ? ? ? ? ? ? ? ? //上傳成功后,關(guān)閉彈框組件
? ? ? ? ? ? ? ? ? ? ? ? // this.handleCrop(file);
? ? ? ? ? ? ? ? ? ? ? ? this.$refs.myCropper.close()

? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? this.$message.error('上傳出錯(cuò)');
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ?// this.$refs.upload.submit();
?},

注意:以上代碼并不完整, 裁剪組件和elementUI組件中的el-upload的結(jié)合使用方法如鏈接裁剪組件和el-uplod結(jié)合

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • el-table-column疊加el-popover使用示例小結(jié)

    el-table-column疊加el-popover使用示例小結(jié)

    el-table-column有一列展示多個(gè)tag信息,實(shí)現(xiàn)點(diǎn)擊tag展示tag信息以及tag對(duì)應(yīng)的詳細(xì)信息,本文通過示例代碼介紹el-table-column疊加el-popover使用示例小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Vue.js中數(shù)據(jù)綁定的語法教程

    Vue.js中數(shù)據(jù)綁定的語法教程

    Vue框架很核心的功能就是雙向的數(shù)據(jù)綁定。下面這篇文章主要給大家介紹了關(guān)于Vue.js中數(shù)據(jù)綁定的語法教程,文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • 詳解vuex之store拆分即多模塊狀態(tài)管理(modules)篇

    詳解vuex之store拆分即多模塊狀態(tài)管理(modules)篇

    這篇文章主要介紹了詳解vuex之store拆分即多模塊狀態(tài)管理(modules)篇,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue3自己封裝面包屑功能組件的幾種方式

    vue3自己封裝面包屑功能組件的幾種方式

    網(wǎng)站中我們經(jīng)??吹接袀€(gè)導(dǎo)航路徑,可以直觀地顯示當(dāng)前頁面的路徑,并快速返回之前的任意頁面,這是一個(gè)非常實(shí)用的功能,也是在Web前端必備的導(dǎo)航UI之一,這篇文章主要給大家介紹了關(guān)于vue3自己封裝面包屑功能組件的幾種方式,需要的朋友可以參考下
    2021-09-09
  • vue+vue-meta-info動(dòng)態(tài)設(shè)置meta標(biāo)簽教程

    vue+vue-meta-info動(dòng)態(tài)設(shè)置meta標(biāo)簽教程

    這篇文章主要介紹了vue+vue-meta-info動(dòng)態(tài)設(shè)置meta標(biāo)簽教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 在vue.js中使用JSZip實(shí)現(xiàn)在前端解壓文件的方法

    在vue.js中使用JSZip實(shí)現(xiàn)在前端解壓文件的方法

    今天小編就為大家分享一篇在vue.js中使用JSZip實(shí)現(xiàn)在前端解壓文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue 解決路由過渡動(dòng)畫抖動(dòng)問題(實(shí)例詳解)

    Vue 解決路由過渡動(dòng)畫抖動(dòng)問題(實(shí)例詳解)

    這篇文章主要介紹了Vue 解決路由過渡動(dòng)畫抖動(dòng)問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Vue分頁組件實(shí)現(xiàn)過程詳解

    Vue分頁組件實(shí)現(xiàn)過程詳解

    Web應(yīng)用程序中資源分頁不僅對(duì)性能很有幫助,而且從用戶體驗(yàn)的角度來說也是非常有用的。在這篇文章中,將了解如何使用Vue創(chuàng)建動(dòng)態(tài)和可用的分頁組件
    2022-12-12
  • vue3中實(shí)現(xiàn)拖拽排序代碼示例(vue-draggable-next的使用)

    vue3中實(shí)現(xiàn)拖拽排序代碼示例(vue-draggable-next的使用)

    在Vue3中使用拖拽功能時(shí)應(yīng)選用vue-draggable-next插件,傳統(tǒng)的draggable插件不兼容Vue3,可能導(dǎo)致TypeError錯(cuò)誤,安裝后,需在項(xiàng)目中引入并使用,具體步驟包括安裝插件、引入使用、查看效果和相關(guān)說明,需要的朋友可以參考下
    2024-09-09
  • vue3+Element?Plus?v-model實(shí)現(xiàn)父子組件數(shù)據(jù)同步的案例代碼

    vue3+Element?Plus?v-model實(shí)現(xiàn)父子組件數(shù)據(jù)同步的案例代碼

    這篇文章主要介紹了vue3+Element?Plus?v-model實(shí)現(xiàn)父子組件數(shù)據(jù)同步,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

信阳市| 通州区| 瓦房店市| 绥宁县| 浮梁县| 平山县| 祁阳县| 咸丰县| 偏关县| 保亭| 仁化县| 广西| 和龙市| 扬中市| 肥城市| 尚志市| 黄龙县| 长宁区| 江孜县| 青川县| 上思县| 上犹县| 山东省| 明水县| 日喀则市| 临安市| 札达县| 铁力市| 隆化县| 阿坝| 铜梁县| 虞城县| 行唐县| 梓潼县| 镇远县| 乌拉特前旗| 汶上县| 金溪县| 成安县| 伽师县| 晋江市|