MCPcopy Index your code
hub / github.com/antfu/v-lazy-show

github.com/antfu/v-lazy-show @v0.3.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.3.0 ↗ · + Follow
12 symbols 35 edges 20 files 0 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

v-lazy-show

NPM version

A compile-time directive to lazy initialize v-show for Vue. It makes components mount after first truthy value (v-if), and the DOM keep alive when toggling (v-show).

Install

npm i -D v-lazy-show

This package is completely compile-time, installed it as a nodeTransformer in Vue's compiler options.

For example in Vite:

// vite.config.ts
import { transformLazyShow } from 'v-lazy-show'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [
    Vue({
      template: {
        compilerOptions: {
          nodeTransforms: [
            transformLazyShow, // <--- add this
          ],
        },
      },
    }),
  ]
})

In Nuxt:

// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    'v-lazy-show/nuxt'
  ]
})

Usage

You can use it as a directive. Both v-lazy-show and v-show.lazy are supported and equivalent.

<script setup lang="ts">
const show = ref(false)
</script>

<template>



    <MyComponent />



</template>

With it, <MyComponent /> will not be mounted for the first render. Until the first time show.value = true, it will be mounted and the DOM will be kept alive. Later if you switch show.value back to false, <MyComponent /> will not be unmounted, instead, display: none will be applied to the DOM just like v-show.

Use Cases

It can be helpful to use with some component that is expensive to create/mount. For example, if you have a tabs component, that some tab contains a heavy component. Using v-if, it will get the component destroyed and re-created when switching tabs. Using v-show, you will need to pay the mounting cost on the initial render even you haven't switch to that tab yet.

With v-lazy-show, you can have the best of both worlds. You can think it as a v-show that lazy initializes, or a v-if that caches the DOM.

Similarly, this can be helpful for `

,

,,` and other components that you want to keep the DOM alive when toggling.

How does it work?

Like how v-if works, when you use this directive, it hint the compiler to do some transformation to the generated vnodes.

<template>



    Hello



</template>

will be compiled to

import { createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, vShow as _vShow, withDirectives as _withDirectives } from 'vue'

export function render(_ctx, _cache) {
  return (_cache._lazyshow1 || _ctx.foo)
    ? (_cache._lazyshow1 = true, (_openBlock(),
      _withDirectives(_createElementVNode('div', null, ' Hello ', 512 /* NEED_PATCH */), [
        [_vShow, _ctx.foo]
      ])))
    : _createCommentVNode('v-show-if', true)
}

Sponsors

License

MIT License © 2022 Anthony Fu

Core symbols most depended-on inside this repo

Shape

Function 12

Languages

TypeScript100%

Modules by API surface

test/index.test.ts1 symbols
test/cases/v-show-lazy/output.ssr.js1 symbols
test/cases/v-show-lazy/output.csr.js1 symbols
test/cases/expressions/output.ssr.js1 symbols
test/cases/expressions/output.csr.js1 symbols
test/cases/event-props/output.ssr.js1 symbols
test/cases/event-props/output.csr.js1 symbols
test/cases/dynamic-attrs/output.ssr.js1 symbols
test/cases/dynamic-attrs/output.csr.js1 symbols
test/cases/basic/output.ssr.js1 symbols
test/cases/basic/output.csr.js1 symbols
playgrounds/nuxt/nuxt.config.ts1 symbols

For agents

$ claude mcp add v-lazy-show \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page