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