Преглед на файлове

fix(runtime-vapor): guard interop vnode access

daiwei преди 1 седмица
родител
ревизия
1997b68bf3

+ 2 - 0
packages/runtime-vapor/__tests__/helpers/setKey.spec.ts

@@ -7,6 +7,7 @@ import {
   template,
 } from '../../src'
 import { makeRender } from '../_utils'
+import { setInteropEnabled } from '../../src/vdomInteropState'
 
 const define = makeRender()
 
@@ -39,6 +40,7 @@ describe('helpers: setBlockKey', () => {
   })
 
   test('syncs interop fragment vnode.key', () => {
+    setInteropEnabled()
     const frag = new VaporFragment(template(`<div></div>`)() as any)
     frag.vnode = h('div', { key: 'old' })
 

+ 5 - 2
packages/runtime-vapor/src/components/Transition.ts

@@ -201,7 +201,7 @@ function getTransitionType(block: ResolvedTransitionBlock): any {
   const type = transitionTypeMap.get(block)
   if (type !== undefined) return type
   if (block instanceof Element) return block.localName
-  if (isFragment(block) && block.vnode) {
+  if (isInteropEnabled && isFragment(block) && block.vnode) {
     const children = getTransitionRawChildren([block.vnode])
     if (children.length === 1) return children[0].type
   }
@@ -669,7 +669,10 @@ export function getTransitionElementFromVNode(
 export function isValidTransitionBlock(
   block: Block,
 ): block is ResolvedTransitionBlock {
-  return !!(block instanceof Element || (isFragment(block) && block.vnode))
+  return !!(
+    block instanceof Element ||
+    (isInteropEnabled && isFragment(block) && block.vnode)
+  )
 }
 
 export function getTransitionElement(

+ 2 - 1
packages/runtime-vapor/src/helpers/setKey.ts

@@ -3,6 +3,7 @@ import { isKeepAlive } from '@vue/runtime-dom'
 import type { Block } from '../block'
 import { isVaporComponent } from '../component'
 import { isKeepAliveEnabled } from '../keepAlive'
+import { isInteropEnabled } from '../vdomInteropState'
 
 export function setBlockKey(
   block: (Block & { $key?: any }) | null | undefined,
@@ -26,7 +27,7 @@ export function setBlockKey(
     }
   } else {
     block.$key = key
-    if (block.vnode) block.vnode.key = key
+    if (isInteropEnabled && block.vnode) block.vnode.key = key
     setBlockKey(block.nodes, key)
   }
 }