Telepot
弹窗一般参考的是当前的整个视口(fix 定位),而不是父容器。
<Teleport>是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。- 一个组件模板的一部分在逻辑上从属于该组件,但从整个应用视图的角度来看,它在 DOM 中应该被渲染在整个 Vue 应用外部的其他地方。 以弹窗为例,如果我们单纯使用
position: fixed进行布局,但是一旦当该组件的祖先设置了transform,perspective,filter等属性时,此时元素将不会相对于整个窗口布局,而是根据其祖先容器的位置进行布局。(貌似是因为这些属性创建了一个新的堆叠上下文,导致组件排版基于的定位更改,以后再议) 此时可以通过使用teleport直接将该组件在真实 DOM 结构中传到body下,以避免出现堆叠上下文的问题,但这并不会影响到组件在项目中的逻辑结构。
html
<Teleport to="#modals">
<!--支持各种选择器-->
<div>A</div>
</Teleport>Suspense
setup 语法糖本身是 async 修饰的。
- 底层使用插槽实现的
- 子组件存在异步任务(
await),在等待数据返回过程中提示一些东西时使用
html
<Suspense>
<!-- 具有深层异步依赖的组件 -->
<Dashboard />
<!-- 在 #fallback 插槽中显示 “正在加载中” -->
<template #default>
<child />
</template>
<template #fallback>
Loading...
</template>
</Suspense>全局组件
全局组件可以在任意地方使用而不需要进行 import
ts
app.component('MyGlobalComponent', MyGlobalComponent);
//组件名称,配置对象,针对SFC可以链式调用 component 方法:
ts
app
.component('ComponentA', ComponentA)
.component('ComponentB', ComponentB)
.component('ComponentC', ComponentC)- 未使用的全局组件在打包时不会被移除(tree-shaking)
- 组件依赖关系不明确
全局属性 app.config.globalProperties
为了通过 ts 的语法检查,需要生命一个接口:
ts
declare module 'vue' {
interface ComponentCustomProperties {
x:number
}
}全局指令
- 指令就是
v-xxx的状(attribute)
app.use
安装一个插件