陶杰
2024-08-22 4aa0bd47801606b4d0e0a6a2ed8fe92a7e5f2444
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<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>