Commit 9c32a05699c5ab1ec5b8534f998ffd50f2ff51fd

Authored by Sergio Crisostomo
1 parent 17db7df4

Optimize append and remove options

src/components/select/select.vue
... ... @@ -50,6 +50,7 @@
50 50 import { oneOf, findComponentDownward } from '../../utils/assist';
51 51 import Emitter from '../../mixins/emitter';
52 52 import Locale from '../../mixins/locale';
  53 + import {debounce} from './utils';
53 54  
54 55 const prefixCls = 'ivu-select';
55 56  
... ... @@ -623,6 +624,18 @@
623 624 this.broadcast('iOption', 'on-query-change', val);
624 625 }
625 626 },
  627 + debouncedAppendRemove: debounce(function(){
  628 + if (!this.remote) {
  629 + this.modelToQuery();
  630 + this.$nextTick(() => this.broadcastQuery(''));
  631 + } else {
  632 + this.findChild((child) => {
  633 + child.selected = this.multiple ? this.model.indexOf(child.value) > -1 : this.model === child.value;
  634 + });
  635 + }
  636 + this.slotChange();
  637 + this.updateOptions(true, true);
  638 + }),
626 639 // 处理 remote 初始值
627 640 updateLabel () {
628 641 if (this.remote) {
... ... @@ -656,34 +669,8 @@
656 669 this.updateOptions(true);
657 670 document.addEventListener('keydown', this.handleKeydown);
658 671  
659   - this.$on('append', () => {
660   - if (!this.remote) {
661   - this.modelToQuery();
662   - this.$nextTick(() => {
663   - this.broadcastQuery('');
664   - });
665   - } else {
666   - this.findChild(child => {
667   - child.selected = this.multiple ? this.model.indexOf(child.value) > -1 : this.model === child.value;
668   - });
669   - }
670   - this.slotChange();
671   - this.updateOptions(true, true);
672   - });
673   - this.$on('remove', () => {
674   - if (!this.remote) {
675   - this.modelToQuery();
676   - this.$nextTick(() => {
677   - this.broadcastQuery('');
678   - });
679   - } else {
680   - this.findChild(child => {
681   - child.selected = this.multiple ? this.model.indexOf(child.value) > -1 : this.model === child.value;
682   - });
683   - }
684   - this.slotChange();
685   - this.updateOptions(true, true);
686   - });
  672 + this.$on('append', this.debouncedAppendRemove);
  673 + this.$on('remove', this.debouncedAppendRemove);
687 674  
688 675 this.$on('on-select-selected', (value) => {
689 676 if (this.model === value) {
... ...
src/components/select/utils.js 0 → 100644
  1 +export function debounce(fn) {
  2 + let waiting;
  3 + return function() {
  4 + if (waiting) return;
  5 + waiting = true;
  6 + const context = this,
  7 + args = arguments;
  8 + const later = function() {
  9 + waiting = false;
  10 + fn.apply(context, args);
  11 + };
  12 + this.$nextTick(later);
  13 + };
  14 +}
... ...
test/unit/specs/select.spec.js
... ... @@ -156,7 +156,7 @@ describe('Select.vue', () => {
156 156 });
157 157  
158 158 describe('Performance tests', () => {
159   - xit('should handle big numbers of options', done => {
  159 + it('should handle big numbers of options', done => {
160 160 const manyLaterOptions = Array.apply(null, Array(200)).map((_, i) => {
161 161 return {
162 162 value: i + 1,
... ...