}
}"
`;
+
+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)
+ }
+}"
+`;
type SimpleExpressionNode,
type SkipNode,
type VNodeCall,
+ WITH_MEMO,
generate,
baseParse as parse,
transform,
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,
nodeTransforms: [
transformIf,
transformSkip,
+ transformMemo,
transformFor,
transformExpression,
transformSlotOutlet,
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 {
// 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,