From 0c3edb10b06006b8745e626a330d5efdf0b22d0e Mon Sep 17 00:00:00 2001 From: Netfan Date: Wed, 21 May 2025 14:48:51 +0800 Subject: [PATCH 1/3] fix: getFieldComponentRef will return actual ref within AsyncComponentWrapper (#6252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复异步加载组件时,表单的getFieldComponentRef方法没能获取到正确的组件实例 --- packages/@core/ui-kit/form-ui/src/form-api.ts | 23 ++++++++++++++++--- playground/src/views/examples/form/api.vue | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/@core/ui-kit/form-ui/src/form-api.ts b/packages/@core/ui-kit/form-ui/src/form-api.ts index 0ae8ed77..e097a465 100644 --- a/packages/@core/ui-kit/form-ui/src/form-api.ts +++ b/packages/@core/ui-kit/form-ui/src/form-api.ts @@ -11,7 +11,7 @@ import type { Recordable } from '@vben-core/typings'; import type { FormActions, FormSchema, VbenFormProps } from './types'; -import { toRaw } from 'vue'; +import { isRef, toRaw } from 'vue'; import { Store } from '@vben-core/shared/store'; import { @@ -100,9 +100,26 @@ export class FormApi { getFieldComponentRef( fieldName: string, ): T | undefined { - return this.componentRefMap.has(fieldName) - ? (this.componentRefMap.get(fieldName) as T) + let target = this.componentRefMap.has(fieldName) + ? (this.componentRefMap.get(fieldName) as ComponentPublicInstance) : undefined; + if ( + target && + target.$.type.name === 'AsyncComponentWrapper' && + target.$.subTree.ref + ) { + if (Array.isArray(target.$.subTree.ref)) { + if ( + target.$.subTree.ref.length > 0 && + isRef(target.$.subTree.ref[0]?.r) + ) { + target = target.$.subTree.ref[0]?.r.value as ComponentPublicInstance; + } + } else if (isRef(target.$.subTree.ref.r)) { + target = target.$.subTree.ref.r.value as ComponentPublicInstance; + } + } + return target as T; } /** diff --git a/playground/src/views/examples/form/api.vue b/playground/src/views/examples/form/api.vue index e367cb85..a7e15a08 100644 --- a/playground/src/views/examples/form/api.vue +++ b/playground/src/views/examples/form/api.vue @@ -134,7 +134,7 @@ function handleClick( } case 'componentRef': { // 获取下拉组件的实例,并调用它的focus方法 - formApi.getFieldComponentRef('fieldOptions')?.focus(); + formApi.getFieldComponentRef('fieldOptions')?.focus?.(); break; } case 'disabled': { From ebef2c91e250c30c76bbd80f2e75ba9caae35d52 Mon Sep 17 00:00:00 2001 From: LinaBell <15891557205@163.com> Date: Thu, 22 May 2025 09:04:40 +0800 Subject: [PATCH 2/3] fix: tab cannot be displayed correctly after browser refresh (#6256) --- packages/stores/src/modules/tabbar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stores/src/modules/tabbar.ts b/packages/stores/src/modules/tabbar.ts index 17215a5e..5b892b66 100644 --- a/packages/stores/src/modules/tabbar.ts +++ b/packages/stores/src/modules/tabbar.ts @@ -208,7 +208,7 @@ export const useTabbarStore = defineStore('core-tabbar', { const keys: string[] = []; for (const key of closeKeys) { - if (key !== tab.key) { + if (key !== getTabKeyFromTab(tab)) { const closeTab = this.tabs.find( (item) => getTabKeyFromTab(item) === key, ); From 11b2b5bcc2068c7e05699e6e5295e380b45dc5b8 Mon Sep 17 00:00:00 2001 From: ali-pay Date: Thu, 22 May 2025 09:09:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=AD=E6=8C=89=E9=92=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=80=BC=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98=20(#6255?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- playground/src/views/system/menu/data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playground/src/views/system/menu/data.ts b/playground/src/views/system/menu/data.ts index ee787e50..75190b4a 100644 --- a/playground/src/views/system/menu/data.ts +++ b/playground/src/views/system/menu/data.ts @@ -11,7 +11,7 @@ export function getMenuTypeOptions() { value: 'catalog', }, { color: 'default', label: $t('system.menu.typeMenu'), value: 'menu' }, - { color: 'error', label: $t('system.menu.typeButton'), value: 'action' }, + { color: 'error', label: $t('system.menu.typeButton'), value: 'button' }, { color: 'success', label: $t('system.menu.typeEmbedded'),