Commit e4ce99177deb8806eedee55dfa785a9eb2d00603
1 parent
e4ebd304
update Select component
update Select component:filterable
Showing
4 changed files
with
81 additions
and
31 deletions
Show diff stats
components/select/option-group.vue
components/select/select.vue
@@ -12,17 +12,21 @@ | @@ -12,17 +12,21 @@ | ||
12 | <span :class="[`${prefixCls}-selected-value`]" v-show="!showPlaceholder && !multiple && !filterable">{{ selectedSingle }}</span> | 12 | <span :class="[`${prefixCls}-selected-value`]" v-show="!showPlaceholder && !multiple && !filterable">{{ selectedSingle }}</span> |
13 | <input | 13 | <input |
14 | type="text" | 14 | type="text" |
15 | - :class="[`${prefixCls}-input`]" | ||
16 | v-if="filterable" | 15 | v-if="filterable" |
17 | v-model="query" | 16 | v-model="query" |
18 | - :placeholder="placeholder" | 17 | + :class="[`${prefixCls}-input`]" |
18 | + :placeholder="showPlaceholder ? placeholder : ''" | ||
19 | :style="inputStyle" | 19 | :style="inputStyle" |
20 | - @blur="handleBlur"> | 20 | + @blur="handleBlur" |
21 | + @keydown="resetInputState" | ||
22 | + @keydown.delete="handleInputDelete" | ||
23 | + v-el:input> | ||
21 | <Icon type="ios-close" :class="[`${prefixCls}-arrow`]" v-show="showCloseIcon" @click.stop="clearSingleSelect"></Icon> | 24 | <Icon type="ios-close" :class="[`${prefixCls}-arrow`]" v-show="showCloseIcon" @click.stop="clearSingleSelect"></Icon> |
22 | <Icon type="arrow-down-b" :class="[`${prefixCls}-arrow`]"></Icon> | 25 | <Icon type="arrow-down-b" :class="[`${prefixCls}-arrow`]"></Icon> |
23 | </div> | 26 | </div> |
24 | <Dropdown v-show="visible" transition="slide-up" v-ref:dropdown> | 27 | <Dropdown v-show="visible" transition="slide-up" v-ref:dropdown> |
25 | - <ul :class="[`${prefixCls}-dropdown-list`]"><slot></slot></ul> | 28 | + <ul v-show="notFound" :class="[`${prefixCls}-not-found`]"><li>未找到</li></ul> |
29 | + <ul v-else :class="[`${prefixCls}-dropdown-list`]"><slot></slot></ul> | ||
26 | </Dropdown> | 30 | </Dropdown> |
27 | </div> | 31 | </div> |
28 | </template> | 32 | </template> |
@@ -85,7 +89,8 @@ | @@ -85,7 +89,8 @@ | ||
85 | selectedMultiple: [], | 89 | selectedMultiple: [], |
86 | focusIndex: 0, | 90 | focusIndex: 0, |
87 | query: '', | 91 | query: '', |
88 | - inputLength: 20 | 92 | + inputLength: 20, |
93 | + notFound: false | ||
89 | } | 94 | } |
90 | }, | 95 | }, |
91 | computed: { | 96 | computed: { |
@@ -124,7 +129,11 @@ | @@ -124,7 +129,11 @@ | ||
124 | let style = {}; | 129 | let style = {}; |
125 | 130 | ||
126 | if (this.multiple) { | 131 | if (this.multiple) { |
127 | - style.width = `${this.inputLength}px`; | 132 | + if (this.showPlaceholder) { |
133 | + style.width = '100%'; | ||
134 | + } else { | ||
135 | + style.width = `${this.inputLength}px`; | ||
136 | + } | ||
128 | } | 137 | } |
129 | 138 | ||
130 | return style; | 139 | return style; |
@@ -245,6 +254,12 @@ | @@ -245,6 +254,12 @@ | ||
245 | return false; | 254 | return false; |
246 | } | 255 | } |
247 | this.model.splice(index, 1); | 256 | this.model.splice(index, 1); |
257 | + | ||
258 | + if (this.filterable && this.visible) { | ||
259 | + this.$els.input.focus(); | ||
260 | + } | ||
261 | + | ||
262 | + this.$broadcast('on-update-popper'); | ||
248 | }, | 263 | }, |
249 | // to select option for single | 264 | // to select option for single |
250 | toggleSingleSelected (value, init = false) { | 265 | toggleSingleSelected (value, init = false) { |
@@ -404,6 +419,14 @@ | @@ -404,6 +419,14 @@ | ||
404 | } | 419 | } |
405 | } | 420 | } |
406 | }, 300); | 421 | }, 300); |
422 | + }, | ||
423 | + resetInputState () { | ||
424 | + this.inputLength = this.$els.input.value.length * 12 + 20; | ||
425 | + }, | ||
426 | + handleInputDelete () { | ||
427 | + if (this.multiple && this.model.length && this.query === '') { | ||
428 | + this.removeTag(this.model.length - 1); | ||
429 | + } | ||
407 | } | 430 | } |
408 | }, | 431 | }, |
409 | ready () { | 432 | ready () { |
@@ -423,6 +446,9 @@ | @@ -423,6 +446,9 @@ | ||
423 | }, | 446 | }, |
424 | visible (val) { | 447 | visible (val) { |
425 | if (val) { | 448 | if (val) { |
449 | + if (this.multiple && this.filterable) { | ||
450 | + this.$els.input.focus(); | ||
451 | + } | ||
426 | this.$broadcast('on-update-popper'); | 452 | this.$broadcast('on-update-popper'); |
427 | } else { | 453 | } else { |
428 | 454 | ||
@@ -430,6 +456,16 @@ | @@ -430,6 +456,16 @@ | ||
430 | }, | 456 | }, |
431 | query (val) { | 457 | query (val) { |
432 | this.$broadcast('on-query-change', val); | 458 | this.$broadcast('on-query-change', val); |
459 | + let is_hidden = true; | ||
460 | + | ||
461 | + this.$nextTick(() => { | ||
462 | + this.findChild((child) => { | ||
463 | + if (!child.hidden) { | ||
464 | + is_hidden = false; | ||
465 | + } | ||
466 | + }); | ||
467 | + this.notFound = is_hidden; | ||
468 | + }); | ||
433 | } | 469 | } |
434 | }, | 470 | }, |
435 | events: { | 471 | events: { |
@@ -443,6 +479,12 @@ | @@ -443,6 +479,12 @@ | ||
443 | this.removeTag(index); | 479 | this.removeTag(index); |
444 | } else { | 480 | } else { |
445 | this.model.push(value); | 481 | this.model.push(value); |
482 | + this.$broadcast('on-update-popper'); | ||
483 | + } | ||
484 | + | ||
485 | + if (this.filterable) { | ||
486 | + this.query = ''; | ||
487 | + this.$els.input.focus(); | ||
446 | } | 488 | } |
447 | } else { | 489 | } else { |
448 | this.model = value; | 490 | this.model = value; |
local/routers/select.vue
@@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
4 | {{ city | json }}<br> | 4 | {{ city | json }}<br> |
5 | <Button @click="city = 'hangzhou'">切换城市</Button> | 5 | <Button @click="city = 'hangzhou'">切换城市</Button> |
6 | <br> | 6 | <br> |
7 | - <i-select v-if="true" :model.sync="city" style="width:200px" @on-change="change"> | 7 | + <i-select v-if="true" :model.sync="city" style="width:200px" filterable @on-change="change"> |
8 | <i-option-group label="热门城市"> | 8 | <i-option-group label="热门城市"> |
9 | <i-option value="beijing">北京市</i-option> | 9 | <i-option value="beijing">北京市</i-option> |
10 | <i-option value="shanghai" disabled label="上海市">上海市2</i-option> | 10 | <i-option value="shanghai" disabled label="上海市">上海市2</i-option> |
@@ -13,31 +13,16 @@ | @@ -13,31 +13,16 @@ | ||
13 | <i-option-group label="二线城市"> | 13 | <i-option-group label="二线城市"> |
14 | <i-option value="nanjing">南京市</i-option> | 14 | <i-option value="nanjing">南京市</i-option> |
15 | <i-option value="hangzhou">杭州市</i-option> | 15 | <i-option value="hangzhou">杭州市</i-option> |
16 | + <i-option value="heilongjiang" disabled>黑龙江市</i-option> | ||
16 | </i-option-group> | 17 | </i-option-group> |
17 | - <i-option value="heilongjiang" disabled>黑龙江市</i-option> | ||
18 | - <i-option-group label="热门城市"> | ||
19 | - <i-option value="beijing">北京市</i-option> | ||
20 | - <i-option value="shanghai" disabled label="上海市">上海市2</i-option> | ||
21 | - <i-option value="shenzhen">深圳市</i-option> | ||
22 | - </i-option-group> | ||
23 | - <i-option-group label="二线城市"> | ||
24 | - <i-option value="nanjing">南京市</i-option> | ||
25 | - <i-option value="hangzhou">杭州市</i-option> | ||
26 | - </i-option-group> | ||
27 | - <i-option value="heilongjiang" disabled>黑龙江市</i-option> | ||
28 | - <i-option-group label="热门城市"> | ||
29 | - <i-option value="beijing">北京市</i-option> | ||
30 | - <i-option value="shanghai" disabled label="上海市">上海市2</i-option> | ||
31 | - <i-option value="shenzhen">深圳市</i-option> | ||
32 | - </i-option-group> | ||
33 | - <i-option-group label="二线城市"> | ||
34 | - <i-option value="nanjing">南京市</i-option> | ||
35 | - <i-option value="hangzhou">杭州市</i-option> | 18 | + <i-option-group label="其它城市"> |
19 | + <i-option value="jyg">嘉峪关市</i-option> | ||
20 | + <i-option value="lanzhou">兰州市</i-option> | ||
21 | + <i-option value="beijingxi">北京西</i-option> | ||
36 | </i-option-group> | 22 | </i-option-group> |
37 | - <i-option value="heilongjiang" disabled>黑龙江市</i-option> | ||
38 | </i-select> | 23 | </i-select> |
39 | 24 | ||
40 | - <i-select :model.sync="focus" style="width:200px" @on-change="change" clearable filterable label-in-value> | 25 | + <i-select v-show="true" :model.sync="focus" style="width:200px" @on-change="change" clearable filterable label-in-value> |
41 | <i-option value="beijing">北京</i-option> | 26 | <i-option value="beijing">北京</i-option> |
42 | <i-option value="shanghai" label="上海市">上海市</i-option> | 27 | <i-option value="shanghai" label="上海市">上海市</i-option> |
43 | <i-option value="shenzhen" disabled>深圳市</i-option> | 28 | <i-option value="shenzhen" disabled>深圳市</i-option> |
@@ -51,6 +36,19 @@ | @@ -51,6 +36,19 @@ | ||
51 | <i-option value="e">e市</i-option> | 36 | <i-option value="e">e市</i-option> |
52 | </i-select> | 37 | </i-select> |
53 | 38 | ||
39 | + <i-select v-if="true" :model.sync="focus2" style="width:300px" @on-change="change" clearable filterable multiple> | ||
40 | + <i-option value="beijing" label="北京市">北京2</i-option> | ||
41 | + <i-option value="shanghai">上海市</i-option> | ||
42 | + <i-option value="shenzhen" disabled>深圳市</i-option> | ||
43 | + <i-option value="guangzhou">广州市</i-option> | ||
44 | + <i-option value="shijiazhuang">石家庄市</i-option> | ||
45 | + <i-option value="a">a1市</i-option> | ||
46 | + <i-option value="b">b2市</i-option> | ||
47 | + <i-option value="c">c1市</i-option> | ||
48 | + <i-option value="d">d2市</i-option> | ||
49 | + <i-option value="e">e1市</i-option> | ||
50 | + </i-select> | ||
51 | + | ||
54 | <i-select v-if="true" :model.sync="focus2" style="width:300px" @on-change="change" clearable multiple> | 52 | <i-select v-if="true" :model.sync="focus2" style="width:300px" @on-change="change" clearable multiple> |
55 | <i-option value="beijing" label="北京市">北京2</i-option> | 53 | <i-option value="beijing" label="北京市">北京2</i-option> |
56 | <i-option value="shanghai">上海市</i-option> | 54 | <i-option value="shanghai">上海市</i-option> |
@@ -84,7 +82,7 @@ | @@ -84,7 +82,7 @@ | ||
84 | return { | 82 | return { |
85 | city: '', | 83 | city: '', |
86 | focus: '', | 84 | focus: '', |
87 | - focus2: ['beijing', 'guangzhou', 'b'] | 85 | + focus2: ['beijing'] |
88 | // focus2: [] | 86 | // focus2: [] |
89 | } | 87 | } |
90 | }, | 88 | }, |
styles/components/select.less
@@ -163,6 +163,17 @@ | @@ -163,6 +163,17 @@ | ||
163 | &-small &-input{ | 163 | &-small &-input{ |
164 | height: @input-height-small; | 164 | height: @input-height-small; |
165 | } | 165 | } |
166 | + | ||
167 | + &-multiple &-input{ | ||
168 | + height: 25px; | ||
169 | + line-height: 28px; | ||
170 | + padding: 0 0 0 6px; | ||
171 | + } | ||
172 | + | ||
173 | + &-not-found{ | ||
174 | + text-align: center; | ||
175 | + color: @btn-disable-color; | ||
176 | + } | ||
166 | } | 177 | } |
167 | 178 | ||
168 | .@{select-item-prefix-cls} { | 179 | .@{select-item-prefix-cls} { |