expect(serializeInner(root)).toBe(``)
expect(ids).toEqual([ids[0], ids[0] + 1, ids[0] + 2])
})
+
+ test('child component props update should not lead to double update', async () => {
+ const text = ref(0)
+ const spy = jest.fn()
+
+ const App = {
+ render() {
+ return h(Comp, { text: text.value })
+ }
+ }
+
+ const Comp = {
+ props: ['text'],
+ render(this: any) {
+ spy()
+ return h('h1', this.text)
+ }
+ }
+
+ const root = nodeOps.createElement('div')
+ render(h(App), root)
+
+ expect(serializeInner(root)).toBe(`<h1>0</h1>`)
+ expect(spy).toHaveBeenCalledTimes(1)
+
+ text.value++
+ await nextTick()
+ expect(serializeInner(root)).toBe(`<h1>1</h1>`)
+ expect(spy).toHaveBeenCalledTimes(2)
+ })
})
pushWarningContext(next || instance.vnode)
}
+ // Disallow component effect recursion during pre-lifecycle hooks.
+ effect.allowRecurse = false
+
if (next) {
next.el = vnode.el
updateComponentPreRender(instance, next, optimized)
next = vnode
}
- // Disallow component effect recursion during pre-lifecycle hooks.
- effect.allowRecurse = false
// beforeUpdate hook
if (bu) {
invokeArrayFns(bu)
) {
instance.emit('hook:beforeUpdate')
}
+
effect.allowRecurse = true
// render