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 @@
]"
>
-
+
+
+