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
162
163
164
165
166
167
168
169
170
171
172
173
  | <template> 
 |    <view 
 |      class="tn-badge-class tn-badge" 
 |      :class="[ 
 |        backgroundColorClass, 
 |        fontColorClass, 
 |        badgeClass 
 |      ]" 
 |      :style="[badgeStyle]" 
 |      @click="handleClick" 
 |    > 
 |      <slot v-if="!dot"></slot> 
 |    </view> 
 |  </template> 
 |    
 |  <script> 
 |    import componentsColorMixin from '../../libs/mixin/components_color.js' 
 |    export default { 
 |      mixins: [componentsColorMixin], 
 |      name: 'tn-badge', 
 |      props: { 
 |        // 序号 
 |        index: { 
 |          type: [Number, String], 
 |          default: '0' 
 |        }, 
 |        // 徽章的大小 rpx 
 |        radius: { 
 |          type: Number, 
 |          default: 0 
 |        }, 
 |        // 内边距 
 |        padding: { 
 |          type: String, 
 |          default: '' 
 |        }, 
 |        // 外边距 
 |        margin: { 
 |          type: String, 
 |          default: '' 
 |        }, 
 |        // 是否为一个点 
 |        dot: { 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        // 是否使用绝对定位 
 |        absolute: { 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        // top 
 |        top: { 
 |          type: [String, Number], 
 |          default: '' 
 |        }, 
 |        // right 
 |        right: { 
 |          type: [String, Number], 
 |          default: '' 
 |        }, 
 |        // 居中 对齐右上角 
 |        translateCenter: { 
 |          type: Boolean, 
 |          default: true 
 |        } 
 |      }, 
 |      computed: { 
 |        badgeClass() { 
 |          let clazz = '' 
 |          if (this.dot) { 
 |            clazz += ' tn-badge--dot' 
 |          } 
 |          if (this.absolute) { 
 |            clazz += ' tn-badge--absolute' 
 |             
 |            if (this.translateCenter) { 
 |              clazz += ' tn-badge--center-position' 
 |            } 
 |          } 
 |           
 |          return clazz 
 |        }, 
 |        badgeStyle() { 
 |          let style = {} 
 |           
 |          if (this.radius !== 0) { 
 |            style.width = this.radius + 'rpx' 
 |            style.height = this.radius + 'rpx' 
 |            style.lineHeight = this.radius + 'rpx' 
 |             
 |            // style.borderRadius = (this.radius * 8) + 'rpx' 
 |          } 
 |           
 |          if (this.padding) { 
 |            style.padding = this.padding 
 |          } 
 |          if (this.margin) { 
 |            style.margin = this.margin 
 |          } 
 |          if (this.fontColorStyle) { 
 |            style.color = this.fontColorStyle 
 |          } 
 |          if (this.fontSize) { 
 |            style.fontSize = this.fontSize + this.fontUnit 
 |          } 
 |           
 |          if (this.backgroundColorStyle) { 
 |            style.backgroundColor = this.backgroundColorStyle 
 |          } 
 |           
 |          if (this.top) { 
 |            style.top = this.$t.string.getLengthUnitValue(this.top) 
 |          } 
 |          if (this.right) { 
 |            style.right = this.$t.string.getLengthUnitValue(this.right) 
 |          } 
 |           
 |          return style 
 |        }, 
 |         
 |      }, 
 |      data() { 
 |        return { 
 |           
 |        } 
 |      }, 
 |      methods: { 
 |        // 处理点击事件 
 |        handleClick() { 
 |          this.$emit('click', { 
 |            index: Number(this.index) 
 |          }) 
 |          this.$emit('tap', { 
 |            index: Number(this.index) 
 |          }) 
 |        }, 
 |      } 
 |    } 
 |  </script> 
 |    
 |  <style lang="scss" scoped> 
 |    .tn-badge { 
 |      width: auto; 
 |      height: auto; 
 |      box-sizing: border-box; 
 |      display: flex; 
 |      align-items: center; 
 |      justify-content: center; 
 |      z-index: 10; 
 |      font-size: 20rpx; 
 |      background-color: #FFFFFF; 
 |      // color: #FFFFFF; 
 |      border-radius: 100rpx; 
 |      padding: 4rpx 8rpx; 
 |      line-height: initial; 
 |       
 |      &--dot { 
 |        width: 8rpx; 
 |        height: 8rpx; 
 |        border-radius: 50%; 
 |        padding: 0; 
 |      } 
 |      &--absolute { 
 |        position: absolute; 
 |        top: 0; 
 |        right: 0; 
 |      } 
 |      &--center-position { 
 |        transform: translate(50%, -50%); 
 |      } 
 |    } 
 |  </style> 
 |  
  |