1010import VNode from './vnode'
1111import { isPrimitive , _toString , warn } from '../util/index'
1212
13- const emptyNode = new VNode ( '' , { } , [ ] )
13+ const emptyData = { }
14+ const emptyNode = new VNode ( '' , emptyData , [ ] )
1415const hooks = [ 'create' , 'update' , 'postpatch' , 'remove' , 'destroy' ]
1516
1617function isUndef ( s ) {
@@ -267,13 +268,18 @@ export function createPatchFunction (backend) {
267268 function patchVnode ( oldVnode , vnode , insertedVnodeQueue ) {
268269 if ( oldVnode === vnode ) return
269270 let i , hook
270- if ( isDef ( i = vnode . data ) && isDef ( hook = i . hook ) && isDef ( i = hook . prepatch ) ) {
271- i ( oldVnode , vnode )
271+ const hasData = isDef ( i = vnode . data )
272+ if ( hasData ) {
273+ // ensure the oldVnode also has data during patch
274+ oldVnode . data = oldVnode . data || emptyData
275+ if ( isDef ( hook = i . hook ) && isDef ( i = hook . prepatch ) ) {
276+ i ( oldVnode , vnode )
277+ }
272278 }
273279 const elm = vnode . elm = oldVnode . elm
274280 const oldCh = oldVnode . children
275281 const ch = vnode . children
276- if ( isDef ( vnode . data ) ) {
282+ if ( hasData ) {
277283 for ( i = 0 ; i < cbs . update . length ; ++ i ) cbs . update [ i ] ( oldVnode , vnode )
278284 if ( isDef ( hook ) && isDef ( i = hook . update ) ) i ( oldVnode , vnode )
279285 }
@@ -291,7 +297,7 @@ export function createPatchFunction (backend) {
291297 } else if ( oldVnode . text !== vnode . text ) {
292298 nodeOps . setTextContent ( elm , vnode . text )
293299 }
294- if ( isDef ( vnode . data ) ) {
300+ if ( hasData ) {
295301 for ( i = 0 ; i < cbs . postpatch . length ; ++ i ) cbs . postpatch [ i ] ( oldVnode , vnode )
296302 if ( isDef ( hook ) && isDef ( i = hook . postpatch ) ) i ( oldVnode , vnode )
297303 }
0 commit comments