165 lines
3.3 KiB
Vue
165 lines
3.3 KiB
Vue
<template>
|
||
<view class="price-container">
|
||
<view :class="['price-wrap', {'price-wrap--disabled': lineThrough}]" :style="{color: color }">
|
||
<!-- Prefix -->
|
||
<view class="fix-pre" :style="{fontSize: minorSize}">
|
||
<slot name="prefix">{{ prefix }}</slot>
|
||
</view>
|
||
|
||
<!-- Content -->
|
||
<view class="content" :style="{'font-weight': fontWeight}">
|
||
<!-- Integer -->
|
||
<text class="integer" :style="{fontSize: mainSize}">{{ integer }}</text>
|
||
<!-- Decimals -->
|
||
<text class="decimals" :style="{fontSize: minorSize}">{{ decimals }}</text>
|
||
</view>
|
||
|
||
<!-- Suffix -->
|
||
<view class="fix-suf" :style="{fontSize: minorSize}">
|
||
<slot name="suffix">{{ suffix }}</slot>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
/**
|
||
* @description 价格展示,适用于有前后缀,小数样式不一
|
||
* @property {String|Number} content 价格 (必填项)
|
||
* @property {Number} prec 小数位 (默认: 2)
|
||
* @property {Boolean} autoPrec 自动小数位【注:以prec为最大小数位】 (默认: true)
|
||
* @property {String} color 颜色 (默认: 'unset')
|
||
* @property {String} mainSize 主要内容字体大小 (默认: 46rpx)
|
||
* @property {String} minorSize 主要内容字体大小 (默认: 32rpx)
|
||
* @property {Boolean} lineThrough 贯穿线 (默认: false)
|
||
* @property {String|Number} fontWeight 字重 (默认: normal)
|
||
* @property {String} prefix 前缀 (默认: ¥)
|
||
* @property {String} suffix 后缀
|
||
* @example <price content="100" suffix="\/元" />
|
||
*/
|
||
|
||
import { formatPrice } from '@/utils/tools'
|
||
|
||
export default {
|
||
name: 'Price',
|
||
|
||
props: {
|
||
// 价格
|
||
content: {
|
||
type: String | Number,
|
||
required: true
|
||
},
|
||
|
||
// 小数位
|
||
prec: {
|
||
type: Number,
|
||
default: 2
|
||
},
|
||
|
||
// 动态小数
|
||
autoPrec: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
|
||
// 颜色
|
||
color: {
|
||
type: String,
|
||
default: 'inherit'
|
||
},
|
||
|
||
// 主要内容字体大小
|
||
mainSize: {
|
||
type: String,
|
||
default: 'inherit'
|
||
},
|
||
|
||
// 次要内容字体大小
|
||
minorSize: {
|
||
type: String,
|
||
default: 'inherit'
|
||
},
|
||
|
||
// 贯穿线
|
||
lineThrough: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
|
||
// 字重
|
||
fontWeight: {
|
||
type: String | Number,
|
||
default: 'normal'
|
||
},
|
||
|
||
// 前缀
|
||
prefix: {
|
||
type: String,
|
||
default: '¥'
|
||
},
|
||
|
||
// 后缀
|
||
suffix: {
|
||
type: String,
|
||
default: ''
|
||
}
|
||
},
|
||
|
||
computed: {
|
||
// 金额整数部分
|
||
integer() {
|
||
return formatPrice({
|
||
price: this.content,
|
||
take: 'int'
|
||
});
|
||
},
|
||
|
||
// 金额小数部分
|
||
decimals() {
|
||
const decimals = formatPrice({
|
||
price: this.content,
|
||
take: 'dec',
|
||
prec: this.prec
|
||
})
|
||
|
||
return this.autoPrec
|
||
? (decimals * 1 ? ('.' + decimals) : '')
|
||
: (this.prec ? ('.' + decimals) : '')
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.price-container {
|
||
display: inline-block;
|
||
line-height: 1em;
|
||
// @include font_color()
|
||
}
|
||
|
||
.price-wrap {
|
||
display: flex;
|
||
align-items: flex-end;
|
||
|
||
&--disabled {
|
||
position: relative;
|
||
|
||
&::before {
|
||
position: absolute;
|
||
left: 0;
|
||
top: 50%;
|
||
right: 0;
|
||
transform: translateY(-50%);
|
||
display: block;
|
||
content: "";
|
||
height: .05em;
|
||
background-color: currentColor;
|
||
}
|
||
}
|
||
}
|
||
|
||
.content {
|
||
// font-weight: 500;
|
||
}
|
||
</style>
|