当前位置:   article > 正文

头像上传和图片裁剪功能(cropper.js)_移动端js上传头像调整位置

移动端js上传头像调整位置
  1. <template>
  2.   <div class="user-profile">
  3.     <input type="file" name="" id="" ref="file" hidden @change="onFileChange" />
  4.     <!-- 个人信息 -->
  5.     <van-cell title="头像" is-link @click="$refs.file.click()">
  6.       <van-image class="avatar" fit="cover" round :src="user.photo" />
  7.     </van-cell>
  8.   //此为组件
  9.     <!-- 修改头像 -->
  10.     <van-popup
  11.       style="height: 100%"
  12.       position="bottom"
  13.       v-model="isUpdatePhotoShow"
  14.     >
  15.       <updatePhoto
  16.       :img="img"
  17.       @close="isUpdatePhotoShow = false"
  18.       v-if="isUpdatePhotoShow"
  19.       @updatePhoto="user.photo = $event"
  20.       />
  21.     </van-popup>
  22.     <!-- 修改头像 -->
  23.   </div>
  24. </template>
  25. export default {
  26. data() {
  27. return {
  28. user: {}, //用户的个人资料
  29. isUpdatePhotoShow: false, //头像弹出层
  30. img: null,
  31. };
  32. },
  33. created() {
  34. this.loadProfile();
  35. },
  36. components: {
  37. updatePhoto,
  38. },
  39. methods: {
  40. //调取接口,获取user数据
  41. async loadProfile() {
  42. try {
  43. const { data } = await getProfileList();
  44. this.user = data.data;
  45. } catch (err) {
  46. this.$toast("数据加载失败,请稍后重试");
  47. }
  48. },
  49. onFileChange() {
  50. // 获取文件对象
  51. const file = this.$refs.file.files[0];
  52. // console.log(file);
  53. // 基于文章对象获取blob数据
  54. let binaryData = [];
  55. binaryData.push(file);
  56. const data = window.URL.createObjectURL(
  57. new File(binaryData, { type: "application/pdf;chartset=UTF-8" })
  58. );
  59. this.img = data;
  60. //解决bug,解决选择的头像是同一张,然后不弹出弹层的问题
  61. //把每次选择的默认值清空
  62. this.$refs.file.value = "";
  63. //图片选择好了之后,弹出弹层
  64. this.isUpdatePhotoShow = true;
  65. },
  66. },
  67. };

以下为图片裁剪组件(图片裁剪主要是要使用cropper.js这个插件,然后配置一下)

  1. <template>
  2. <div class="updatePhoto">
  3. <img :src="img" alt="" class="img" ref="img" />
  4. <div class="toolbar">
  5. <div class="cancel" @click="$emit('close')">取消</div>
  6. <div class="confirm" @click="onConfirm">完成</div>
  7. </div>
  8. </div>
  9. </template>
  10. <script>
  11. import "cropperjs/dist/cropper.css";
  12. import Cropper from "cropperjs";
  13. import { updateUserPhoto } from '@/api/login.js'
  14. export default {
  15. props: {
  16. img: {
  17. type: [String, Object],
  18. require: true,
  19. },
  20. },
  21. data(){
  22. return {
  23. cropper:null,
  24. }
  25. },
  26. mounted() {
  27. const image = this.$refs.img;
  28. this.cropper = new Cropper(image, {
  29. // 配置裁剪参数
  30. viewMode: 1,
  31. dragMode: "move",
  32. aspectRatio: 1,
  33. autoCropArea: 1,
  34. cropBoxMovable: false,
  35. cropBoxResizable: false,
  36. background: false,
  37. });
  38. },
  39. methods:{
  40. onConfirm(){
  41. // 基于服务端的裁切使用getData方法获取裁切参数
  42. // console.log(this.cropper.getData())
  43. // 纯客户端的裁切使用getCroppedCanvas获取裁切文件对象
  44. this.cropper.getCroppedCanvas().toBlob(blob => {
  45. this.updatePhoto(blob)
  46. })
  47. },
  48. async updatePhoto(blob){
  49. // 接口要求必须传formData格式
  50. const formData = new FormData()
  51. formData.append('photo',blob)
  52. try{
  53. const { data } = await updateUserPhoto(formData)
  54. this.$emit('close') //关闭弹窗
  55. this.$emit('updatePhoto',data.data.photo)//更新图片
  56. this.$toast.success('更新成功')
  57. }catch(err){
  58. this.$toast.fail('更新失败')
  59. }
  60. }
  61. }
  62. };
  63. </script>
  64. <style scoped lang="less">
  65. .updatePhoto {
  66. height: 100%;
  67. // display: flex;
  68. // justify-content: center;
  69. // align-items: center;
  70. background-color: #000;
  71. .img {
  72. max-width: 100%;
  73. display: block;
  74. }
  75. .toolbar {
  76. // border: 1px solid blue;
  77. position: fixed;
  78. bottom: 0px;
  79. left: 0px;
  80. right: 0px;
  81. display: flex;
  82. justify-content: space-between;
  83. .cancel,
  84. .confirm {
  85. width: 90px;
  86. height: 90px;
  87. font-size: 40px;
  88. display: flex;
  89. justify-content: center;
  90. align-items: center;
  91. color: #fff;
  92. }
  93. }
  94. }
  95. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/565207
推荐阅读
相关标签
  

闽ICP备14008679号