fix(hmr): fix hmr for components with no active instance yet

fix #4757
This commit is contained in:
Evan You
2021-10-08 12:39:24 -04:00
parent 6bcb7a5ea3
commit 9e3d7731c7
2 changed files with 91 additions and 30 deletions

View File

@@ -36,9 +36,9 @@ describe('hot module replacement', () => {
})
test('createRecord', () => {
expect(createRecord('test1')).toBe(true)
expect(createRecord('test1', {})).toBe(true)
// if id has already been created, should return false
expect(createRecord('test1')).toBe(false)
expect(createRecord('test1', {})).toBe(false)
})
test('rerender', async () => {
@@ -50,7 +50,7 @@ describe('hot module replacement', () => {
__hmrId: childId,
render: compileToFunction(`<div><slot/></div>`)
}
createRecord(childId)
createRecord(childId, Child)
const Parent: ComponentOptions = {
__hmrId: parentId,
@@ -62,7 +62,7 @@ describe('hot module replacement', () => {
`<div @click="count++">{{ count }}<Child>{{ count }}</Child></div>`
)
}
createRecord(parentId)
createRecord(parentId, Parent)
render(h(Parent), root)
expect(serializeInner(root)).toBe(`<div>0<div>0</div></div>`)
@@ -128,7 +128,7 @@ describe('hot module replacement', () => {
unmounted: unmountSpy,
render: compileToFunction(`<div @click="count++">{{ count }}</div>`)
}
createRecord(childId)
createRecord(childId, Child)
const Parent: ComponentOptions = {
render: () => h(Child)
@@ -167,7 +167,7 @@ describe('hot module replacement', () => {
render: compileToFunction(`<div @click="count++">{{ count }}</div>`)
}
}
createRecord(childId)
createRecord(childId, Child)
const Parent: ComponentOptions = {
render: () => h(Child)
@@ -212,7 +212,7 @@ describe('hot module replacement', () => {
},
render: compileToFunction(template)
}
createRecord(id)
createRecord(id, Comp)
render(h(Comp), root)
expect(serializeInner(root)).toBe(
@@ -249,14 +249,14 @@ describe('hot module replacement', () => {
},
render: compileToFunction(`<div>{{ msg }}</div>`)
}
createRecord(childId)
createRecord(childId, Child)
const Parent: ComponentOptions = {
__hmrId: parentId,
components: { Child },
render: compileToFunction(`<Child msg="foo" />`)
}
createRecord(parentId)
createRecord(parentId, Parent)
render(h(Parent), root)
expect(serializeInner(root)).toBe(`<div>foo</div>`)
@@ -275,14 +275,14 @@ describe('hot module replacement', () => {
__hmrId: childId,
render: compileToFunction(`<div>child</div>`)
}
createRecord(childId)
createRecord(childId, Child)
const Parent: ComponentOptions = {
__hmrId: parentId,
components: { Child },
render: compileToFunction(`<Child class="test" />`)
}
createRecord(parentId)
createRecord(parentId, Parent)
render(h(Parent), root)
expect(serializeInner(root)).toBe(`<div class="test">child</div>`)
@@ -302,7 +302,7 @@ describe('hot module replacement', () => {
__hmrId: childId,
render: compileToFunction(`<div>child</div>`)
}
createRecord(childId)
createRecord(childId, Child)
const components: ComponentOptions[] = []
@@ -324,7 +324,7 @@ describe('hot module replacement', () => {
}
}
createRecord(parentId)
createRecord(parentId, parentComp)
}
const last = components[components.length - 1]
@@ -370,7 +370,7 @@ describe('hot module replacement', () => {
</Child>
`)
}
createRecord(parentId)
createRecord(parentId, Parent)
render(h(Parent), root)
expect(serializeInner(root)).toBe(
@@ -410,7 +410,7 @@ describe('hot module replacement', () => {
return h('div')
}
}
createRecord(childId)
createRecord(childId, Child)
const Parent: ComponentOptions = {
render: () => h(Child)
@@ -435,4 +435,38 @@ describe('hot module replacement', () => {
expect(createSpy1).toHaveBeenCalledTimes(1)
expect(createSpy2).toHaveBeenCalledTimes(1)
})
// #4757
test('rerender for component that has no active instance yet', () => {
const id = 'no-active-instance-rerender'
const Foo: ComponentOptions = {
__hmrId: id,
render: () => 'foo'
}
createRecord(id, Foo)
rerender(id, () => 'bar')
const root = nodeOps.createElement('div')
render(h(Foo), root)
expect(serializeInner(root)).toBe('bar')
})
test('reload for component that has no active instance yet', () => {
const id = 'no-active-instance-reload'
const Foo: ComponentOptions = {
__hmrId: id,
render: () => 'foo'
}
createRecord(id, Foo)
reload(id, {
__hmrId: id,
render: () => 'bar'
})
const root = nodeOps.createElement('div')
render(h(Foo), root)
expect(serializeInner(root)).toBe('bar')
})
})