Commit a1553a9cc4e61004fc6335fb96934f98a0443dab
Committed by
GitHub
Merge pull request #2124 from daiyanze/feature/checkable_tag
Feature/checkable tag (追加功能:可选标签)
Showing
2 changed files
with
37 additions
and
6 deletions
Show diff stats
examples/routers/tag.vue
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <Tag v-for="item in count" :key="item" :name="item" @on-close="close" closable>标签{{ item + 1 }}</Tag> | 3 | + <Tag v-for="item in count" :key="item" :name="item" type="border" color="yellow" @on-close="close" @on-check="check" closable>标签{{ item + 1 }}</Tag> |
| 4 | + <div><Tag v-for="item in count" :key="item" :name="item" color="yellow" @on-close="close" @on-check="check" checkable>可选标签{{ item + 1 }}</Tag></div> | ||
| 5 | + <div><Tag v-for="item in count" :key="item" :name="item" type="dot" color="blue" @on-close="close" @on-check="check" closable checkable>可选可关闭标签{{ item + 1 }}</Tag></div> | ||
| 6 | + <br /> | ||
| 4 | <Button icon="ios-plus-empty" type="dashed" size="small" @click="count += 1">添加标签</Button> | 7 | <Button icon="ios-plus-empty" type="dashed" size="small" @click="count += 1">添加标签</Button> |
| 5 | </div> | 8 | </div> |
| 6 | </template> | 9 | </template> |
| @@ -9,13 +12,17 @@ | @@ -9,13 +12,17 @@ | ||
| 9 | data () { | 12 | data () { |
| 10 | return { | 13 | return { |
| 11 | count: 3 | 14 | count: 3 |
| 12 | - } | 15 | + }; |
| 13 | }, | 16 | }, |
| 14 | methods: { | 17 | methods: { |
| 15 | close (e, name) { | 18 | close (e, name) { |
| 16 | console.log(e); | 19 | console.log(e); |
| 17 | console.log(name); | 20 | console.log(name); |
| 21 | + }, | ||
| 22 | + check (e, name) { | ||
| 23 | + console.log(e); | ||
| 24 | + console.log(name); | ||
| 18 | } | 25 | } |
| 19 | } | 26 | } |
| 20 | - } | 27 | + }; |
| 21 | </script> | 28 | </script> |
src/components/tag/tag.vue
| 1 | <template> | 1 | <template> |
| 2 | <transition name="fade"> | 2 | <transition name="fade"> |
| 3 | - <div :class="classes"> | 3 | + <div :class="classes" @click.stop="check"> |
| 4 | <span :class="dotClasses" v-if="showDot"></span><span :class="textClasses"><slot></slot></span><Icon v-if="closable" type="ios-close-empty" @click.native.stop="close"></Icon> | 4 | <span :class="dotClasses" v-if="showDot"></span><span :class="textClasses"><slot></slot></span><Icon v-if="closable" type="ios-close-empty" @click.native.stop="close"></Icon> |
| 5 | </div> | 5 | </div> |
| 6 | </transition> | 6 | </transition> |
| @@ -19,6 +19,14 @@ | @@ -19,6 +19,14 @@ | ||
| 19 | type: Boolean, | 19 | type: Boolean, |
| 20 | default: false | 20 | default: false |
| 21 | }, | 21 | }, |
| 22 | + checkable: { | ||
| 23 | + type: Boolean, | ||
| 24 | + default: false | ||
| 25 | + }, | ||
| 26 | + checked: { | ||
| 27 | + type: Boolean, | ||
| 28 | + default: true | ||
| 29 | + }, | ||
| 22 | color: { | 30 | color: { |
| 23 | validator (value) { | 31 | validator (value) { |
| 24 | return oneOf(value, ['blue', 'green', 'red', 'yellow', 'default']); | 32 | return oneOf(value, ['blue', 'green', 'red', 'yellow', 'default']); |
| @@ -33,14 +41,20 @@ | @@ -33,14 +41,20 @@ | ||
| 33 | type: [String, Number] | 41 | type: [String, Number] |
| 34 | } | 42 | } |
| 35 | }, | 43 | }, |
| 44 | + data () { | ||
| 45 | + return { | ||
| 46 | + isChecked: this.checked | ||
| 47 | + }; | ||
| 48 | + }, | ||
| 36 | computed: { | 49 | computed: { |
| 37 | classes () { | 50 | classes () { |
| 38 | return [ | 51 | return [ |
| 39 | `${prefixCls}`, | 52 | `${prefixCls}`, |
| 40 | { | 53 | { |
| 41 | - [`${prefixCls}-${this.color}`]: !!this.color, | 54 | + [`${prefixCls}-${this.color}`]: !!this.color && (this.checkable && this.isChecked), |
| 42 | [`${prefixCls}-${this.type}`]: !!this.type, | 55 | [`${prefixCls}-${this.type}`]: !!this.type, |
| 43 | - [`${prefixCls}-closable`]: this.closable | 56 | + [`${prefixCls}-closable`]: this.closable, |
| 57 | + [`${prefixCls}-checked`]: this.isChecked | ||
| 44 | } | 58 | } |
| 45 | ]; | 59 | ]; |
| 46 | }, | 60 | }, |
| @@ -61,6 +75,16 @@ | @@ -61,6 +75,16 @@ | ||
| 61 | } else { | 75 | } else { |
| 62 | this.$emit('on-close', event, this.name); | 76 | this.$emit('on-close', event, this.name); |
| 63 | } | 77 | } |
| 78 | + }, | ||
| 79 | + check () { | ||
| 80 | + if (!this.checkable) return; | ||
| 81 | + const checked = !this.isChecked; | ||
| 82 | + this.isChecked = checked; | ||
| 83 | + if (this.name === undefined) { | ||
| 84 | + this.$emit('on-change', checked); | ||
| 85 | + } else { | ||
| 86 | + this.$emit('on-change', checked, this.name); | ||
| 87 | + } | ||
| 64 | } | 88 | } |
| 65 | } | 89 | } |
| 66 | }; | 90 | }; |