You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.6 KiB
156 lines
3.6 KiB
<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] 收藏按钮文字 |
|
* @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: "" |
|
}; |
|
} |
|
} |
|
}, |
|
computed: { |
|
contentDefault() { |
|
return this.contentText.contentDefault || t("uni-fav.collect") |
|
}, |
|
contentFav() { |
|
return this.contentText.contentFav || t("uni-fav.collected") |
|
}, |
|
}, |
|
watch: { |
|
checked() { |
|
if (uni.report) { |
|
if (this.checked) { |
|
uni.report("收藏", "收藏"); |
|
} else { |
|
uni.report("取消收藏", "取消收藏"); |
|
} |
|
} |
|
} |
|
}, |
|
methods: { |
|
onClick() { |
|
this.$emit("click"); |
|
} |
|
} |
|
}; |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
$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>
|
|
|