| <template>  | 
|     <u-transition  | 
|         mode="fade"  | 
|         :show="show"  | 
|     >  | 
|         <view class="u-tag-wrapper">  | 
|             <view  | 
|                 class="u-tag"  | 
|                 :class="[`u-tag--${shape}`, !plain && `u-tag--${type}`, plain && `u-tag--${type}--plain`, `u-tag--${size}`, plain && plainFill && `u-tag--${type}--plain--fill`]"  | 
|                 @tap.stop="clickHandler"  | 
|                 :style="[{  | 
|                     marginRight: closable ? '10px' : 0,  | 
|                     marginTop: closable ? '10px' : 0,  | 
|                 }, style]"  | 
|             >  | 
|                 <slot name="icon">  | 
|                     <view  | 
|                         class="u-tag__icon"  | 
|                         v-if="icon"  | 
|                     >  | 
|                         <image  | 
|                             v-if="$u.test.image(icon)"  | 
|                             :src="icon"  | 
|                             :style="[imgStyle]"  | 
|                         ></image>  | 
|                         <u-icon  | 
|                             v-else  | 
|                             :color="elIconColor"  | 
|                             :name="icon"  | 
|                             :size="iconSize"  | 
|                         ></u-icon>  | 
|                     </view>  | 
|                 </slot>  | 
|                 <text  | 
|                     class="u-tag__text"  | 
|                     :style="[textColor]"  | 
|                     :class="[`u-tag__text--${type}`, plain && `u-tag__text--${type}--plain`, `u-tag__text--${size}`]"  | 
|                 >{{ text }}</text>  | 
|             </view>  | 
|             <view  | 
|                 class="u-tag__close"  | 
|                 :class="[`u-tag__close--${size}`]"  | 
|                 v-if="closable"  | 
|                 @tap.stop="closeHandler"  | 
|                 :style="{backgroundColor: closeColor}"  | 
|             >  | 
|                 <u-icon  | 
|                     name="close"  | 
|                     :size="closeSize"  | 
|                     color="#ffffff"  | 
|                 ></u-icon>  | 
|             </view>  | 
|         </view>  | 
|     </u-transition>  | 
| </template>  | 
|   | 
| <script>  | 
|     import props from './props.js';  | 
|     /**  | 
|      * Tag 标签  | 
|      * @description tag组件一般用于标记和选择,我们提供了更加丰富的表现形式,能够较全面的涵盖您的使用场景  | 
|      * @tutorial https://www.uviewui.com/components/tag.html  | 
|      * @property {String}            type        标签类型info、primary、success、warning、error (默认 'primary' )  | 
|      * @property {Boolean | String}    disabled    不可用(默认 false )  | 
|      * @property {String}            size        标签的大小,large,medium,mini (默认 'medium' )  | 
|      * @property {String}            shape        tag的形状,circle(两边半圆形), square(方形,带圆角)(默认 'square' )  | 
|      * @property {String | Number}    text        标签的文字内容   | 
|      * @property {String}            bgColor        背景颜色,默认为空字符串,即不处理  | 
|      * @property {String}            color        标签字体颜色,默认为空字符串,即不处理  | 
|      * @property {String}            borderColor    镂空形式标签的边框颜色  | 
|      * @property {String}            closeColor    关闭按钮图标的颜色(默认 #C6C7CB)  | 
|      * @property {String | Number}    name        点击时返回的索引值,用于区分例遍的数组哪个元素被点击了  | 
|      * @property {Boolean}            plainFill    镂空时是否填充背景色(默认 false )  | 
|      * @property {Boolean}            plain        是否镂空(默认 false )  | 
|      * @property {Boolean}            closable    是否可关闭,设置为true,文字右边会出现一个关闭图标(默认 false )  | 
|      * @property {Boolean}            show        标签显示与否(默认 true )  | 
|      * @property {String}            icon        内置图标,或绝对路径的图片  | 
|      * @event {Function(index)} click 点击标签时触发 index: 传递的index参数值  | 
|      * @event {Function(index)} close closable为true时,点击标签关闭按钮触发 index: 传递的index参数值      | 
|      * @example <u-tag text="标签" type="error" plain plainFill></u-tag>  | 
|      */  | 
|     export default {  | 
|         name: 'u-tag',  | 
|         mixins: [uni.$u.mpMixin, uni.$u.mixin, props],  | 
|         data() {  | 
|             return {  | 
|   | 
|             }  | 
|         },  | 
|         computed: {  | 
|             style() {  | 
|                 const style = {}  | 
|                 if (this.bgColor) {  | 
|                     style.backgroundColor = this.bgColor  | 
|                 }  | 
|                 if (this.color) {  | 
|                     style.color = this.color  | 
|                 }  | 
|                 if(this.borderColor) {  | 
|                     style.borderColor = this.borderColor  | 
|                 }  | 
|                 return style  | 
|             },  | 
|             // nvue下,文本颜色无法继承父元素  | 
|             textColor() {  | 
|                 const style = {}  | 
|                 if (this.color) {  | 
|                     style.color = this.color  | 
|                 }  | 
|                 return style  | 
|             },  | 
|             imgStyle() {  | 
|                 const width = this.size === 'large' ? '17px' : this.size === 'medium' ? '15px' : '13px'  | 
|                 return {  | 
|                     width,  | 
|                     height: width  | 
|                 }  | 
|             },  | 
|             // 文本的样式  | 
|             closeSize() {  | 
|                 const size = this.size === 'large' ? 15 : this.size === 'medium' ? 13 : 12  | 
|                 return size  | 
|             },  | 
|             // 图标大小  | 
|             iconSize() {  | 
|                 const size = this.size === 'large' ? 21 : this.size === 'medium' ? 19 : 16  | 
|                 return size  | 
|             },  | 
|             // 图标颜色  | 
|             elIconColor() {  | 
|                 return this.iconColor ? this.iconColor : this.plain ? this.type : '#ffffff'  | 
|             }  | 
|         },  | 
|         methods: {  | 
|             // 点击关闭按钮  | 
|             closeHandler() {  | 
|                 this.$emit('close', this.name)  | 
|             },  | 
|             // 点击标签  | 
|             clickHandler() {  | 
|                 this.$emit('click', this.name)  | 
|             }  | 
|         }  | 
|     }  | 
| </script>  | 
|   | 
| <style  | 
|     lang="scss"  | 
|     scoped  | 
| >  | 
|     @import "../../libs/css/components.scss";  | 
|   | 
|     .u-tag-wrapper {  | 
|         position: relative;  | 
|     }  | 
|   | 
|     .u-tag {  | 
|         @include flex;  | 
|         align-items: center;  | 
|         border-style: solid;  | 
|   | 
|         &--circle {  | 
|             border-radius: 100px;  | 
|         }  | 
|   | 
|         &--square {  | 
|             border-radius: 3px;  | 
|         }  | 
|   | 
|         &__icon {  | 
|             margin-right: 4px;  | 
|         }  | 
|   | 
|         &__text {  | 
|             &--mini {  | 
|                 font-size: 12px;  | 
|                 line-height: 12px;  | 
|             }  | 
|   | 
|             &--medium {  | 
|                 font-size: 13px;  | 
|                 line-height: 13px;  | 
|             }  | 
|   | 
|             &--large {  | 
|                 font-size: 15px;  | 
|                 line-height: 15px;  | 
|             }  | 
|         }  | 
|   | 
|         &--mini {  | 
|             height: 22px;  | 
|             line-height: 22px;  | 
|             padding: 0 5px;  | 
|         }  | 
|   | 
|         &--medium {  | 
|             height: 26px;  | 
|             line-height: 22px;  | 
|             padding: 0 10px;  | 
|         }  | 
|   | 
|         &--large {  | 
|             height: 32px;  | 
|             line-height: 32px;  | 
|             padding: 0 15px;  | 
|         }  | 
|   | 
|         &--primary {  | 
|             background-color: $u-primary;  | 
|             border-width: 1px;  | 
|             border-color: $u-primary;  | 
|         }  | 
|   | 
|         &--primary--plain {  | 
|             border-width: 1px;  | 
|             border-color: $u-primary;  | 
|         }  | 
|   | 
|         &--primary--plain--fill {  | 
|             background-color: #ecf5ff;  | 
|         }  | 
|   | 
|         &__text--primary {  | 
|             color: #FFFFFF;  | 
|         }  | 
|   | 
|         &__text--primary--plain {  | 
|             color: $u-primary;  | 
|         }  | 
|   | 
|         &--error {  | 
|             background-color: $u-error;  | 
|             border-width: 1px;  | 
|             border-color: $u-error;  | 
|         }  | 
|   | 
|         &--error--plain {  | 
|             border-width: 1px;  | 
|             border-color: $u-error;  | 
|         }  | 
|   | 
|         &--error--plain--fill {  | 
|             background-color: #fef0f0;  | 
|         }  | 
|   | 
|         &__text--error {  | 
|             color: #FFFFFF;  | 
|         }  | 
|   | 
|         &__text--error--plain {  | 
|             color: $u-error;  | 
|         }  | 
|   | 
|         &--warning {  | 
|             background-color: $u-warning;  | 
|             border-width: 1px;  | 
|             border-color: $u-warning;  | 
|         }  | 
|   | 
|         &--warning--plain {  | 
|             border-width: 1px;  | 
|             border-color: $u-warning;  | 
|         }  | 
|   | 
|         &--warning--plain--fill {  | 
|             background-color: #fdf6ec;  | 
|         }  | 
|   | 
|         &__text--warning {  | 
|             color: #FFFFFF;  | 
|         }  | 
|   | 
|         &__text--warning--plain {  | 
|             color: $u-warning;  | 
|         }  | 
|   | 
|         &--success {  | 
|             background-color: $u-success;  | 
|             border-width: 1px;  | 
|             border-color: $u-success;  | 
|         }  | 
|   | 
|         &--success--plain {  | 
|             border-width: 1px;  | 
|             border-color: $u-success;  | 
|         }  | 
|   | 
|         &--success--plain--fill {  | 
|             background-color: #f5fff0;  | 
|         }  | 
|   | 
|         &__text--success {  | 
|             color: #FFFFFF;  | 
|         }  | 
|   | 
|         &__text--success--plain {  | 
|             color: $u-success;  | 
|         }  | 
|   | 
|         &--info {  | 
|             background-color: $u-info;  | 
|             border-width: 1px;  | 
|             border-color: $u-info;  | 
|         }  | 
|   | 
|         &--info--plain {  | 
|             border-width: 1px;  | 
|             border-color: $u-info;  | 
|         }  | 
|   | 
|         &--info--plain--fill {  | 
|             background-color: #f4f4f5;  | 
|         }  | 
|   | 
|         &__text--info {  | 
|             color: #FFFFFF;  | 
|         }  | 
|   | 
|         &__text--info--plain {  | 
|             color: $u-info;  | 
|         }  | 
|   | 
|         &__close {  | 
|             position: absolute;  | 
|             z-index: 999;  | 
|             top: 10px;  | 
|             right: 10px;  | 
|             border-radius: 100px;  | 
|             background-color: #C6C7CB;  | 
|             @include flex(row);  | 
|             align-items: center;  | 
|             justify-content: center;  | 
|             /* #ifndef APP-NVUE */  | 
|             transform: scale(0.6) translate(80%, -80%);  | 
|             /* #endif */  | 
|             /* #ifdef APP-NVUE */  | 
|             transform: scale(0.6) translate(50%, -50%);  | 
|             /* #endif */  | 
|   | 
|             &--mini {  | 
|                 width: 18px;  | 
|                 height: 18px;  | 
|             }  | 
|   | 
|             &--medium {  | 
|                 width: 22px;  | 
|                 height: 22px;  | 
|             }  | 
|   | 
|             &--large {  | 
|                 width: 25px;  | 
|                 height: 25px;  | 
|             }  | 
|         }  | 
|   | 
|     }  | 
| </style>  |