Skip to content

Commit 684e47c

Browse files
committed
fix(runtime-vapor): reset insertion state to avoid duplicate block inserts
1 parent 9ab8e4c commit 684e47c

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

packages/runtime-vapor/src/apiCreateFor.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ import type { DynamicSlot } from './componentSlots'
2323
import { renderEffect } from './renderEffect'
2424
import { VaporVForFlags } from '../../shared/src/vaporFlags'
2525
import { isHydrating, locateHydrationNode } from './dom/hydration'
26-
import { insertionAnchor, insertionParent } from './insertionState'
26+
import {
27+
insertionAnchor,
28+
insertionParent,
29+
resetInsertionState,
30+
} from './insertionState'
2731

2832
class ForBlock extends VaporFragment {
2933
scope: EffectScope | undefined
@@ -72,6 +76,8 @@ export const createFor = (
7276
const _insertionAnchor = insertionAnchor
7377
if (isHydrating) {
7478
locateHydrationNode()
79+
} else {
80+
resetInsertionState()
7581
}
7682

7783
let isMounted = false

packages/runtime-vapor/src/apiCreateIf.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { type Block, type BlockFn, DynamicFragment, insert } from './block'
22
import { isHydrating, locateHydrationNode } from './dom/hydration'
3-
import { insertionAnchor, insertionParent } from './insertionState'
3+
import {
4+
insertionAnchor,
5+
insertionParent,
6+
resetInsertionState,
7+
} from './insertionState'
48
import { renderEffect } from './renderEffect'
59

610
export function createIf(
@@ -13,6 +17,8 @@ export function createIf(
1317
const _insertionAnchor = insertionAnchor
1418
if (isHydrating) {
1519
locateHydrationNode()
20+
} else {
21+
resetInsertionState()
1622
}
1723

1824
let frag: Block

packages/runtime-vapor/src/component.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ import {
5959
} from './componentSlots'
6060
import { hmrReload, hmrRerender } from './hmr'
6161
import { isHydrating, locateHydrationNode } from './dom/hydration'
62-
import { insertionAnchor, insertionParent } from './insertionState'
62+
import {
63+
insertionAnchor,
64+
insertionParent,
65+
resetInsertionState,
66+
} from './insertionState'
6367

6468
export { currentInstance } from '@vue/runtime-dom'
6569

@@ -142,6 +146,8 @@ export function createComponent(
142146
const _insertionAnchor = insertionAnchor
143147
if (isHydrating) {
144148
locateHydrationNode()
149+
} else {
150+
resetInsertionState()
145151
}
146152

147153
// vdom interop enabled and component is not an explicit vapor component

packages/runtime-vapor/src/componentSlots.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { rawPropsProxyHandlers } from './componentProps'
44
import { currentInstance, isRef } from '@vue/runtime-dom'
55
import type { LooseRawProps, VaporComponentInstance } from './component'
66
import { renderEffect } from './renderEffect'
7-
import { insertionAnchor, insertionParent } from './insertionState'
7+
import {
8+
insertionAnchor,
9+
insertionParent,
10+
resetInsertionState,
11+
} from './insertionState'
812
import { isHydrating, locateHydrationNode } from './dom/hydration'
913

1014
export type RawSlots = Record<string, VaporSlot> & {
@@ -96,6 +100,8 @@ export function createSlot(
96100
const _insertionAnchor = insertionAnchor
97101
if (isHydrating) {
98102
locateHydrationNode()
103+
} else {
104+
resetInsertionState()
99105
}
100106

101107
const instance = currentInstance as VaporComponentInstance

0 commit comments

Comments
 (0)