| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <template>
- <div class="nut-progress">
- <div
- class="nut-progress-outer"
- :id="'nut-progress-outer-taro-' + randRef"
- ref="progressOuter"
- :class="[showText && !textInside ? 'nut-progress-outer-part' : '', size ? 'nut-progress-' + size : '']"
- :style="{ height: height }"
- >
- <div :class="['nut-progress-inner', status == 'active' ? 'nut-active' : '']" :style="bgStyle">
- <div
- class="nut-progress-text nut-progress-insidetext"
- ref="insideText"
- :id="'nut-progress-insidetext-taro-' + randRef"
- :style="{
- lineHeight: height,
- left: `${percentage}%`,
- transform: `translate(-${+percentage}%,-50%)`,
- background: textBackground || strokeColor
- }"
- v-if="showText && textInside"
- >
- <span :style="textStyle">{{ percentage }}{{ isShowPercentage ? '%' : '' }}</span>
- </div>
- </div>
- </div>
- <div class="nut-progress-text" :style="{ lineHeight: height }" v-if="showText && !textInside">
- <template v-if="status == 'text' || status == 'active'">
- <span :style="textStyle">{{ percentage }}{{ isShowPercentage ? '%' : '' }} </span>
- </template>
- <template v-else-if="status == 'icon'">
- <nut-icon size="16px" :name="iconName" :color="iconColor"></nut-icon>
- </template>
- </div>
- </div>
- </template>
- <script lang="ts">
- import { computed, onMounted, provide, reactive, nextTick, ref, watch } from 'vue';
- import { createComponent } from '../../utils/create';
- import Taro, { eventCenter, getCurrentInstance } from '@tarojs/taro';
- import { log } from 'lzutf8';
- const { create } = createComponent('progress');
- export default create({
- props: {
- percentage: {
- type: [Number, String],
- default: 0,
- required: true
- },
- size: {
- type: String,
- default: 'base'
- },
- status: {
- type: String,
- default: 'text'
- },
- strokeWidth: {
- type: [Number, String],
- default: ''
- },
- textInside: {
- type: Boolean,
- default: false
- },
- showText: {
- type: Boolean,
- default: true
- },
- strokeColor: {
- type: String,
- default: ''
- },
- textColor: {
- tyep: String,
- default: ''
- },
- textBackground: {
- tyep: String,
- default: ''
- },
- iconName: {
- type: String,
- default: 'checked'
- },
- iconColor: {
- type: String,
- default: '#439422'
- },
- isShowPercentage: {
- type: Boolean,
- default: true
- }
- },
- setup(props, { emit }) {
- const height = ref(props.strokeWidth + 'px');
- const progressOuter = ref<any>();
- const insideText = ref();
- const refRandomId = Math.random().toString(36).slice(-8);
- const randRef = ref(refRandomId);
- const bgStyle = computed(() => {
- return {
- width: props.percentage + '%',
- background: props.strokeColor || ''
- };
- });
- const textStyle = computed(() => {
- return {
- color: props.textColor || ''
- };
- });
- onMounted(() => {
- eventCenter.once((getCurrentInstance() as any).router.onReady, () => {});
- });
- return {
- height,
- bgStyle,
- textStyle,
- progressOuter,
- insideText,
- randRef
- };
- }
- });
- </script>
|