expect(serializeInner(root)).toBe(`<div>11</div>`)
// // Update text while preserving state
- // rerender(
- // parentId,
- // compileToFunction(
- // `<div @click="count++">{{ count }}!<Child>{{ count }}</Child></div>`
- // )
- // )
- // expect(serializeInner(root)).toBe(`<div>1!1</div>`)
+ rerender(
+ parentId,
+ compileToFunction(
+ `<div @click="count++">{{ count }}!<Child>{{ count }}</Child></div>`
+ )
+ )
+ expect(serializeInner(root)).toBe(`<div>1!1</div>`)
// Should force child update on slot content change
rerender(
expect(unmountSpy).toHaveBeenCalledTimes(1)
expect(mountSpy).toHaveBeenCalledTimes(1)
})
+
+ // #1156 - static nodes should retain DOM element reference across updates
+ // when HMR is active
+ test('static el reference', async () => {
+ const root = nodeOps.createElement('div')
+ const id = 'test-static-el'
+
+ const template = `<div>
+ <div>{{ count }}</div>
+ <button @click="count++">++</button>
+ </div>`
+
+ const Comp: ComponentOptions = {
+ __hmrId: id,
+ data() {
+ return { count: 0 }
+ },
+ render: compileToFunction(template)
+ }
+ createRecord(id, Comp)
+
+ render(h(Comp), root)
+ expect(serializeInner(root)).toBe(
+ `<div><div>0</div><button>++</button></div>`
+ )
+
+ // 1. click to trigger update
+ triggerEvent((root as any).children[0].children[1], 'click')
+ await nextTick()
+ expect(serializeInner(root)).toBe(
+ `<div><div>1</div><button>++</button></div>`
+ )
+
+ // 2. trigger HMR
+ rerender(
+ id,
+ compileToFunction(template.replace(`<button`, `<button class="foo"`))
+ )
+ expect(serializeInner(root)).toBe(
+ `<div><div>1</div><button class="foo">++</button></div>`
+ )
+ })
+
+ // #1157 - component should force full props update when HMR is active
+ test('force update child component w/ static props', () => {
+ const root = nodeOps.createElement('div')
+ const parentId = 'test2-parent'
+ const childId = 'test2-child'
+
+ const Child: ComponentOptions = {
+ __hmrId: childId,
+ props: {
+ msg: String
+ },
+ render: compileToFunction(`<div>{{ msg }}</div>`)
+ }
+ createRecord(childId, Child)
+
+ const Parent: ComponentOptions = {
+ __hmrId: parentId,
+ components: { Child },
+ render: compileToFunction(`<Child msg="foo" />`)
+ }
+ createRecord(parentId, Parent)
+
+ render(h(Parent), root)
+ expect(serializeInner(root)).toBe(`<div>foo</div>`)
+
+ rerender(parentId, compileToFunction(`<Child msg="bar" />`))
+ expect(serializeInner(root)).toBe(`<div>bar</div>`)
+ })
})