Commit a9131058abfaee847e14feff0066d8ff7ed129bf
1 parent
04e5e3cd
optimize Select event broadcast
optimize Select event broadcast
Showing
3 changed files
with
48 additions
and
6 deletions
Show diff stats
examples/routers/select.vue
... | ... | @@ -196,7 +196,16 @@ |
196 | 196 | <Row> |
197 | 197 | <i-col span="12" style="padding-right:10px"> |
198 | 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 | 209 | </Select> |
201 | 210 | </i-col> |
202 | 211 | <i-col span="12"> | ... | ... |
src/components/select/select.vue
... | ... | @@ -36,7 +36,7 @@ |
36 | 36 | import Icon from '../icon'; |
37 | 37 | import Drop from './dropdown.vue'; |
38 | 38 | import clickoutside from '../../directives/clickoutside'; |
39 | - import { oneOf, MutationObserver } from '../../utils/assist'; | |
39 | + import { oneOf, MutationObserver, findComponentDownward } from '../../utils/assist'; | |
40 | 40 | import { t } from '../../locale'; |
41 | 41 | import Emitter from '../../mixins/emitter'; |
42 | 42 | |
... | ... | @@ -507,6 +507,7 @@ |
507 | 507 | document.addEventListener('keydown', this.handleKeydown); |
508 | 508 | |
509 | 509 | // watch slot changed |
510 | + // todo 在 child 的 mounted 和 beforeDestroy 里处理 | |
510 | 511 | if (MutationObserver) { |
511 | 512 | this.observer = new MutationObserver(() => { |
512 | 513 | this.modelToQuery(); |
... | ... | @@ -590,9 +591,12 @@ |
590 | 591 | } |
591 | 592 | }, |
592 | 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 | 600 | let is_hidden = true; |
597 | 601 | |
598 | 602 | this.$nextTick(() => { | ... | ... |
src/utils/assist.js
... | ... | @@ -183,4 +183,33 @@ function findComponentUpward (content, componentName, componentNames) { |
183 | 183 | } |
184 | 184 | return parent; |
185 | 185 | } |
186 | -export {findComponentUpward}; | |
187 | 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 | 217 | \ No newline at end of file | ... | ... |