原理解析:
v-if的展示与隐藏,都会让组件重新挂载。
而v-show的展示与隐藏,只是改变组件的display属性,组件在一开始就挂载好了。
因此若是只用v-if,会导致tab页切换时都会重新挂载,而若是只用v-show,会导致所有的tab页在一开始全部同时挂载。
理想的情况是默认挂载第一页,等到切到对应的tab页时,再去挂载它们。而已经挂载的,也不会被注销掉,会保留状态。
直接上代码:
vue
<script setup lang="ts">
const { active = "default" } = defineProps<{
active?: string;
}>();
const set = reactive(new Set());
watch(
() => active,
() => set.add(active),
{
immediate: true,
}
);
</script>
<template>
<div v-for="item in Object.keys($slots)" v-show="item == active" :="$attrs">
<slot v-if="set.has(item)" :name="item" />
</div>
</template>
用法:
vue
<lazy-view :active="active">
<template #页面1>
<page1></page1>
</template>
<template #页面2>
<page2></page2>
</template>
<template #页面3>
<page3></page3>
</template>
</lazy-view>
这样通过控制active这个变量的值,就可以以懒加载的形式展示与切换这三个页面
Comments | 0条评论