g-upload.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <view class="imglistbx">
  3. <view :class="['imglistItem',columnNum==3?'column3':'column4']" v-for="(item,index) in showList" :key='index'>
  4. <image :src="item" class="itemImg" @click="previewImage(index)" mode="aspectFill"></image>
  5. <icon size="18" type="cancel" class="cancelBtn" @click="deleteImg(index)" v-if="deleteBtn"></icon>
  6. </view>
  7. <!-- 上传控件 -->
  8. <view :class="['imglistItem',columnNum==3?'column3':'column4']" @click="uploadImg" v-if="control&&showControl">
  9. <view class="itemImg uploadControl">+</view>
  10. </view>
  11. <view class="clear"></view>
  12. </view>
  13. </template>
  14. <script>
  15. export default {
  16. props: {
  17. //是否显示上传控件
  18. control: {
  19. type: Boolean,
  20. default: true
  21. },
  22. //是否显示上删除按钮
  23. deleteBtn: {
  24. type: Boolean,
  25. default: true
  26. },
  27. //行数量
  28. columnNum: {
  29. type: [Number, String],
  30. default: 4
  31. },
  32. //上传最大数量
  33. maxCount: {
  34. type: Number,
  35. default: 4
  36. },
  37. //服务返回回调的图片数组--回填
  38. mode: {
  39. type: Array,
  40. default: function() {
  41. return []
  42. }
  43. }
  44. },
  45. data() {
  46. return {
  47. imgList: [],
  48. showList: [],
  49. showControl: true
  50. }
  51. },
  52. watch: {
  53. mode(v) {
  54. this.init(v)
  55. },
  56. showList(){
  57. if (this.showList.length >= this.maxCount) {
  58. this.showControl = false
  59. return
  60. };
  61. this.showControl = true;
  62. }
  63. },
  64. created() {
  65. this.init(this.mode)
  66. },
  67. methods: {
  68. init(v) {
  69. if (this.mode.length != 0) {
  70. this.showList = v;
  71. return
  72. };
  73. this.showList = this.imgList;
  74. },
  75. // 上传图片
  76. uploadImg() {
  77. uni.chooseImage({
  78. sizeType: ['compressed '],
  79. count: this.maxCount,
  80. success: (chooseImageRes) => {
  81. let tempFilePaths = chooseImageRes.tempFilePaths;
  82. tempFilePaths=tempFilePaths.slice(0,this.maxCount-this.showList.length);
  83. tempFilePaths.forEach((item) => {
  84. this.imgList.push(item);
  85. })
  86. this.$emit("chooseFile", this.imgList, tempFilePaths)
  87. }
  88. });
  89. },
  90. //删除图片
  91. deleteImg(eq) {
  92. let deleteImg = this.imgList;
  93. deleteImg.splice(eq, 1); //删除临时路径
  94. if (this.mode.length > 0) {
  95. let deleteImg = this.showList;
  96. deleteImg.splice(eq, 1); //删除服务那边的路径
  97. }
  98. this.$emit("imgDelete", this.handleImg(), eq)
  99. },
  100. // 预览图片
  101. previewImage(eq) {
  102. let getUrl = this.handleImg();
  103. uni.previewImage({
  104. current: getUrl[eq],
  105. urls: getUrl
  106. })
  107. },
  108. //返回需要操作的图片数组
  109. //如果是回调了则操作回填后的数组 否则操作临时路径的图片数组
  110. handleImg() {
  111. return this.mode.length > 0 ? this.showList : this.imgList
  112. },
  113. }
  114. }
  115. </script>
  116. <style scoped>
  117. /* 上传 str */
  118. .imglistbx {
  119. width: 100%;
  120. height: 100%;
  121. }
  122. .imglistItem {
  123. position: relative;
  124. float: left;
  125. margin-bottom: 20rpx;
  126. border-radius: 10rpx;
  127. }
  128. .column3 {
  129. width: 33.3333%;
  130. height: 160rpx;
  131. }
  132. .column4 {
  133. width: 25%;
  134. height: 130rpx;
  135. }
  136. .itemImg {
  137. width: 70%;
  138. height: 100%;
  139. margin: 0 auto;
  140. display: block;
  141. border-radius: 10rpx;
  142. }
  143. .cancelBtn {
  144. position: absolute;
  145. top: -10rpx;
  146. right: 10rpx;
  147. }
  148. /* 上传控件 */
  149. .uploadControl {
  150. font-size: 50rpx;
  151. color: #888;
  152. background-color: #EEEEEE;
  153. display: flex;
  154. justify-content: center;
  155. align-items: center;
  156. }
  157. /* 上传 str end*/
  158. .clear {
  159. clear: both;
  160. }
  161. </style>