diff --git a/packages/components/select/src/options.ts b/packages/components/select/src/options.ts new file mode 100644 index 0000000000..8cbda10c38 --- /dev/null +++ b/packages/components/select/src/options.ts @@ -0,0 +1,29 @@ +import { defineComponent } from 'vue' + +import type { Component, VNode } from 'vue' + +export default defineComponent({ + name: 'ElOptions', + emits: ['update-options'], + setup(_, { slots, emit }) { + return () => { + const children = slots.default?.()! + + if (children.length) { + const options = (children![0]?.children as VNode[])?.[0]?.children || [] + if (options && options.length) { + const filteredOptions = (options as VNode[]) + .filter( + (item: VNode) => + ((item?.type || {}) as Component)?.name === 'ElOption' + ) + .map((item: VNode) => item.props?.label) + + emit('update-options', filteredOptions) + } + } + + return children + } + }, +}) diff --git a/packages/components/select/src/select.vue b/packages/components/select/src/select.vue index 43738074ef..e14be246b4 100644 --- a/packages/components/select/src/select.vue +++ b/packages/components/select/src/select.vue @@ -247,7 +247,9 @@ ]" > - + + +