Commit e4ebd304380912ae11ada4753c7134e1cd14a8ca

Authored by 梁灏
1 parent e355dd49

update Select component

update Select component:add filterable
components/select/option-group.vue
@@ -18,7 +18,8 @@ @@ -18,7 +18,8 @@
18 }, 18 },
19 data () { 19 data () {
20 return { 20 return {
21 - prefixCls: prefixCls 21 + prefixCls: prefixCls,
  22 + hidden: false // for search
22 } 23 }
23 } 24 }
24 } 25 }
components/select/option.vue
1 <template> 1 <template>
2 - <li :class="classes" @click.stop="select" @mouseout.stop="blur"><slot>{{ showLabel }}</slot></li> 2 + <li :class="classes" @click.stop="select" @mouseout.stop="blur" v-show="!hidden"><slot>{{ showLabel }}</slot></li>
3 </template> 3 </template>
4 <script> 4 <script>
5 const prefixCls = 'ivu-select-item'; 5 const prefixCls = 'ivu-select-item';
@@ -23,7 +23,9 @@ @@ -23,7 +23,9 @@
23 return { 23 return {
24 selected: false, 24 selected: false,
25 index: 0, // for up and down to focus 25 index: 0, // for up and down to focus
26 - isFocus: false 26 + isFocus: false,
  27 + hidden: false, // for search
  28 + searchLabel: '' // the value is slot,only for search
27 } 29 }
28 }, 30 },
29 computed: { 31 computed: {
@@ -51,14 +53,20 @@ @@ -51,14 +53,20 @@
51 }, 53 },
52 blur () { 54 blur () {
53 this.isFocus = false; 55 this.isFocus = false;
  56 + },
  57 + queryChange (val) {
  58 + this.hidden = !new RegExp(val, 'i').test(this.searchLabel);
54 } 59 }
55 }, 60 },
56 ready () { 61 ready () {
57 - 62 + this.searchLabel = this.$el.innerHTML;
58 }, 63 },
59 events: { 64 events: {
60 'on-select-close' () { 65 'on-select-close' () {
61 this.isFocus = false; 66 this.isFocus = false;
  67 + },
  68 + 'on-query-change' (val) {
  69 + this.queryChange(val);
62 } 70 }
63 } 71 }
64 } 72 }
components/select/select.vue
@@ -16,7 +16,8 @@ @@ -16,7 +16,8 @@
16 v-if="filterable" 16 v-if="filterable"
17 v-model="query" 17 v-model="query"
18 :placeholder="placeholder" 18 :placeholder="placeholder"
19 - :style="inputStyle"> 19 + :style="inputStyle"
  20 + @blur="handleBlur">
20 <Icon type="ios-close" :class="[`${prefixCls}-arrow`]" v-show="showCloseIcon" @click.stop="clearSingleSelect"></Icon> 21 <Icon type="ios-close" :class="[`${prefixCls}-arrow`]" v-show="showCloseIcon" @click.stop="clearSingleSelect"></Icon>
21 <Icon type="arrow-down-b" :class="[`${prefixCls}-arrow`]"></Icon> 22 <Icon type="arrow-down-b" :class="[`${prefixCls}-arrow`]"></Icon>
22 </div> 23 </div>
@@ -209,6 +210,10 @@ @@ -209,6 +210,10 @@
209 child.selected = false; 210 child.selected = false;
210 }); 211 });
211 this.model = ''; 212 this.model = '';
  213 +
  214 + if (this.filterable) {
  215 + this.query = '';
  216 + }
212 } 217 }
213 }, 218 },
214 updateMultipleSelected (init = false) { 219 updateMultipleSelected (init = false) {
@@ -342,24 +347,32 @@ @@ -342,24 +347,32 @@
342 } 347 }
343 348
344 let child_status = { 349 let child_status = {
345 - disabled: false 350 + disabled: false,
  351 + hidden: false
346 }; 352 };
347 353
  354 + let find_deep = false; // can next find allowed
  355 +
348 this.findChild((child) => { 356 this.findChild((child) => {
349 if (child.index === this.focusIndex) { 357 if (child.index === this.focusIndex) {
350 child_status.disabled = child.disabled; 358 child_status.disabled = child.disabled;
  359 + child_status.hidden = child.hidden;
351 360
352 - if (!child.disabled) { 361 + if (!child.disabled && !child.hidden) {
353 child.isFocus = true; 362 child.isFocus = true;
354 } 363 }
355 } else { 364 } else {
356 child.isFocus = false; 365 child.isFocus = false;
357 } 366 }
  367 +
  368 + if (!child.hidden && !child.disabled) {
  369 + find_deep = true;
  370 + }
358 }); 371 });
359 372
360 this.resetScrollTop(); 373 this.resetScrollTop();
361 374
362 - if (child_status.disabled) { 375 + if ((child_status.disabled || child_status.hidden) && find_deep) {
363 this.navigateOptions(direction); 376 this.navigateOptions(direction);
364 } 377 }
365 }, 378 },
@@ -374,6 +387,23 @@ @@ -374,6 +387,23 @@
374 if (topOverflowDistance < 0) { 387 if (topOverflowDistance < 0) {
375 this.$refs.dropdown.$el.scrollTop += topOverflowDistance; 388 this.$refs.dropdown.$el.scrollTop += topOverflowDistance;
376 } 389 }
  390 + },
  391 + handleBlur () {
  392 + setTimeout(() => {
  393 + const model = this.model;
  394 +
  395 + if (this.multiple) {
  396 +
  397 + } else {
  398 + if (model !== '') {
  399 + this.findChild((child) => {
  400 + if (child.value === model) {
  401 + this.query = child.searchLabel;
  402 + }
  403 + });
  404 + }
  405 + }
  406 + }, 300);
377 } 407 }
378 }, 408 },
379 ready () { 409 ready () {
@@ -397,6 +427,9 @@ @@ -397,6 +427,9 @@
397 } else { 427 } else {
398 428
399 } 429 }
  430 + },
  431 + query (val) {
  432 + this.$broadcast('on-query-change', val);
400 } 433 }
401 }, 434 },
402 events: { 435 events: {
@@ -413,6 +446,14 @@ @@ -413,6 +446,14 @@
413 } 446 }
414 } else { 447 } else {
415 this.model = value; 448 this.model = value;
  449 +
  450 + if (this.filterable) {
  451 + this.findChild((child) => {
  452 + if (child.value === value) {
  453 + this.query = child.searchLabel;
  454 + }
  455 + });
  456 + }
416 } 457 }
417 } 458 }
418 } 459 }
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 :model.sync="city" style="width:200px" @on-change="change"> 7 + <i-select v-if="true" :model.sync="city" style="width:200px" @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>
@@ -38,11 +38,12 @@ @@ -38,11 +38,12 @@
38 </i-select> 38 </i-select>
39 39
40 <i-select :model.sync="focus" style="width:200px" @on-change="change" clearable filterable label-in-value> 40 <i-select :model.sync="focus" style="width:200px" @on-change="change" clearable filterable label-in-value>
41 - <i-option value="beijing">北京</i-option> 41 + <i-option value="beijing">北京</i-option>
42 <i-option value="shanghai" label="上海市">上海市</i-option> 42 <i-option value="shanghai" label="上海市">上海市</i-option>
43 <i-option value="shenzhen" disabled>深圳市</i-option> 43 <i-option value="shenzhen" disabled>深圳市</i-option>
44 <i-option value="guangzhou" label="广州市">广州市2</i-option> 44 <i-option value="guangzhou" label="广州市">广州市2</i-option>
45 <i-option value="shijiazhuang" disabled>石家庄市</i-option> 45 <i-option value="shijiazhuang" disabled>石家庄市</i-option>
  46 + <!--<i-option value="shijiazhuang2">石家庄市2</i-option>-->
46 <i-option value="a">a市</i-option> 47 <i-option value="a">a市</i-option>
47 <i-option value="b">b市</i-option> 48 <i-option value="b">b市</i-option>
48 <i-option value="c">c市</i-option> 49 <i-option value="c">c市</i-option>
@@ -50,8 +51,8 @@ @@ -50,8 +51,8 @@
50 <i-option value="e">e市</i-option> 51 <i-option value="e">e市</i-option>
51 </i-select> 52 </i-select>
52 53
53 - <i-select :model.sync="focus2" style="width:300px" @on-change="change" clearable multiple>  
54 - <i-option value="beijing">北京市</i-option> 54 + <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>
55 <i-option value="shanghai">上海市</i-option> 56 <i-option value="shanghai">上海市</i-option>
56 <i-option value="shenzhen" disabled>深圳市</i-option> 57 <i-option value="shenzhen" disabled>深圳市</i-option>
57 <i-option value="guangzhou">广州市</i-option> 58 <i-option value="guangzhou">广州市</i-option>