nuxt / ui

A UI Library for Modern Web Apps, powered by Vue & Tailwind CSS.
https://ui.nuxt.com
MIT License
3.55k stars 415 forks source link

Lazy component inside `UTabs` are never lazyloaded #1915

Open Tragio opened 6 days ago

Tragio commented 6 days ago

Environment

Version

2.17.0

Reproduction

https://stackblitz.com/edit/nuxt-ui-qs48un?file=app.vue

Description

When using the UTabs component, a Lazy component is never lazyloaded.

In the reproduction, you can see that the API call from Tab 2 is always called. However, If you put those Lazy components outside the UTabs and change it to selectedTab it works properly, as you can't see the API call.

<script setup>
const route = useRoute();
const router = useRouter();

const items = [
  {
    key: 'tab1',
    label: 'Tab1',
    content: 'This is the content shown for Tab1',
  },
  {
    key: 'tab2',

    label: 'Tab2',
    content: 'And, this is the content for Tab2',
  },
];

const selectedTab = computed({
  get() {
    const index = items.findIndex((item) => item.key === route.query.tab);
    if (index === -1) {
      return 0;
    }

    return index;
  },
  set(value) {
    router.replace({
      query: { tab: items[value].key },
    });
  },
});
</script>

<template>
  <UTabs v-model="selectedTab" :items="items">
    <template #item="{ item }">
      <LazyFirstComponent v-if="item.key === 'tab1'" />
      <LazyApiComponent v-if="item.key === 'tab2'" />
    </template>
  </UTabs>
</template>

Additional context

No response

Logs

No response

noook commented 5 days ago

Indeed, I can see that. Perhaps would the unmount prop handle your usecase ? This prop is meant for components not to be mounted unless the current tab is the appropriate one. This improves performance when using heavy components in each tab, and will re-run the request everytime you switch to this tab

Tragio commented 4 days ago

Hi @noook šŸ‘‹ ahhh yes, it solved, I never saw that prop šŸ˜… perhaps we could improve the docs for that use-case?

noook commented 4 days ago

It's quite recent, I'm actually the one that introduced it for a very similar usecase!

If you'd like to submit a PR to improve the documentation feel free! Otherwise I can do it

Tragio commented 4 days ago

Ahhh okido, so if you implemented it then you're more suitable than I for it šŸ˜‹ however, if you don't have time I can do it. I'll keep the issue open until the upcoming PR is created and merged.

Thank you very much for your support šŸ™