Przeglądaj źródła

wip: add more test

daiwei 1 rok temu
rodzic
commit
46825ca661

+ 16 - 0
packages/compiler-core/__tests__/transforms/__snapshots__/vSkip.spec.ts.snap

@@ -389,3 +389,19 @@ return function render(_ctx, _cache) {
   }
 }"
 `;
+
+exports[`compiler: v-skip > transform > with v-memo 1`] = `
+"const _Vue = Vue
+
+return function render(_ctx, _cache) {
+  with (_ctx) {
+    const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock, withMemo: _withMemo } = _Vue
+
+    return (_ctx.ok)
+      ? (_openBlock(), _createElementBlock("span", { key: 0 }))
+      : _withMemo([1], () => (_openBlock(), _createElementBlock("div", { key: 1 }, [
+          (_openBlock(), _createElementBlock("span", { key: 0 }))
+        ])), _cache, 0)
+  }
+}"
+`;

+ 22 - 0
packages/compiler-core/__tests__/transforms/vSkip.spec.ts

@@ -13,6 +13,7 @@ import {
   type SimpleExpressionNode,
   type SkipNode,
   type VNodeCall,
+  WITH_MEMO,
   generate,
   baseParse as parse,
   transform,
@@ -23,6 +24,7 @@ import { transformIf } from '../../src/transforms/vIf'
 import { transformFor } from '../../src/transforms/vFor'
 import { transformSlotOutlet } from '../../src/transforms/transformSlotOutlet'
 import { transformSkip } from '../../src/transforms/vSkip'
+import { transformMemo } from '../../src/transforms/vMemo'
 
 export function parseWithSkipTransform(
   template: string,
@@ -36,6 +38,7 @@ export function parseWithSkipTransform(
     nodeTransforms: [
       transformIf,
       transformSkip,
+      transformMemo,
       transformFor,
       transformExpression,
       transformSlotOutlet,
@@ -255,6 +258,25 @@ describe('compiler: v-skip', () => {
       expect(generate(root).code).toMatchSnapshot()
     })
 
+    test('with v-memo', () => {
+      const { root, node } = parseWithSkipTransform(
+        `<div v-skip="ok" v-memo="[1]"><span/></div>`,
+      ) as {
+        root: RootNode
+        node: SkipNode
+      }
+      expect(node.type).toBe(NodeTypes.SKIP)
+      expect((node.test as SimpleExpressionNode).content).toBe(`_ctx.ok`)
+      expect(node.alternate.children.length).toBe(1)
+      expect(node.alternate.children[0].type).toBe(NodeTypes.ELEMENT)
+      expect((node.alternate.children[0] as ElementNode).tag).toBe(`div`)
+      const codegenNode = (node.alternate.children[0] as ElementNode)
+        .codegenNode!
+      expect(codegenNode.type).toBe(NodeTypes.JS_CALL_EXPRESSION)
+      expect((codegenNode as any).callee).toBe(WITH_MEMO)
+      expect(generate(root).code).toMatchSnapshot()
+    })
+
     test('on component without slot', () => {
       // equivalent to <Comp v-if="ok"/>
       const { root, node } = parseWithSkipTransform(`<Comp v-skip="ok"/>`) as {

+ 1 - 1
packages/compiler-ssr/src/transforms/ssrVSkip.ts

@@ -24,7 +24,7 @@ export const ssrTransformSkip: NodeTransform =
         // for non-skipNode, rewrite the ssrCodegenNode
         // `ssrRenderComponent` -> `ssrRenderSkipComponent`
         // `ssrRenderVNode` -> `ssrRenderSkipVNode`
-        if (!skipNode && node && (node as ComponentNode).ssrCodegenNode) {
+        if (!skipNode && (node as ComponentNode).ssrCodegenNode) {
           const {
             callee,
             arguments: args,