mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-12-04 05:01:53 +08:00
162 lines
3.8 KiB
Vue
162 lines
3.8 KiB
Vue
<template>
|
||
<view :class="[circle === true || circle === 'true' ? 'uni-fav--circle' : '']" :style="[{ backgroundColor: checked ? bgColorChecked : bgColor }]"
|
||
@click="onClick" class="uni-fav">
|
||
<!-- #ifdef MP-ALIPAY -->
|
||
<view class="uni-fav-star" v-if="!checked && (star === true || star === 'true')">
|
||
<uni-icons :color="fgColor" :style="{color: checked ? fgColorChecked : fgColor}" size="14" type="star-filled" />
|
||
</view>
|
||
<!-- #endif -->
|
||
<!-- #ifndef MP-ALIPAY -->
|
||
<uni-icons :color="fgColor" :style="{color: checked ? fgColorChecked : fgColor}" class="uni-fav-star" size="14" type="star-filled"
|
||
v-if="!checked && (star === true || star === 'true')" />
|
||
<!-- #endif -->
|
||
<text :style="{color: checked ? fgColorChecked : fgColor}" class="uni-fav-text">{{ checked ? contentFav : contentDefault }}</text>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
|
||
/**
|
||
* Fav 收藏按钮
|
||
* @description 用于收藏功能,可点击切换选中、不选中的状态
|
||
* @tutorial https://ext.dcloud.net.cn/plugin?id=864
|
||
* @property {Boolean} star = [true|false] 按钮是否带星星
|
||
* @property {String} bgColor 未收藏时的背景色
|
||
* @property {String} bgColorChecked 已收藏时的背景色
|
||
* @property {String} fgColor 未收藏时的文字颜色
|
||
* @property {String} fgColorChecked 已收藏时的文字颜色
|
||
* @property {Boolean} circle = [true|false] 是否为圆角
|
||
* @property {Boolean} checked = [true|false] 是否为已收藏
|
||
* @property {Object} contentText = [true|false] 收藏按钮文字
|
||
* @property {Boolean} stat 是否开启统计功能
|
||
* @event {Function} click 点击 fav按钮触发事件
|
||
* @example <uni-fav :checked="true"/>
|
||
*/
|
||
|
||
import {
|
||
initVueI18n
|
||
} from '@dcloudio/uni-i18n'
|
||
import messages from './i18n/index.js'
|
||
const { t } = initVueI18n(messages)
|
||
|
||
export default {
|
||
name: "UniFav",
|
||
// TODO 兼容 vue3,需要注册事件
|
||
emits: ['click'],
|
||
props: {
|
||
star: {
|
||
type: [Boolean, String],
|
||
default: true
|
||
},
|
||
bgColor: {
|
||
type: String,
|
||
default: "#eeeeee"
|
||
},
|
||
fgColor: {
|
||
type: String,
|
||
default: "#666666"
|
||
},
|
||
bgColorChecked: {
|
||
type: String,
|
||
default: "#007aff"
|
||
},
|
||
fgColorChecked: {
|
||
type: String,
|
||
default: "#FFFFFF"
|
||
},
|
||
circle: {
|
||
type: [Boolean, String],
|
||
default: false
|
||
},
|
||
checked: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
contentText: {
|
||
type: Object,
|
||
default () {
|
||
return {
|
||
contentDefault: "",
|
||
contentFav: ""
|
||
};
|
||
}
|
||
},
|
||
stat:{
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
computed: {
|
||
contentDefault() {
|
||
return this.contentText.contentDefault || t("uni-fav.collect")
|
||
},
|
||
contentFav() {
|
||
return this.contentText.contentFav || t("uni-fav.collected")
|
||
},
|
||
},
|
||
watch: {
|
||
checked() {
|
||
if (uni.report && this.stat) {
|
||
if (this.checked) {
|
||
uni.report("收藏", "收藏");
|
||
} else {
|
||
uni.report("取消收藏", "取消收藏");
|
||
}
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
onClick() {
|
||
this.$emit("click");
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" >
|
||
$fav-height: 25px;
|
||
|
||
.uni-fav {
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
/* #endif */
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 60px;
|
||
height: $fav-height;
|
||
line-height: $fav-height;
|
||
text-align: center;
|
||
border-radius: 3px;
|
||
/* #ifdef H5 */
|
||
cursor: pointer;
|
||
/* #endif */
|
||
}
|
||
|
||
.uni-fav--circle {
|
||
border-radius: 30px;
|
||
}
|
||
|
||
.uni-fav-star {
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
/* #endif */
|
||
height: $fav-height;
|
||
line-height: 24px;
|
||
margin-right: 3px;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.uni-fav-text {
|
||
/* #ifndef APP-NVUE */
|
||
display: flex;
|
||
/* #endif */
|
||
height: $fav-height;
|
||
line-height: $fav-height;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 12px;
|
||
}
|
||
</style>
|