<template> <transition :name="`${prefixCls}-zoom`" appear @after-leave="animationEnd" > <div v-if="!closed" :class="classes" :style="tagStyle" > <span :class="`${prefixCls}-text`"> <slot></slot> </span> <Icon v-if="closable" type="cross" @click="close" /> </div> </transition> </template> <script> import Icon from '../icon' export default { name: 'Tag', components: { Icon }, props: { prefixCls: { default: 'ant-tag', type: String, }, color: String, closable: Boolean, styles: { default: () => ({}), type: Object, }, }, data () { const isPresetColor = (color) => { if (!color) { return false } return /^(pink|red|yellow|orange|cyan|green|blue|purple)(-inverse)?$/.test(color) } return { closed: false, isPresetColor: isPresetColor(this.color), } }, computed: { classes () { const { prefixCls, color, isPresetColor } = this return { [`${prefixCls}`]: true, [`${prefixCls}-${color}`]: isPresetColor, [`${prefixCls}-has-color`]: (color && !isPresetColor), } }, tagStyle () { const { color, styles, isPresetColor } = this return { backgroundColor: (color && !isPresetColor) ? color : null, ...styles, } }, }, methods: { animationEnd () { this.$emit('after-close') }, close (e) { this.$emit('close', e) if (e.defaultPrevented) { return } this.closed = true }, }, } </script>