Commit a9131058abfaee847e14feff0066d8ff7ed129bf

Authored by 梁灏
1 parent 04e5e3cd

optimize Select event broadcast

optimize Select event broadcast
examples/routers/select.vue
@@ -196,7 +196,16 @@ @@ -196,7 +196,16 @@
196 <Row> 196 <Row>
197 <i-col span="12" style="padding-right:10px"> 197 <i-col span="12" style="padding-right:10px">
198 <Select v-model="model11" filterable> 198 <Select v-model="model11" filterable>
199 - <i-option v-for="item in cityList" :value="item.value">{{ item.label }}</i-option> 199 + <Option-group label="123">
  200 + <i-option value="beijing">北京市</i-option>
  201 + <i-option value="shanghai">上海市</i-option>
  202 + </Option-group>
  203 + <Option-group label="456">
  204 + <i-option value="shenzhen">深圳市</i-option>
  205 + <i-option value="hangzhou">杭州市</i-option>
  206 + </Option-group>
  207 + <i-option value="nanjing">南京市</i-option>
  208 + <i-option value="chongqing">重庆市</i-option>
200 </Select> 209 </Select>
201 </i-col> 210 </i-col>
202 <i-col span="12"> 211 <i-col span="12">
src/components/select/select.vue
@@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
36 import Icon from '../icon'; 36 import Icon from '../icon';
37 import Drop from './dropdown.vue'; 37 import Drop from './dropdown.vue';
38 import clickoutside from '../../directives/clickoutside'; 38 import clickoutside from '../../directives/clickoutside';
39 - import { oneOf, MutationObserver } from '../../utils/assist'; 39 + import { oneOf, MutationObserver, findComponentDownward } from '../../utils/assist';
40 import { t } from '../../locale'; 40 import { t } from '../../locale';
41 import Emitter from '../../mixins/emitter'; 41 import Emitter from '../../mixins/emitter';
42 42
@@ -507,6 +507,7 @@ @@ -507,6 +507,7 @@
507 document.addEventListener('keydown', this.handleKeydown); 507 document.addEventListener('keydown', this.handleKeydown);
508 508
509 // watch slot changed 509 // watch slot changed
  510 + // todo 在 child 的 mounted 和 beforeDestroy 里处理
510 if (MutationObserver) { 511 if (MutationObserver) {
511 this.observer = new MutationObserver(() => { 512 this.observer = new MutationObserver(() => {
512 this.modelToQuery(); 513 this.modelToQuery();
@@ -590,9 +591,12 @@ @@ -590,9 +591,12 @@
590 } 591 }
591 }, 592 },
592 query (val) { 593 query (val) {
593 - // todo 这里会重复  
594 - this.broadcast('OptionGroup', 'on-query-change', val);  
595 - this.broadcast('iOption', 'on-query-change', val); 594 + if (findComponentDownward(this, 'OptionGroup')) {
  595 + this.broadcast('OptionGroup', 'on-query-change', val);
  596 + this.broadcast('iOption', 'on-query-change', val);
  597 + } else {
  598 + this.broadcast('iOption', 'on-query-change', val);
  599 + }
596 let is_hidden = true; 600 let is_hidden = true;
597 601
598 this.$nextTick(() => { 602 this.$nextTick(() => {
src/utils/assist.js
@@ -183,4 +183,33 @@ function findComponentUpward (content, componentName, componentNames) { @@ -183,4 +183,33 @@ function findComponentUpward (content, componentName, componentNames) {
183 } 183 }
184 return parent; 184 return parent;
185 } 185 }
186 -export {findComponentUpward};  
187 \ No newline at end of file 186 \ No newline at end of file
  187 +export {findComponentUpward};
  188 +
  189 +// Find components downward
  190 +function findComponentDownward (content, componentName) {
  191 + let childrens = content.$children;
  192 + let children = null;
  193 +
  194 + if (childrens.length) {
  195 + childrens.forEach(child => {
  196 + const name = child.$options.name;
  197 + if (name === componentName) {
  198 + children = child;
  199 + }
  200 + });
  201 +
  202 + for (let i = 0; i < childrens.length; i++) {
  203 + const child = childrens[i];
  204 + const name = child.$options.name;
  205 + if (name === componentName) {
  206 + children = child;
  207 + break;
  208 + } else {
  209 + children = findComponentDownward(child, componentName);
  210 + if (children) break;
  211 + }
  212 + }
  213 + }
  214 + return children;
  215 +}
  216 +export {findComponentDownward};
188 \ No newline at end of file 217 \ No newline at end of file