<template> 
 | 
    <view 
 | 
        class="u-line-progress" 
 | 
        :style="[$u.addStyle(customStyle)]" 
 | 
    > 
 | 
        <view 
 | 
            class="u-line-progress__background" 
 | 
            ref="u-line-progress__background" 
 | 
            :style="[{ 
 | 
                backgroundColor: inactiveColor, 
 | 
                height: $u.addUnit(height), 
 | 
            }]" 
 | 
        > 
 | 
        </view> 
 | 
        <view 
 | 
            class="u-line-progress__line" 
 | 
            :style="[progressStyle]" 
 | 
        >  
 | 
            <slot> 
 | 
                <text v-if="showText && percentage >= 10" class="u-line-progress__text">{{innserPercentage + '%'}}</text> 
 | 
            </slot>  
 | 
        </view> 
 | 
    </view> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
    import props from './props.js'; 
 | 
    // #ifdef APP-NVUE 
 | 
    const dom = uni.requireNativePlugin('dom') 
 | 
    // #endif 
 | 
    /** 
 | 
     * lineProgress 线型进度条 
 | 
     * @description 展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。 
 | 
     * @tutorial https://www.uviewui.com/components/lineProgress.html 
 | 
     * @property {String}            activeColor        激活部分的颜色 ( 默认 '#19be6b' ) 
 | 
     * @property {String}            inactiveColor    背景色 ( 默认 '#ececec' ) 
 | 
     * @property {String | Number}    percentage        进度百分比,数值 ( 默认 0 ) 
 | 
     * @property {Boolean}            showText        是否在进度条内部显示百分比的值 ( 默认 true ) 
 | 
     * @property {String | Number}    height            进度条的高度,单位px ( 默认 12 ) 
 | 
     *  
 | 
     * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress> 
 | 
     */ 
 | 
    export default { 
 | 
        name: "u-line-progress", 
 | 
        mixins: [uni.$u.mpMixin, uni.$u.mixin,props], 
 | 
        data() { 
 | 
            return { 
 | 
                lineWidth: 0, 
 | 
            } 
 | 
        }, 
 | 
        watch: { 
 | 
            percentage(n) { 
 | 
                this.resizeProgressWidth() 
 | 
            } 
 | 
        }, 
 | 
        computed: { 
 | 
            progressStyle() {  
 | 
                let style = {} 
 | 
                style.width = this.lineWidth 
 | 
                style.backgroundColor = this.activeColor 
 | 
                style.height = uni.$u.addUnit(this.height) 
 | 
                return style 
 | 
            }, 
 | 
            innserPercentage() { 
 | 
                // 控制范围在0-100之间 
 | 
                return uni.$u.range(0, 100, this.percentage) 
 | 
            } 
 | 
        }, 
 | 
        mounted() { 
 | 
            this.init() 
 | 
        }, 
 | 
        methods: { 
 | 
            init() { 
 | 
                uni.$u.sleep(20).then(() => { 
 | 
                    this.resizeProgressWidth() 
 | 
                }) 
 | 
            }, 
 | 
            getProgressWidth() { 
 | 
                // #ifndef APP-NVUE 
 | 
                return this.$uGetRect('.u-line-progress__background') 
 | 
                // #endif 
 | 
  
 | 
                // #ifdef APP-NVUE 
 | 
                // 返回一个promise 
 | 
                return new Promise(resolve => { 
 | 
                    dom.getComponentRect(this.$refs['u-line-progress__background'], (res) => { 
 | 
                        resolve(res.size) 
 | 
                    }) 
 | 
                }) 
 | 
                // #endif 
 | 
            }, 
 | 
            resizeProgressWidth() { 
 | 
                this.getProgressWidth().then(size => { 
 | 
                    const { 
 | 
                        width 
 | 
                    } = size 
 | 
                    // 通过设置的percentage值,计算其所占总长度的百分比 
 | 
                    this.lineWidth = width * this.innserPercentage / 100 + 'px' 
 | 
                }) 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
    @import "../../libs/css/components.scss"; 
 | 
  
 | 
    .u-line-progress { 
 | 
        align-items: stretch; 
 | 
        position: relative; 
 | 
        @include flex(row); 
 | 
        flex: 1; 
 | 
        overflow: hidden; 
 | 
        border-radius: 100px; 
 | 
  
 | 
        &__background { 
 | 
            background-color: #ececec; 
 | 
            border-radius: 100px; 
 | 
            flex: 1; 
 | 
        } 
 | 
  
 | 
        &__line { 
 | 
            position: absolute; 
 | 
            top: 0; 
 | 
            left: 0; 
 | 
            bottom: 0; 
 | 
            align-items: center; 
 | 
            @include flex(row); 
 | 
            color: #ffffff; 
 | 
            border-radius: 100px; 
 | 
            transition: width 0.5s ease; 
 | 
            justify-content: flex-end; 
 | 
        } 
 | 
  
 | 
        &__text { 
 | 
            font-size: 10px; 
 | 
            align-items: center; 
 | 
            text-align: right; 
 | 
            color: #FFFFFF; 
 | 
            margin-right: 5px; 
 | 
            transform: scale(0.9); 
 | 
        } 
 | 
    } 
 | 
</style> 
 |