automated_uniapp/uni_modules/cool-ui/components/cl-progress/cl-progress.vue
2025-01-09 16:16:11 +08:00

102 lines
1.8 KiB
Vue

<template>
<view class="cl-progress">
<view class="cl-progress-bar" v-if="type === 'line'">
<view
class="cl-progress-bar__outer"
:style="{ height: parseRpx(strokeWidth), backgroundColor: unColor }"
>
<view
class="cl-progress-bar__inner"
:style="{
backgroundColor,
width,
}"
></view>
</view>
</view>
<slot name="text">
<view class="cl-progress__text" v-if="showText">
<template v-if="!status">{{ value }}%</template>
<text class="cl-progress__icon" v-else :class="icon"></text>
</view>
</slot>
</view>
</template>
<script lang="ts">
import { computed, defineComponent, type PropType } from "vue";
import { parseRpx } from "/@/cool/utils";
import { getCurrentColor } from "../../utils";
export default defineComponent({
name: "cl-progress",
props: {
// 绑定值
value: {
type: Number,
default: 0,
required: true,
},
// 类型
type: {
type: String,
default: "line",
},
// 线条宽度
strokeWidth: {
type: Number,
default: 12,
},
// 是否显示文本
showText: {
type: Boolean,
default: true,
},
// 线条颜色, 支持多色
color: {
type: [String, Array] as PropType<string | string[]>,
default: "",
},
// 未选中颜色
unColor: {
type: String,
default: "#ebeef5",
},
// 状态
status: Boolean,
// 尾部图标
icon: String,
},
setup(props) {
// 宽度
const width = computed(() => {
if (props.value > 100) {
return "100%";
} else if (props.value < 0) {
return 0;
} else {
return `${props.value}%`;
}
});
// 背景颜色
const backgroundColor = computed(() => {
return getCurrentColor({
value: props.value,
color: props.color,
max: 100,
});
});
return {
parseRpx,
width,
backgroundColor,
};
},
});
</script>