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