# Teleport
Teleport 是一种能够将我们的组件 html 结构移动到指定位置的技术
示例:css 中加 `filter: saturate(200%);` 会使弹窗的定位会失效,不在屏幕的中间,而在组件的中间,可以使用 Teleport 来解决
<template> | |
<button @click="isShow = true">展示弹窗</button> | |
<teleport to="body"> | |
<div class="my-modal" v-show="isShow"> | |
<h2>弹窗的标题</h2> | |
<div>弹窗的内容</div> | |
<button @click="isShow = false">关闭弹窗</button> | |
</div> | |
</teleport> | |
</template> | |
<script setup lang="ts" name="Modal"> | |
import { ref } from "vue"; | |
let isShow = ref(false); | |
</script> | |
<style scoped> | |
.my-modal { | |
border-radius: 10px; | |
padding: 30px; | |
background-color: var(--bg-color-2); | |
text-align: center; | |
position: fixed; | |
top: 50%; | |
left: 50%; | |
transform: translate(-50%, -50%); | |
} | |
button { | |
display: block; | |
margin: 15px 0; | |
} | |
</style> |
# Suspense
- 等待异步组件时渲染一些额外内容,让应用有更好的用户体验
- 使用步骤
- 异步引入组件
- 使用
Suspense
包裹组件,并配置好default
与fallback
示例
import { defineAsyncComponent, Suspense } from "vue"; | |
const Child = defineAsyncComponent(() => import("./Child.vue")); |
<template> | |
<Suspense> | |
<template v-slot:default> | |
<SuspenseDemo /> | |
</template> | |
<template v-slot:fallback> loading... </template> | |
</Suspense> | |
</template> | |
<script setup lang="ts" name="NewComponents"> | |
import SuspenseDemo from "@/components/new_components/SuspenseDemo.vue"; | |
import { Suspense } from "vue"; | |
</script> |
SuspenseDemo 组件
<template> | |
<div class="child"> | |
<h1>SuspenseDemo 用法</h1> | |
<div>当前和:</div> | |
<h3>短剧:</h3> | |
<ul> | |
<li v-for="item in data" :key="item.id"></li> | |
</ul> | |
</div> | |
</template> | |
<script setup lang="ts" name="SuspenseDemo"> | |
import { ref } from "vue"; | |
import axios from "axios"; | |
let sum = ref(0); | |
let { | |
data: { data } | |
} = await axios.get("https://api.kuleu.com/api/action?text=霸总"); | |
console.log(data); | |
</script> |
# 全局 API 转移到应用对象
- app.component
- app.config
- app.directive
- app.mount
- app.unmount
- app.use
示例:全局 API(写在 main.ts 文件)
<!-- 不用引入,直接使用 --> | |
<Hello></Hello> | |
<div>全局变量:</div> | |
<!-- 自定义指令使用 --> | |
<h4 v-beauty="sum">好开心鸭~</h4> |
// 全局组件 | |
app.component("Hello", Hello); | |
// 全局变量 | |
app.config.globalProperties.globalX = 99; | |
declare module "vue" { | |
interface ComponentCustomProperties { | |
globalX: number; | |
} | |
} | |
// 自定义指令 | |
app.directive("beauty", (element, { value }) => { | |
element.innerText += value; | |
element.style.color = "red"; | |
element.style.backgroundColor = "yellow"; | |
}); | |
// 挂载 | |
app.mount("#app"); // 挂载到 id 为 app 的元素上 | |
// 卸载 | |
setTimeout(() => { | |
app.unmount(); // 3 秒后卸载 | |
}, 3000); |
# 其他
过渡类名
v-enter
修改为v-enter-from
、过渡类名v-leave
修改为v-leave-from
keyCode
作为v-on
修饰符的支持v-model
指令在组件上的使用已经被重新设计,替换掉了v-bind.sync
v-if
和v-for
在同一个元素身上使用时的优先级发生了变化移除了
$on
、$off
和$once
实例方法移除了过滤器
filter
移除了
$children
实例propert
......