|
@@ -10,6 +10,7 @@ import {
|
|
|
markRaw,
|
|
markRaw,
|
|
|
nextTick,
|
|
nextTick,
|
|
|
nodeOps,
|
|
nodeOps,
|
|
|
|
|
+ onMounted,
|
|
|
h as originalH,
|
|
h as originalH,
|
|
|
ref,
|
|
ref,
|
|
|
render,
|
|
render,
|
|
@@ -18,6 +19,10 @@ import {
|
|
|
} from '@vue/runtime-test'
|
|
} from '@vue/runtime-test'
|
|
|
import { Fragment, createCommentVNode, createVNode } from '../../src/vnode'
|
|
import { Fragment, createCommentVNode, createVNode } from '../../src/vnode'
|
|
|
import { compile, createApp as createDOMApp, render as domRender } from 'vue'
|
|
import { compile, createApp as createDOMApp, render as domRender } from 'vue'
|
|
|
|
|
+import type { HMRRuntime } from '../../src/hmr'
|
|
|
|
|
+
|
|
|
|
|
+declare var __VUE_HMR_RUNTIME__: HMRRuntime
|
|
|
|
|
+const { rerender, createRecord } = __VUE_HMR_RUNTIME__
|
|
|
|
|
|
|
|
describe('renderer: teleport', () => {
|
|
describe('renderer: teleport', () => {
|
|
|
describe('eager mode', () => {
|
|
describe('eager mode', () => {
|
|
@@ -741,4 +746,56 @@ describe('renderer: teleport', () => {
|
|
|
expect(tRefInMounted).toBe(target.children[1])
|
|
expect(tRefInMounted).toBe(target.children[1])
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ test('handle update and hmr rerender', async () => {
|
|
|
|
|
+ const target = document.createElement('div')
|
|
|
|
|
+ const root = document.createElement('div')
|
|
|
|
|
+
|
|
|
|
|
+ const Comp = {
|
|
|
|
|
+ setup() {
|
|
|
|
|
+ const cls = ref('foo')
|
|
|
|
|
+ onMounted(() => {
|
|
|
|
|
+ // trigger update
|
|
|
|
|
+ cls.value = 'bar'
|
|
|
|
|
+ })
|
|
|
|
|
+ return { cls, target }
|
|
|
|
|
+ },
|
|
|
|
|
+ template: `
|
|
|
|
|
+ <Teleport :to="target">
|
|
|
|
|
+ <div :class="cls">
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <slot></slot>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </Teleport>
|
|
|
|
|
+ `,
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const appId = 'test-app-id'
|
|
|
|
|
+ const App = {
|
|
|
|
|
+ __hmrId: appId,
|
|
|
|
|
+ components: { Comp },
|
|
|
|
|
+ render() {
|
|
|
|
|
+ return originalH(Comp, null, { default: () => originalH('div', 'foo') })
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ createRecord(appId, App)
|
|
|
|
|
+
|
|
|
|
|
+ domRender(originalH(App), root)
|
|
|
|
|
+ expect(target.innerHTML).toBe(
|
|
|
|
|
+ '<div class="foo"><div><div>foo</div></div></div>',
|
|
|
|
|
+ )
|
|
|
|
|
+ await nextTick()
|
|
|
|
|
+ expect(target.innerHTML).toBe(
|
|
|
|
|
+ '<div class="bar"><div><div>foo</div></div></div>',
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ rerender(appId, () =>
|
|
|
|
|
+ originalH(Comp, null, { default: () => originalH('div', 'bar') }),
|
|
|
|
|
+ )
|
|
|
|
|
+ await nextTick()
|
|
|
|
|
+ expect(target.innerHTML).toBe(
|
|
|
|
|
+ '<div class="bar"><div><div>bar</div></div></div>',
|
|
|
|
|
+ )
|
|
|
|
|
+ })
|
|
|
})
|
|
})
|