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