动态组件(component)
官网链接
Vue 本身提供了一个内置的 <component> 组件,该组件专门就是用来实现动态组件的渲染。
有些场景会需要在两个组件间来回切换,比如 Tab 界面:
对应内容比较多使用
组件1/2
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7e115267c2a9466aa00851df499f878c.png)
主页面
<template>
<div>
<li v-for="(item, index) in tabList" :key="index" @click="change(index)">{{ item.name }}</li>
<component :is="currentComponent.com"></component>
</div>
</template>
<script lang='ts'>
import { reactive, toRefs, onBeforeMount, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import abount from '../components/about/index.vue'
import bcase from '../components/case/index.vue'
export default {
name: '',
setup() {
let router = useRouter(), route = useRoute();
const data = reactive({
tabList: [
{ name: '显示组件A', com: abount },
{ name: '显示组件B', com: bcase },
],
currentComponent: { com: abount },
change(index) {
data.currentComponent.com = data.tabList[index].com
}
})
onBeforeMount(() => {
})
onMounted(() => {
})
const refData = toRefs(data);
return {
...refData,
}
}
};
</script>
<style scoped></style>
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7f005f3b43f843f59099ba5025229c74.png)
异步组件(suspense)
方法实例
分别创建3个组件A B C
<template>
<div class="A">
<A></A>
</div>
<div class="B">
<B></B>
</div>
<div ref="target">
<C v-if="targetIsVisible"></C>
</div>
</template>
<script setup>
import A from '../components/about/index.vue'
import B from '../components/case/index.vue'
import { defineAsyncComponent, ref } from 'vue';
import { useIntersectionObserver } from '@vueuse/core'
const C = defineAsyncComponent(() =>
import('../components/house/index.vue'))
const target = ref(null)
const targetIsVisible = ref(false)
const { stop } = useIntersectionObserver(
target,
([{ isIntersecting }]) => {
console.log(isIntersecting);
if (isIntersecting) {
targetIsVisible.value = isIntersecting
}
})
</script>
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f998270dbdd14bff90eab430f06fa2c5.png)
这样就实现了异步加载C组件,在页面视窗滚动到C组件时才会加载C组件。