vue项目--实现编辑裁剪图片上传头像的功能

实现编辑裁剪图片上传头像的功能

1.父页面创建一个input标签,隐藏显示 ,绑定ref 供下边获取选择的文件

  <input @change="avaChange" type="file" ref="avator" hidden>

2.触发选择头像图片事件 打开选择文件

  <van-cell @click="editAvator" title="头像" is-link>
      <van-image fit="cover" round class="avater" :src="userInfo.photo" />
  </van-cell>
 editAvator() {
    this.$refs.avator.click()
    console.log('头像', this.$refs.avator);
},

3.选择图片 使用window.URL.createObjectURL()方法构建一个本地的blob对象路径

avaChange() {
    console.log('改变了', this.$refs.avator.files[0]);
    //获取文件对象  
    //基于文章对象获取blob数据
    this.img_src = window.URL.createObjectURL(this.$refs.avator.files[0])
    console.log(' this.img_src', this.img_src);
    this.isUpdateAvaShow = true
    //如果选择同一个文件不会触发change事件  清空value
    this.$refs.avator.value = ''
},

4.创建头像裁剪组件 并将图片传递过去

<van-popup v-model="isUpdateAvaShow" style="height: 100%;" position="bottom">
    <editAvater v-if="isUpdateAvaShow" @upImg="userInfo.photo = $event" @closePop="isUpdateAvaShow = false"
        :img_src="img_src">
    </editAvater>
</van-popup>

5.组件页面初始化 设置基本样式

<div class="box">
        <img ref="img" class="imgbox" :src="img_src" alt="">
        <div class="tool">
            <div class="cel" @click="$emit('closePop')">取消</div>
            <div class="cfm" @click="finish">完成</div>
        </div>
    </div>
.box {
    background-color: #000;
    height: 100%;
    color: #fff;
}

.imgbox {
    max-width: 100%;
    display: block;
}

.tool {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    justify-content: space-between;

    .cel,
    .cfm {
        width: 90px;
        height: 90px;
        font-size: 30px;
        display: flex;
        justify-content: center;
        align-items: center;
    }
}

6.安装引入cropperjs

npm install cropperjs
import 'cropperjs/dist/cropper.css'
import Cropper from 'cropperjs'

7.mounted中挂载配置项

//data中 定义cropper: null
mounted() {
    const image = this.$refs.img
    this.cropper = new Cropper(image, {
        viewMode: 1, // 只能在裁剪的图片范围内移动
        dragMode: 'move', // 画布可以移动
        aspectRatio: 1, // 裁剪区默认正方形
        autoCropArea: 1, // 自动调整裁剪图片
        cropBoxMovable: false, // 禁止裁剪区移动
        cropBoxResizable: false, // 禁止裁剪区缩放
        background: false // 关闭默认背景
    })
    console.log(this.cropper)
},

8.裁剪的两种方式(服务端,客户端) 配置完成方法

finish() {
    //基于服务器端的裁切使用 getData方法获取裁切参数
    // console.log(this.cropper.getData())
    // 纯客户端 的裁切使用 getCroppedCanvas 获取裁切的文件对象
    this.cropper.getCroppedCanvas().toBlob(async blob => {
        console.log(blob)
    })
}

9.请求接口,传递数据,回显头像

finish() {
    this.cropper.getCroppedCanvas().toBlob(async blob => {
        console.log(blob)
        //如果接口 Content-Type是multipart/form-data
        //必须传递FormData对象

        //如果接口 Content-Type是application/json
        //传普通js对象
        const formData = new FormData()
        formData.append('photo', blob)
        const data = await editAvaterApi(formData)
        console.log('data111', data);
        //关闭弹出层
        this.$emit('closePop')
        //更新视图
        this.$emit('upImg', data.data.data.photo)
    })
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gik99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值