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