Commit 165bb7c9ed134eaebe5cdfce6ff5634c49635942
1 parent
bd4e3b9b
update Cascader
update Cascader
Showing
7 changed files
with
54 additions
and
31 deletions
Show diff stats
src/components/cascader/cascader.vue
| @@ -92,7 +92,8 @@ | @@ -92,7 +92,8 @@ | ||
| 92 | return [ | 92 | return [ |
| 93 | `${prefixCls}`, | 93 | `${prefixCls}`, |
| 94 | { | 94 | { |
| 95 | - [`${prefixCls}-show-clear`]: this.showCloseIcon | 95 | + [`${prefixCls}-show-clear`]: this.showCloseIcon, |
| 96 | + [`${prefixCls}-visible`]: this.visible | ||
| 96 | } | 97 | } |
| 97 | ] | 98 | ] |
| 98 | }, | 99 | }, |
| @@ -105,28 +106,42 @@ | @@ -105,28 +106,42 @@ | ||
| 105 | label.push(this.selected[i].label); | 106 | label.push(this.selected[i].label); |
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | - return this.renderFormat(label); | 109 | + return this.renderFormat(label, this.selected); |
| 109 | } | 110 | } |
| 110 | }, | 111 | }, |
| 111 | methods: { | 112 | methods: { |
| 112 | clearSelect () { | 113 | clearSelect () { |
| 113 | - | 114 | + const oldVal = JSON.stringify(this.value); |
| 115 | + this.value = this.selected = this.tmpSelected = []; | ||
| 116 | + this.handleClose(); | ||
| 117 | + this.emitValue(this.value, oldVal); | ||
| 118 | + this.$broadcast('on-clear'); | ||
| 114 | }, | 119 | }, |
| 115 | handleClose () { | 120 | handleClose () { |
| 116 | this.visible = false; | 121 | this.visible = false; |
| 117 | }, | 122 | }, |
| 118 | onFocus () { | 123 | onFocus () { |
| 119 | this.visible = true; | 124 | this.visible = true; |
| 125 | + if (!this.value.length) { | ||
| 126 | + this.$broadcast('on-clear'); | ||
| 127 | + } | ||
| 120 | }, | 128 | }, |
| 121 | updateResult (result) { | 129 | updateResult (result) { |
| 122 | this.tmpSelected = result; | 130 | this.tmpSelected = result; |
| 123 | }, | 131 | }, |
| 124 | - updateSelected () { | ||
| 125 | - this.$broadcast('on-find-selected', this.value); | 132 | + updateSelected (init = false) { |
| 133 | + if (!this.changeOnSelect || init) { | ||
| 134 | + this.$broadcast('on-find-selected', this.value); | ||
| 135 | + } | ||
| 136 | + }, | ||
| 137 | + emitValue (val, oldVal) { | ||
| 138 | + if (JSON.stringify(val) !== oldVal) { | ||
| 139 | + this.$emit('on-change', this.value, JSON.parse(JSON.stringify(this.selected))); | ||
| 140 | + } | ||
| 126 | } | 141 | } |
| 127 | }, | 142 | }, |
| 128 | ready () { | 143 | ready () { |
| 129 | - this.updateSelected(); | 144 | + this.updateSelected(true); |
| 130 | }, | 145 | }, |
| 131 | events: { | 146 | events: { |
| 132 | // lastValue: is click the final val | 147 | // lastValue: is click the final val |
| @@ -140,10 +155,10 @@ | @@ -140,10 +155,10 @@ | ||
| 140 | this.selected.forEach((item) => { | 155 | this.selected.forEach((item) => { |
| 141 | newVal.push(item.value); | 156 | newVal.push(item.value); |
| 142 | }); | 157 | }); |
| 143 | - this.value = newVal; | ||
| 144 | 158 | ||
| 145 | - if (JSON.stringify(this.value) !== oldVal) { | ||
| 146 | - this.$emit('on-change', this.value); | 159 | + if (!fromInit) { |
| 160 | + this.value = newVal; | ||
| 161 | + this.emitValue(this.value, oldVal); | ||
| 147 | } | 162 | } |
| 148 | } | 163 | } |
| 149 | if (lastValue && !fromInit) { | 164 | if (lastValue && !fromInit) { |
src/components/cascader/casitem.vue
src/components/cascader/caspanel.vue
src/styles/components/cascader.less
| @@ -24,14 +24,10 @@ | @@ -24,14 +24,10 @@ | ||
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | &-arrow { | 26 | &-arrow { |
| 27 | - position: absolute; | ||
| 28 | - top: 50%; | ||
| 29 | - right: 8px; | ||
| 30 | - line-height: 1; | ||
| 31 | - margin-top: -6px; | ||
| 32 | - font-size: @font-size-base; | ||
| 33 | - color: @subsidiary-color; | ||
| 34 | - .transition(all @transition-time @ease-in-out); | 27 | + .inner-arrow(); |
| 28 | + } | ||
| 29 | + &-visible &-arrow:nth-of-type(2){ | ||
| 30 | + .transform(rotate(180deg)); | ||
| 35 | } | 31 | } |
| 36 | 32 | ||
| 37 | .@{select-dropdown-prefix-cls} { | 33 | .@{select-dropdown-prefix-cls} { |
| @@ -78,7 +74,7 @@ | @@ -78,7 +74,7 @@ | ||
| 78 | 74 | ||
| 79 | &-active{ | 75 | &-active{ |
| 80 | background-color: @background-color-select-hover; | 76 | background-color: @background-color-select-hover; |
| 81 | - font-weight: bold; | 77 | + color: @primary-color; |
| 82 | } | 78 | } |
| 83 | } | 79 | } |
| 84 | } | 80 | } |
src/styles/components/select.less
| @@ -41,13 +41,7 @@ | @@ -41,13 +41,7 @@ | ||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | &-arrow { | 43 | &-arrow { |
| 44 | - position: absolute; | ||
| 45 | - top: 50%; | ||
| 46 | - right: 8px; | ||
| 47 | - line-height: 1; | ||
| 48 | - margin-top: -6px; | ||
| 49 | - color: @subsidiary-color; | ||
| 50 | - .transition(all @transition-time @ease-in-out); | 44 | + .inner-arrow(); |
| 51 | } | 45 | } |
| 52 | 46 | ||
| 53 | &-visible{ | 47 | &-visible{ |
src/styles/mixins/common.less
| @@ -18,4 +18,16 @@ | @@ -18,4 +18,16 @@ | ||
| 18 | -webkit-user-select: @type; | 18 | -webkit-user-select: @type; |
| 19 | -moz-user-select: @type; | 19 | -moz-user-select: @type; |
| 20 | user-select: @type; | 20 | user-select: @type; |
| 21 | +} | ||
| 22 | + | ||
| 23 | +// for select and input like component's arrow | ||
| 24 | +.inner-arrow() { | ||
| 25 | + position: absolute; | ||
| 26 | + top: 50%; | ||
| 27 | + right: 8px; | ||
| 28 | + line-height: 1; | ||
| 29 | + margin-top: -7px; | ||
| 30 | + font-size: @font-size-base; | ||
| 31 | + color: @subsidiary-color; | ||
| 32 | + .transition(all @transition-time @ease-in-out); | ||
| 21 | } | 33 | } |
| 22 | \ No newline at end of file | 34 | \ No newline at end of file |
test/routers/cascader.vue
| 1 | <template> | 1 | <template> |
| 2 | <div style="margin: 50px;width:300px"> | 2 | <div style="margin: 50px;width:300px"> |
| 3 | - <Cascader :data="data" :value.sync="value" @on-change="change" trigger="click"></Cascader> | 3 | + {{ value | json }} |
| 4 | + <Cascader size="large" :data="data" :value.sync="value" @on-change="change" trigger="hover" :render-format="format"></Cascader> | ||
| 4 | </div> | 5 | </div> |
| 5 | </template> | 6 | </template> |
| 6 | <script> | 7 | <script> |
| @@ -50,8 +51,12 @@ | @@ -50,8 +51,12 @@ | ||
| 50 | 51 | ||
| 51 | }, | 52 | }, |
| 52 | methods: { | 53 | methods: { |
| 53 | - change (data) { | ||
| 54 | - console.log(data) | 54 | + change (data, opts) { |
| 55 | + console.log(data); | ||
| 56 | + console.log(opts) | ||
| 57 | + }, | ||
| 58 | + format (label, data) { | ||
| 59 | + return label[label.length - 1]; | ||
| 55 | } | 60 | } |
| 56 | } | 61 | } |
| 57 | } | 62 | } |