Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 00df2dd

Browse files
committed
chore: stop prev renderEffect before hmr rerender
1 parent 5d3f2fd commit 00df2dd

File tree

4 files changed

+12
-3
lines changed

4 files changed

+12
-3
lines changed

‎packages/runtime-vapor/__tests__/components/Teleport.spec.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ describe('renderer: VaporTeleport', () => {
195195
expect(target.innerHTML).toBe('<div>teleported 2</div>')
196196
})
197197

198-
test.todo('parent rerender + toggle disabled', async () => {
198+
test('parent rerender + toggle disabled', async () => {
199199
const target = document.createElement('div')
200200
const root = document.createElement('div')
201201
const parentId = 'test3-parent-rerender'

‎packages/runtime-vapor/src/component.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import {
5252
resolveDynamicProps,
5353
setupPropsValidation,
5454
} from './componentProps'
55-
import { renderEffect } from './renderEffect'
55+
import { type RenderEffect, renderEffect } from './renderEffect'
5656
import { emit, normalizeEmitsOptions } from './componentEmits'
5757
import { setDynamicProps } from './dom/prop'
5858
import {
@@ -446,6 +446,7 @@ export class VaporComponentInstance implements GenericComponentInstance {
446446
devtoolsRawSetupState?: any
447447
hmrRerender?: () => void
448448
hmrReload?: (newComp: VaporComponent) => void
449+
renderEffects?: RenderEffect[]
449450
parentTeleport?: TeleportFragment | null
450451
propsOptions?: NormalizedPropsOptions
451452
emitsOptions?: ObjectEmitsOptions | null

‎packages/runtime-vapor/src/hmr.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export function hmrRerender(instance: VaporComponentInstance): void {
2121
remove(instance.block, parent)
2222
const prev = setCurrentInstance(instance)
2323
pushWarningContext(instance)
24+
if (instance.renderEffects) {
25+
instance.renderEffects.forEach(e => e.stop())
26+
instance.renderEffects = []
27+
}
2428
devRender(instance)
2529
popWarningContext()
2630
setCurrentInstance(...prev)
@@ -45,6 +49,7 @@ export function hmrReload(
4549
)
4650
setCurrentInstance(...prev)
4751
mountComponent(newInstance, parent, anchor)
52+
4853
updateParentBlockOnHmrReload(parentInstance, instance, newInstance)
4954
updateParentTeleportOnHmrReload(instance, newInstance)
5055
}

‎packages/runtime-vapor/src/renderEffect.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { type VaporComponentInstance, isVaporComponent } from './component'
1212
import { invokeArrayFns } from '@vue/shared'
1313

14-
class RenderEffect extends ReactiveEffect {
14+
export class RenderEffect extends ReactiveEffect {
1515
i: VaporComponentInstance | null
1616
job: SchedulerJob
1717
updateJob: SchedulerJob
@@ -41,6 +41,9 @@ class RenderEffect extends ReactiveEffect {
4141
this.onTrigger = instance.rtg
4242
? e => invokeArrayFns(instance.rtg!, e)
4343
: void 0
44+
45+
// hmr rerender needs to stop all effects under the current instance
46+
;(instance.renderEffects || (instance.renderEffects = [])).push(this)
4447
}
4548
job.i = instance
4649
}

0 commit comments

Comments
 (0)