<template> <view class="uni-file-picker__files"> <view v-if="!readonly" class="files-button" @click="choose"> <slot></slot> </view> <!-- :class="{'is-text-box':showType === 'list'}" --> <view v-if="list.length > 0" class="uni-file-picker__lists is-text-box" :style="borderStyle"> <!-- ,'is-list-card':showType === 'list-card' --> <view class="uni-file-picker__lists-box" v-for="(item, index) in list" :key="index" :class="{ 'files-border': index !== 0 && styles.dividline, }" :style="index !== 0 && styles.dividline && borderLineStyle" > <view class="uni-file-picker__item"> <!-- :class="{'is-text-image':showType === 'list'}" --> <!-- <view class="files__image is-text-image"> <image class="header-image" :src="item.logo" mode="aspectFit"></image> </view> --> <view class="files__name">{{ item.name }}</view> <view v-if="delIcon && !readonly" class="icon-del-box icon-files" @click="delFile(index)"> <view class="icon-del icon-files"></view> <view class="icon-del rotate"></view> </view> </view> <view v-if="(item.progress && item.progress !== 100) || item.progress === 0" class="file-picker__progress" > <progress class="file-picker__progress-item" :percent="item.progress === -1 ? 0 : item.progress" stroke-width="4" :backgroundColor="item.errMsg ? '#ff5a5f' : '#EBEBEB'" /> </view> <view v-if="item.status === 'error'" class="file-picker__mask" @click.stop="uploadFiles(item, index)" > 点击重试 </view> </view> </view> </view> </template> <script> export default { name: 'uploadFile', emits: ['uploadFiles', 'choose', 'delFile'], props: { filesList: { type: Array, default() { return []; }, }, delIcon: { type: Boolean, default: true, }, limit: { type: [Number, String], default: 9, }, showType: { type: String, default: '', }, listStyles: { type: Object, default() { return { // 是否显示边框 border: true, // 是否显示分隔线 dividline: true, // 线条样式 borderStyle: {}, }; }, }, readonly: { type: Boolean, default: false, }, }, computed: { list() { let files = []; this.filesList.forEach((v) => { files.push(v); }); return files; }, styles() { let styles = { border: true, dividline: true, 'border-style': {}, }; return Object.assign(styles, this.listStyles); }, borderStyle() { let { borderStyle, border } = this.styles; let obj = {}; if (!border) { obj.border = 'none'; } else { let width = (borderStyle && borderStyle.width) || 1; width = this.value2px(width); let radius = (borderStyle && borderStyle.radius) || 5; radius = this.value2px(radius); obj = { 'border-width': width, 'border-style': (borderStyle && borderStyle.style) || 'solid', 'border-color': (borderStyle && borderStyle.color) || '#eee', 'border-radius': radius, }; } let classles = ''; for (let i in obj) { classles += `${i}:${obj[i]};`; } return classles; }, borderLineStyle() { let obj = {}; let { borderStyle } = this.styles; if (borderStyle && borderStyle.color) { obj['border-color'] = borderStyle.color; } if (borderStyle && borderStyle.width) { let width = (borderStyle && borderStyle.width) || 1; let style = (borderStyle && borderStyle.style) || 0; if (typeof width === 'number') { width += 'px'; } else { width = width.indexOf('px') ? width : width + 'px'; } obj['border-width'] = width; if (typeof style === 'number') { style += 'px'; } else { style = style.indexOf('px') ? style : style + 'px'; } obj['border-top-style'] = style; } let classles = ''; for (let i in obj) { classles += `${i}:${obj[i]};`; } return classles; }, }, methods: { uploadFiles(item, index) { this.$emit('uploadFiles', { item, index, }); }, choose() { this.$emit('choose'); }, delFile(index) { this.$emit('delFile', index); }, value2px(value) { if (typeof value === 'number') { value += 'px'; } else { value = value.indexOf('px') !== -1 ? value : value + 'px'; } return value; }, }, }; </script> <style lang="scss"> .uni-file-picker__files { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: column; justify-content: flex-start; } .files-button { // border: 1px red solid; } .uni-file-picker__lists { position: relative; margin-top: 5px; overflow: hidden; } .file-picker__mask { /* #ifndef APP-NVUE */ display: flex; /* #endif */ justify-content: center; align-items: center; position: absolute; right: 0; top: 0; bottom: 0; left: 0; color: #fff; font-size: 14px; background-color: rgba(0, 0, 0, 0.4); } .uni-file-picker__lists-box { position: relative; } .uni-file-picker__item { /* #ifndef APP-NVUE */ display: flex; /* #endif */ align-items: center; padding: 8px 10px; padding-right: 5px; padding-left: 10px; } .files-border { border-top: 1px #eee solid; } .files__name { flex: 1; font-size: 14px; color: #666; margin-right: 25px; /* #ifndef APP-NVUE */ word-break: break-all; word-wrap: break-word; /* #endif */ } .icon-files { /* #ifndef APP-NVUE */ position: static; background-color: initial; /* #endif */ } // .icon-files .icon-del { // background-color: #333; // width: 12px; // height: 1px; // } .is-list-card { border: 1px #eee solid; margin-bottom: 5px; border-radius: 5px; box-shadow: 0 0 2px 0px rgba(0, 0, 0, 0.1); padding: 5px; } .files__image { width: 40px; height: 40px; margin-right: 10px; } .header-image { width: 100%; height: 100%; } .is-text-box { border: 1px #eee solid; border-radius: 5px; } .is-text-image { width: 25px; height: 25px; margin-left: 5px; } .rotate { position: absolute; transform: rotate(90deg); } .icon-del-box { /* #ifndef APP-NVUE */ display: flex; margin: auto 0; /* #endif */ align-items: center; justify-content: center; position: absolute; top: 0px; bottom: 0; right: 5px; height: 26px; width: 26px; // border-radius: 50%; // background-color: rgba(0, 0, 0, 0.5); z-index: 2; transform: rotate(-45deg); } .icon-del { width: 15px; height: 1px; background-color: #333; // border-radius: 1px; } /* #ifdef H5 */ @media all and (min-width: 768px) { .uni-file-picker__files { max-width: 375px; } } /* #endif */ </style>