SkuImgUploader.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { use } from '../../utils';
  2. import Icon from '../../icon';
  3. import Loading from '../../loading';
  4. import Uploader from '../../uploader';
  5. const [sfc, bem] = use('sku-img-uploader');
  6. export default sfc({
  7. props: {
  8. value: String,
  9. uploadImg: Function,
  10. maxSize: {
  11. type: Number,
  12. default: 6
  13. }
  14. },
  15. data() {
  16. return {
  17. // 正在上传的图片 base64
  18. paddingImg: ''
  19. };
  20. },
  21. computed: {
  22. imgList() {
  23. return this.value && !this.paddingImg ? [this.value] : [];
  24. }
  25. },
  26. methods: {
  27. afterReadFile(file) {
  28. // 上传文件
  29. this.paddingImg = file.content;
  30. this.uploadImg(file.file, file.content)
  31. .then(img => {
  32. this.$emit('input', img);
  33. this.$nextTick(() => {
  34. this.paddingImg = '';
  35. });
  36. })
  37. .catch(() => {
  38. this.paddingImg = '';
  39. });
  40. },
  41. onOversize() {
  42. this.$toast(`最大可上传图片为${this.maxSize}MB,请尝试压缩图片尺寸`);
  43. }
  44. },
  45. render(h) {
  46. const { imgList, paddingImg } = this;
  47. const ImageList = (paddingImg || imgList.length > 0) && (
  48. <div class="van-clearfix">
  49. {imgList.map(img => (
  50. <div class={bem('img')}>
  51. <img src={img} />
  52. <Icon
  53. name="clear"
  54. class={bem('delete')}
  55. onClick={() => {
  56. this.$emit('input', '');
  57. }}
  58. />
  59. </div>
  60. ))}
  61. {paddingImg && (
  62. <div class={bem('img')}>
  63. <img src={paddingImg} />
  64. <Loading type="spinner" class={bem('uploading')} />
  65. </div>
  66. )}
  67. </div>
  68. );
  69. return (
  70. <div class={bem()}>
  71. <Uploader
  72. disabled={!!paddingImg}
  73. afterRead={this.afterReadFile}
  74. maxSize={this.maxSize * 1024 * 1024}
  75. onOversize={this.onOversize}
  76. >
  77. <div class={bem('header')}>
  78. {paddingImg ? (
  79. <div>正在上传...</div>
  80. ) : (
  81. [
  82. <Icon name="photograph" />,
  83. <span class="label">{this.value ? '重拍' : '拍照'} 或 </span>,
  84. <Icon name="photo" />,
  85. <span class="label">{this.value ? '重新选择照片' : '选择照片'}</span>
  86. ]
  87. )}
  88. </div>
  89. </Uploader>
  90. {ImageList}
  91. </div>
  92. );
  93. }
  94. });