singleImageUploader.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <view class="single-image-uploader">
  3. <popOver placement="bottom-end" :options="optionsList" key-name="text" isArrow ref="popoverRef"
  4. @select="selectItem">
  5. <i class="icon-font icon-camera"></i>
  6. </popOver>
  7. </view>
  8. </template>
  9. <script setup>
  10. import { ref, nextTick } from 'vue';
  11. import popOver from './popover.vue'
  12. import { uploadChooseImage, $upload, Toast } from '@/utils';
  13. import { t } from "@/locale"
  14. const props = defineProps({
  15. });
  16. const emit = defineEmits(['upload-success', 'change']);
  17. const optionsList = ref([{
  18. type: 'camera',
  19. text: '拍照'
  20. }, {
  21. type: 'album',
  22. text: '相册'
  23. }])
  24. const actionSheet = ref(null);
  25. const imageUrl = ref('');
  26. const selectItem = async (item) => {
  27. try {
  28. let file = await uploadChooseImage(item.type);
  29. file.image = file.tempFile
  30. const res = await $upload('image', file);
  31. nextTick(() => {
  32. imageUrl.value = res.data.url
  33. emit('upload-success', imageUrl.value);
  34. emit('change', imageUrl.value)
  35. })
  36. } catch (error) {
  37. // Toast(t('上传失败'))
  38. }
  39. }
  40. // 暴露方法给父组件
  41. defineExpose({
  42. getImageUrl: () => imageUrl.value,
  43. setImageUrl: (url) => {
  44. imageUrl.value = url;
  45. emit('change', url);
  46. }
  47. });
  48. </script>
  49. <style scoped>
  50. .icon-camera {
  51. color: #adb8cc;
  52. font-size: 56rpx;
  53. }
  54. </style>