fix(runtime-core): should not cast prop value if prop did not change

fix #999
This commit is contained in:
Evan You
2020-04-20 14:16:25 -04:00
parent 36d77f9a9e
commit 171cfa404f
3 changed files with 41 additions and 12 deletions

View File

@@ -156,13 +156,15 @@ describe('component props', () => {
test('default value', () => {
let proxy: any
const defaultFn = jest.fn(() => ({ a: 1 }))
const Comp = {
props: {
foo: {
default: 1
},
bar: {
default: () => ({ a: 1 })
default: defaultFn
}
},
render() {
@@ -173,19 +175,32 @@ describe('component props', () => {
const root = nodeOps.createElement('div')
render(h(Comp, { foo: 2 }), root)
expect(proxy.foo).toBe(2)
const prevBar = proxy.bar
expect(proxy.bar).toEqual({ a: 1 })
expect(defaultFn).toHaveBeenCalledTimes(1)
// #999: updates should not cause default factory of unchanged prop to be
// called again
render(h(Comp, { foo: 3 }), root)
expect(proxy.foo).toBe(3)
expect(proxy.bar).toEqual({ a: 1 })
expect(proxy.bar).toBe(prevBar)
expect(defaultFn).toHaveBeenCalledTimes(1)
render(h(Comp, { bar: { b: 2 } }), root)
expect(proxy.foo).toBe(1)
expect(proxy.bar).toEqual({ b: 2 })
expect(defaultFn).toHaveBeenCalledTimes(1)
render(h(Comp, { foo: 3, bar: { b: 3 } }), root)
expect(proxy.foo).toBe(3)
expect(proxy.bar).toEqual({ b: 3 })
expect(defaultFn).toHaveBeenCalledTimes(1)
render(h(Comp, { bar: { b: 4 } }), root)
expect(proxy.foo).toBe(1)
expect(proxy.bar).toEqual({ b: 4 })
expect(defaultFn).toHaveBeenCalledTimes(1)
})
test('optimized props updates', async () => {