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>
|