index.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { Icon, Image, Toast, Uploader } from "vant";
  2. import { defineComponent } from "vue";
  3. import styles from "./index.module.less";
  4. import iconUploader from '@common/images/icon_uploader.png';
  5. import request from "@/helpers/request";
  6. export default defineComponent({
  7. name: 'col-upload',
  8. props: {
  9. value: String,
  10. tips: {
  11. type: String,
  12. default: '点击上传'
  13. },
  14. deletable: {
  15. type: Boolean,
  16. default: true
  17. }
  18. },
  19. mounted() {
  20. // console.log(this.value, 'uploader');
  21. },
  22. methods: {
  23. beforeRead(file: any) {
  24. const isLt2M = file.size / 1024 / 1024 < 5
  25. if (!isLt2M) {
  26. Toast('上传文件大小不能超过 5MB')
  27. return false
  28. }
  29. return true
  30. },
  31. beforeDelete(file: any, detail: { index: any; }) {
  32. // this.dataModel.splice(detail.index, 1)
  33. return true
  34. },
  35. async afterRead(file: any, detail: any) {
  36. try {
  37. file.status = 'uploading';
  38. file.message = '上传中...';
  39. let formData = new FormData();
  40. formData.append('file', file.file);
  41. let res = await request.post('/api-teacher/uploadFile', {
  42. data: formData
  43. })
  44. this.$emit('update:value', res.data.url);
  45. } catch (error) {
  46. //
  47. }
  48. },
  49. onClose(e: any) {
  50. this.$emit('update:value', null);
  51. e.stopPropagation();
  52. },
  53. },
  54. render() {
  55. return (
  56. <div class={styles['uploader-section']}>
  57. {/* @ts-ignore */}
  58. <Uploader afterRead={this.afterRead} beforeRead={this.beforeRead} beforeDelete={this.beforeDelete}
  59. v-slots={{
  60. default: () => (this.value ? <div class={styles['img-section']} onClick={this.onClose}>
  61. { this.deletable ? <Icon name="cross" class={styles["img-close"]} /> : null }
  62. <Image fit="cover" class={styles.uploadImg} src={this.value} />
  63. </div> : <div class={styles.uploader}>
  64. <Icon name={iconUploader} size="32" />
  65. <p class={styles.uploaderText}>{this.tips}</p>
  66. </div> )
  67. }}
  68. />
  69. </div>
  70. )
  71. }
  72. })