automated_uniapp/uni_modules/cool-ui/components/cl-text/cl-text.vue

168 lines
3.1 KiB
Vue
Raw Normal View History

2025-01-09 16:16:11 +08:00
<template>
<view
class="cl-text"
:class="[
`is-${type}`,
`is-color-${color}`,
{
'is-bold': bold,
'is-block': block,
'is-line-through': lineThrough,
'is-underline': underline,
'is-ellipsis': ellipsis > 0,
'is-copy': copy,
},
]"
:style="[
baseStyle,
{
color,
textAlign: align,
lineHeight: lineHeight,
fontSize: parseRpx(size),
letterSpacing: parseRpx(letterSpacing),
},
]"
@click="tap"
>
<!-- 前缀图标 -->
<text class="cl-text__prefix-icon" :class="prefixIcon" v-if="prefixIcon"> </text>
<!-- 价格 -->
<text class="cl-text__symbol--price" v-if="type == 'price'"></text>
<!-- 文本 -->
<view
class="cl-text__value"
:style="{
'-webkit-line-clamp': ellipsis,
}"
>
<slot>{{ text.value }}</slot>
</view>
<!-- 小数 -->
<text class="cl-text__precision" v-if="type == 'price' && precision"
>.{{ text.precision }}</text
>
<!-- 后缀图标 -->
<text class="cl-text__suffix-icon" :class="suffixIcon" v-if="suffixIcon"> </text>
</view>
</template>
<script lang="ts">
import { type PropType, computed, defineComponent } from "vue";
import { useStyle, useTap } from "../../hooks";
import { parseRpx } from "/@/cool/utils";
export default defineComponent({
name: "cl-text",
props: {
// 内容
value: {
type: [String, Number],
default: "",
},
// 类型
type: {
type: String as PropType<"text" | "price" | "phone">,
default: "text",
},
// 手机号是否加密
encrypt: {
type: Boolean,
default: true,
},
// 是否粗体
bold: Boolean,
// 是否块状
block: Boolean,
// 文本超出省略
ellipsis: {
type: Number,
default: 0,
},
// 字体颜色
color: {
type: String,
default: "#444",
},
// 字体大小
size: [String, Number],
// 文字对齐
align: {
type: String as PropType<
"start" | "end" | "left" | "right" | "center" | "justify" | "match-parent"
>,
default: "left",
},
// 价格小数点
precision: {
type: Boolean,
default: true,
},
// 穿过文本下的一条线
lineThrough: Boolean,
// 行高
lineHeight: {
type: [String, Number],
default: 1,
},
// 文本下的一条线
underline: Boolean,
// 文本水平间隔
letterSpacing: {
type: [String, Number],
default: 0,
},
// 顶部图标
prefixIcon: String,
// 尾部图标
suffixIcon: String,
// 是否能复制
copy: Boolean,
},
setup(props, { emit }) {
const { tap } = useTap(emit);
const text = computed(() => {
if (props.type == "price") {
const [value, precision = "00"] = parseFloat(String(props.value) || "0")
.toFixed(2)
.split(".");
if (props.precision) {
return {
value,
precision,
};
} else {
return {
value,
};
}
} else if (props.type == "phone") {
const str = String(props.value);
return {
value: props.encrypt ? str.substr(0, 3) + "****" + str.substr(7) : str,
};
} else {
return {
value: props.value,
};
}
});
return {
text,
tap,
...useStyle(),
};
},
});
</script>