Vue3 入坑 Chapter 5
Fragment(片断)
- 在Vue2中: 组件必须有一个根标签
- 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中
- 好处: 减少标签层级, 减小内存占用
<template>
<h2>aaaa</h2>
<h2>aaaa</h2>
</template>
Teleport(瞬移)
- Teleport 提供了一种干净的方法, 让组件的html在父组件界面外的特定标签(很可能是body)下插入显示
父级组件
<template>
<div class="teleportChildTest">
<button @click="modelOpen=true">打开对话框</button>
<!-- 对话框代码 -->
<Teleport to="body">
<div v-if="modelOpen">
<div>我是一个对话框</div>
<button @click="modelOpen=false">关闭对话框</button>
</div>
</Teleport>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue'
export default defineComponent({
name: 'teleportChildTest',
setup () {
const modelOpen = ref(false)
return {
modelOpen
}
}
})
</script>
<style lang="scss" scoped>
</style>
子级组件
<template>
<div class="teleportChildTest">
<button @click="modelOpen=true">打开对话框</button>
<!-- 对话框代码 -->
<Teleport to="body">
<div v-if="modelOpen">
<div>我是一个对话框</div>
<button @click="modelOpen=false">关闭对话框</button>
</div>
</Teleport>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue'
export default defineComponent({
name: 'teleportChildTest',
setup () {
const modelOpen = ref(false)
return {
modelOpen
}
}
})
</script>
<style lang="scss" scoped>
</style>
Suspense(不确定的)
- 它们允许我们的应用程序在等待异步组件时渲染一些后备内容,可以让我们创建一个平滑的用户体验
人话: 页面中需要显示一个异步组件, 但是异步组件需要过一段时间再显示, 异步组件在显示之前需要显示点别东西
父组件
<template>
<div class="default">
<h2>Suspense组件的使用</h2>
<hr />
<suspense>
<template v-slot:default>
<!-- 异步组件 -->
<async-component></async-component>
</template>
<template v-slot:fallback>
<!-- Loading的方法 -->
<h2>Loading</h2>
</template>
</suspense>
</div>
</template>
<script lang="ts">
import { defineComponent, defineAsyncComponent } from 'vue'
const AsyncComponent = defineAsyncComponent(() => import('@/components/AsyncComponent.vue'))
export default defineComponent({
name: 'default',
components: { AsyncComponent },
setup () {
return {}
}
})
</script>
<style lang="scss" scoped>
</style>
子组件
<template>
<div class="AsyncComponent">
<h3>AsyncComponent子级组件</h3>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
name: 'AsyncComponent',
setup () {
return {}
}
})
</script>
<style lang="scss" scoped>
</style>