代码编织梦想

需求:
1.选择图片
2.裁剪图片
3.裁剪后的图片回显

设计思路:
1.选择图片后使用 vue-cropper 插件进行裁剪
2.裁剪后通过 this.$refs.cropper.getCropBlob((data) => {}) 方法将图片转成formData
3.将formData通过 FileReader 对象转成base64渲染达到回显效果
4.将formData传递给父组件

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

接下来就是代码了

首先安装iview,怎么安装就看文档去把,我的iview版本为2.14.3
安装 vue-cropper

npm i vue-cropper -Save

将上传图片组件化,方便在父组件使用

子组件名为 UploadHeadImg.vue 代码如下

<template>
  <div>
    <Modal
      v-model="modal1"
      title="操作图片"
      :loading="loading"
      @on-ok="uploadAvatar"
    >
      <div class="cropper">
        <vueCropper
          ref="cropper"
          :img="option.img"
          :outputSize="option.size"
          :outputType="option.outputType"
          :info="true"
          :full="option.full"
          :canMove="option.canMove"
          :canMoveBox="option.canMoveBox"
          :original="option.original"
          :autoCrop="option.autoCrop"
          :fixed="option.fixed"
          :fixedNumber="option.fixedNumber"
          :centerBox="option.centerBox"
          :infoTrue="option.infoTrue"
          :fixedBox="option.fixedBox"
        ></vueCropper>
      </div>
      <!--cropper-->
    </Modal>

    <Upload
      ref="upload"
      :show-upload-list="false"
      :format="['jpg', 'jpeg', 'png']"
      :max-size="2048"
      :before-upload="handeleBeforeUpload"
      type="drag"
      accept="image/*"
      action=""
      class="upload-box"
    >
      <div class="upload-icon" v-show="!imgSrc">
        <Icon type="ios-camera" size="40"></Icon>
      </div>
      <div class="upload-icon" v-show="imgSrc">
        <img class="upload-img" :src="imgSrc" alt="" />
      </div>
    </Upload>
  </div>
</template>

<script>
import { VueCropper } from "vue-cropper";
export default {
  name: "UploadHeadImg",
  components: {
    VueCropper,
  },
  data() {
    return {
      modal1: false,
      imgSrc: "",
      option: {
        img: "", // 裁剪图片的地址
        info: true, // 裁剪框的大小信息
        outputSize: 0.8, // 裁剪生成图片的质量
        outputType: "png", // 裁剪生成图片的格式
        canScale: false, // 图片是否允许滚轮缩放
        autoCrop: true, // 是否默认生成截图框
        // autoCropWidth: 300, // 默认生成截图框宽度
        // autoCropHeight: 200, // 默认生成截图框高度
        fixedBox: true, // 固定截图框大小 不允许改变
        fixed: true, // 是否开启截图框宽高固定比例
        fixedNumber: [1, 1], // 截图框的宽高比例
        full: true, // 是否输出原图比例的截图
        canMoveBox: false, // 截图框能否拖动
        original: false, // 上传图片按照原始比例渲染
        centerBox: false, // 截图框是否被限制在图片里面
        infoTrue: true, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
      },
      fileinfo: "",
      // 防止重复提交
      loading: false,
    };
  },

  mounted() {},

  methods: {
    handeleBeforeUpload(file) {
      this.fileinfo = file;
      let data = window.URL.createObjectURL(new Blob([file]));
      this.option.img = data;
      this.modal1 = true;
      return false; //取消自动上传
    },
    uploadAvatar() {
      let that = this;
      this.$refs.cropper.getCropBlob((data) => {
        that.loading = true;
        that.$refs.upload.clearFiles();
        let formData = new FormData();
        formData.append("file", data);
        let file = formData.get("file");
        // 转为 base64
        let reader = new FileReader();
        reader.onload = function () {
          // base64结果
          that.imgSrc = this.result;
          that.loading = false;
        };
        reader.readAsDataURL(file);
        that.$emit('getFormdata', file);
      });
    },
  },
};
</script>

<style lang="scss" scoped>
.cropper {
  width: auto;
  height: 300px;
}
.upload-box {
  margin: 20px;
  display: inline-block;
  ::v-deep .ivu-upload.ivu-upload-drag{
    border: 1px dashed #999 !important;
  }
}
.upload-box,
.upload-icon,
.upload-img {
  width: 120px;
  height: 120px;
}
.upload-icon {
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

子组件写好了之后就到父组件使用了

父组件代码如下

<template>
    <div>
        <UploadHeadImg @getFormdata="getFormdata"></UploadHeadImg>
    </div>
</template>

<script>
import UploadHeadImg from '@/components/UploadHeadImg.vue'
export default {
    name: 'ClientHome',
    components:{
        UploadHeadImg
    },
    data() {
        return {};
    },
    methods: {
        getFormdata(v){
            console.log(v); // 子组件自定义事件传过来的formData,后续用来上传到后端
        }
    },
};
</script>
<style lang="scss" scoped>
</style>

以上就是全部代码了,对你有帮助的话记得点赞收藏哦

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45146319/article/details/127158360

vue相关组件或框架集合 - awesome-github-vue_小虾suki的博客-爱代码爱编程_awesome-github-vue

参考:awesome-github-vue awesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库集合。 UI组件 element ★13489 - 饿了么出品的

vue组件汇总_无名之辈2018的博客-爱代码爱编程_vue组件汇总

内容 UI组件开发框架实用库服务端辅助工具应用实例Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件Vux ★8133 - 基于Vue和WeUI的组件库iview ★6634

VUE图片裁剪工具VueCropper的使用方法-爱代码爱编程

安装依赖 npm install vue-cropper --save-dev 前端代码 注意: 前端我是使用了VUE+IVIEW,有些标签可能需要先引入iview才不会报错,例如Row 和Col <template> <div id="imageCropper"> <Row class="mt-2"&g

vue+图片裁剪vue-cropper以及api-爱代码爱编程

前言:         因为项目需要,需要实现一个上传完图片,对图片进行二次处理的需求,就使用了vue-cropper来实现这个功能,总的来说还是感觉非常不错的软件,这里分享下我的使用方法,以及vue-cropper的api(见最下) 实现效果: 实现步骤: 步骤一:项目中安装 vue-cropper npm install vue-crop

基于Vue+iview的头像剪切上传vue-cropper-爱代码爱编程

写项目的时候遇到了一个头像的更改,也就是要对要上传的图片进行裁剪,然后再上传; 默认已经安装了iview 安装 npm install vue-cropper -Save 使用 在要使用的页面的template中引入 <Modal v-model="modal1" title="操作图片" :l

vue-cropper实现图片裁剪上传-爱代码爱编程

1.图片裁剪组件photoCut.vue <template> <div> <div class="info-item"> <div class="line"> <div class="cropper-content"> <div

史上最全的vue插件库-爱代码爱编程

无意间发现的一个整合内容,超级强大,赶紧记录下来!原文链接 内容 UI组件开发框架实用库服务端辅助工具应用实例Demo示例UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件Vux ★8133 - 基于Vue和WeUI的组件库iview ★6634 - 基于 Vuejs 的开源 UI 组件库mint-ui ★6253

vue图片宽高自适应_vue项目如何监听窗口变化,达到页面自适应?-爱代码爱编程

欢迎关注前端小讴的github,阅读更多原创技术文章 【自适应】向来是前端工程师需要解决的一大问题——即便作为当今非常火热的vue框架,也无法摆脱——虽然elementui、iview等开源UI组件库层出不穷,但官方库毕竟不可能满足全部需求,因此我们可以通过【监听窗口变化】达到想要的绝大部分自适应效果。 获取窗口宽度:document.bod

VUE开源项目大全地址-爱代码爱编程

原文地址 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和WeUI的组件库 iview ★6634 - 基于 Vuejs 的开源 UI 组件库 mint-ui ★6253 - Vue 2的移动UI元素 muse-ui ★3705 - 三端样式一致的响应式 UI 库 vue-material

html vue iview,【Vue】iview 不知道是不是版本问题,一直报错,求解决!-爱代码爱编程

这是我使用的方式,完全参考官网的: // The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from

基于vue的图片裁剪vueCropper,不规则/固定比例裁剪,图片裁剪后上传,upload组件,裁剪组件 element UI-爱代码爱编程

实现功能: 在上传图片之前,按照一定比例或不规则进行剪裁,剪裁后上传到服务器,实现绝大部分的图片裁剪上传的需求,代码有注释。效果图: 安装 npm install vue-cropper 使用 import { VueCropper } from 'vue-cropper' 上传图片 html <el-upload act

vue图片裁剪固定尺寸/vue-cropper的使用-爱代码爱编程

需求: 用户上传图片不符合大小,提供工具进行裁剪(类似上传头像一样处理) 解决: 使用vue-cropper插件完成插件官网: https://github.com/xyxiao001/vue-cropper效果图片: 代码: 安装依赖npm install vue-cropper 全局挂载(main.js文件中)import VueCr

vue3中使用vue-i18n(ts中使用$t, vue3不用this)_一只爱吃糖的小羊的博客-爱代码爱编程

vue项目里多语言工具一直用的vue-i18n。 以前用的 vue2,也没啥大问题,就是配置好之后用t(“你的属性名”)就行,现在用vue3其实本来也没太大变化。 但是配置完之后,在html中用$t()没有问题,显示文案什么

封装vue图片裁剪vue-爱代码爱编程

封装Vue图片裁剪vue-cropper使用 下载依赖 npm i vue-cropper --save 封装好的裁剪图片的组件可直接拿来用 cropper.vue文件: <template>