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