易学易用,性能出色,适用场景丰富的 Web 前端框架。
有时我们可能会遇到这样的场景:一个组件模板的一部分在逻辑上从属于该组件,但从整个应用视图的角度来看,它在 DOM 中应该被渲染在整个 Vue 应用外部的其他地方。
这类场景最常见的例子就是全屏的模态框。理想情况下,我们希望触发模态框的按钮和模态框本身是在同一个组件中,因为它们都与组件的开关状态有关。但这意味着该模态框将与按钮一起渲染在应用 DOM 结构里很深的地方。这会导致该模态框的 CSS 布局代码很难写。
Teleport 是一种能够将我们的组件html结构移动到指定位置的技术
例如,当父组件中使用了 filter
等 css 属性时,子组件的 position
属性会失效,这时可以使用 <teleport to="dom"></teleport>
挂载到某一html结点上,to
的值为元素选择器
vue<template> <button @click="show = true">Show Modal</button> <Teleport to="body"> <div class="modal" v-show="show"> <h2>Modal Title</h2> <p>Modal content</p> <button @click="show = false">close</button> </div> </Teleport> </template>
指定目标容器:
vue<Teleport to="#some-id" /> <Teleport to=".some-class" /> <Teleport to="[data-teleport]" />
有条件地禁用:
vue<Teleport to="#popup" :disabled="displayVideoInline"> <video src="./my-movie.mp4"> </Teleport>
提示
<Teleport>
挂载时,传送的 to
目标必须已经存在于 DOM 中。理想情况下,这应该是整个 Vue 应用 DOM 树外部的一个元素。如果目标元素也是由 Vue 渲染的,你需要确保在挂载 <Teleport>
之前先挂载该元素。
实验性功能
<Suspense>
是一项实验性功能。它不一定会最终成为稳定功能,并且在稳定之前相关 API 也可能会发生变化。
等待异步组件时渲染一些额外内容,让应用有更好的用户体验
使用 Suspense
包裹组件,并配置好 default
与 fallback
(底层使用插槽实现)
vue<template> <div class="outer"> <h2>App</h2> <Suspense> <template v-slot:default> <Child /> </template> <template v-slot:fallback> <h2>loading</h2> </template> </Suspense> </div> </template>
app.component
typescriptimport Hello from './Hello';
app.component('Hello', Hello);
app.config
typescriptapp.config.globalProperties.x = 99;
declare module 'vue' {
interface ComponentCustomProperties {
x: number
}
}
app.directive
typescript/* main.ts */
app.directive('beauty', (element, {value}) => {
element.innerText += value;
element.style.color = 'red';
element.style.backgroundColor = 'skyblue';
})
/* Comp.vue */
<h3 v-beauty="count">哈哈哈</h3>
app.mount
app.unmount
typescriptsetTimeout(() => {
app.unmount();
}, 2000);
app.use
非兼容性改变 | Vue 3 迁移指南 (vuejs.org)
v-model
指令在组件上的使用已经被重新设计,替换掉了 v-bind.sync
v-if
和 v-for
在同一个元素身上使用时的优先级发生了变化v-bind="object"
现在是顺序敏感的v-on:event.native
事件修饰符已经被移除$scopedSlots
property 已移除,所有插槽都通过 $slots
作为函数暴露$listeners
被移除或整合到 $attrs
$attrs
现在包含 class
和 style
attributedestroyed
生命周期选项被重命名为 unmounted
beforeDestroy
生命周期选项被重命名为 beforeUnmount
default
工厂函数不再可以访问 this
上下文binding.expression
已移除data
选项应始终被声明为一个函数data
选项现在为浅合并deep
选项v-if/else-if/else
、v-for
或 v-slot
) 的 <template>
现在被视为普通元素,并将渲染为原生的 <template>
元素,而不是渲染其内部内容。hook:
事件前缀改为 vue:
keyCode
作为 v-on
修饰符的支持$children
实例 propertypropsData
选项$destroy
实例方法。用户不应该再手动管理单个 Vue 组件的生命周期。set
和 delete
以及实例方法 $set
和 $delete
。基于代理的变化检测已经不再需要它们了。本文作者:Morales
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 License 许可协议。转载请注明出处!