<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> 
 |