From 8bc08429844dc9046c86adfc545ae1dcb7f3a031 Mon Sep 17 00:00:00 2001 From: heart <7362469@qq.com> Date: Sat, 30 Dec 2023 22:47:05 +0800 Subject: [PATCH 1/2] fix(vue): fixed modal component failed to trigger update in vue@3.4.x version --- components/_util/vnode.ts | 5 +++++ components/modal/confirm.tsx | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/components/_util/vnode.ts b/components/_util/vnode.ts index 1f8265c2d9..00645eeaec 100644 --- a/components/_util/vnode.ts +++ b/components/_util/vnode.ts @@ -51,3 +51,8 @@ export function deepCloneElement( return cloned; } } + +export function triggerVNodeUpdate(instance: VNode) { + instance.component.effect.dirty = true; + instance.component.update(); +} diff --git a/components/modal/confirm.tsx b/components/modal/confirm.tsx index 88959f73f7..869bd53a3d 100644 --- a/components/modal/confirm.tsx +++ b/components/modal/confirm.tsx @@ -3,6 +3,7 @@ import ConfirmDialog from './ConfirmDialog'; import type { ModalFuncProps } from './Modal'; import ConfigProvider, { globalConfigForApi } from '../config-provider'; import omit from '../_util/omit'; +import { triggerVNodeUpdate } from '../_util/vnode'; import { getConfirmLocale } from './locale'; import destroyFns from './destroyFns'; @@ -71,7 +72,7 @@ const confirm = (config: ModalFuncProps) => { } if (confirmDialogInstance) { Object.assign(confirmDialogInstance.component.props, currentConfig); - confirmDialogInstance.component.update(); + triggerVNodeUpdate(confirmDialogInstance); } } From 40ceb5c91667c759e9cec7141fcfe84df7fd04a4 Mon Sep 17 00:00:00 2001 From: heart <7362469@qq.com> Date: Wed, 3 Jan 2024 23:58:11 +0800 Subject: [PATCH 2/2] refactor: use cloneVNode trigger vNode update --- components/_util/vnode.ts | 7 +++---- components/modal/confirm.tsx | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/components/_util/vnode.ts b/components/_util/vnode.ts index 00645eeaec..e5ab010a42 100644 --- a/components/_util/vnode.ts +++ b/components/_util/vnode.ts @@ -1,6 +1,6 @@ import { filterEmpty } from './props-util'; import type { VNode, VNodeProps } from 'vue'; -import { cloneVNode, isVNode } from 'vue'; +import { cloneVNode, isVNode, render as VueRender } from 'vue'; import warning from './warning'; import type { RefObject } from './createRef'; type NodeProps = Record & @@ -52,7 +52,6 @@ export function deepCloneElement( } } -export function triggerVNodeUpdate(instance: VNode) { - instance.component.effect.dirty = true; - instance.component.update(); +export function triggerVNodeUpdate(vm: VNode, attrs: Record, dom: any) { + VueRender(cloneVNode(vm, { ...attrs }), dom); } diff --git a/components/modal/confirm.tsx b/components/modal/confirm.tsx index 869bd53a3d..80bd620823 100644 --- a/components/modal/confirm.tsx +++ b/components/modal/confirm.tsx @@ -71,8 +71,7 @@ const confirm = (config: ModalFuncProps) => { }; } if (confirmDialogInstance) { - Object.assign(confirmDialogInstance.component.props, currentConfig); - triggerVNodeUpdate(confirmDialogInstance); + triggerVNodeUpdate(confirmDialogInstance, currentConfig, container); } }