Vue3的Composition组合式API(Teleport移动标签、Suspense标签)、Vue3相对Vue2的改变(全局API的转移、其它改变)

devtools/2024/11/29 13:23:50/

目录

1. Teleport移动标签

一种能够将我们的组件html结构移动到指定位置的标签

使用示例

  1. App.vue
<template><div class="app"><h3>我是App组件</h3><Child/></div>
</template><script>import Child from './components/Child'export default {name:'App',components:{Child}}
</script><style>.app{background-color: gray;padding: 10px;}
</style>
  1. Child.vue
<template><div class="child"><h3>我是Child组件</h3><Dialog/></div>
</template><script>import Dialog from './Dialog'export default {name:'Child',components:{Dialog}}
</script><style>.child{background-color: skyblue;padding: 10px;}
</style>
  1. Dialog.vue
  • <teleport to="body">中的to可以是html标签,或选择器(如id选择器: #app)
  • css的mark是一个半透明的遮罩层会遮住整个body
  • css的dialog让弹窗位于body正中央
<template><div><button @click="isShow = true">点我弹个窗</button><!-- to可以是html标签,或选择器(如id选择器: #app) --><teleport to="body"><div v-if="isShow" class="mask"><div class="dialog"><h3>我是一个弹窗</h3><button @click="isShow = false">关闭弹窗</button></div></div></teleport></div>
</template><script>import {ref} from 'vue'export default {name:'Dialog',setup(){let isShow = ref(false)return {isShow}}}
</script><style>/* 半透明的遮罩层会遮住整个body*/.mask{position: absolute;top: 0;bottom: 0;left: 0;right: 0;background-color: rgba(0, 0, 0, 0.5);}/* 弹窗位于body正中央 */.dialog{position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);text-align: center;width: 300px;height: 300px;background-color: green;}
</style>

效果如下:

  • 弹窗如果放在Son组件,会影响App组件、Child组件、Son组件的布局,而且弹窗在Son组件做定位也不好做
  • 点我弹出弹窗,出现半遮罩层遮住了body,body其它位置都不能点。并且出现的弹窗位于body正中央
  • 查看html结构,可以看到弹窗的div位于body下
  • 点击关闭弹窗,弹窗正常关闭
    <a class=Teleport移动标签效果" />

2. Suspense标签

等待异步组件时渲染一些额外内容,让应用有更好的用户体验

使用示例

  1. Child.vue
    • 当使用了defineAsyncComponent异步引入,就可以使用async + Promise + await异步返回数据
    • Promise中模拟延迟了3秒返回数据
    • 也可以不使用async + await,直接返回Promise
<template><div class="child"><h3>我是Child组件</h3><h3>sum的值是: {{sum}}</h3></div>
</template><script>import {ref} from 'vue'export default {name:'Child',// 当使用了defineAsyncComponent异步引入,就可以使用async + Promise + await异步返回数据// Promise中模拟延迟了3秒返回数据// 也可以不使用async + await,直接返回Promiseasync setup(){let sum = ref(0)let p = new Promise((resolve,reject)=>{setTimeout(()=>{resolve({sum})},3000)})return await p}}
</script><style>.child{background-color: skyblue;padding: 10px;}
</style>
  1. App.vue
    • 使用defineAsyncComponent异步引入组件
    • 使用Suspense包裹组件,并配置好default与fallback。Child组件未加载好时,会先显示fallback中的内容
<template><div class="app"><h3>我是App组件</h3><Suspense><template v-slot:default><Child/></template><template v-slot:fallback><h3>稍等,加载中...</h3></template></Suspense></div>
</template><script>import {defineAsyncComponent} from 'vue'const Child = defineAsyncComponent(()=>import('./components/Child'))  //异步引入export default {name:'App',components:{Child}}
</script><style>.app{background-color: gray;padding: 10px;}
</style>

效果如下:

  • 情况1:将网络模式设置为慢的3G,这时Child组件还未加载好,就会显示稍等,加载中
  • 情况2:使用Promise模拟异步延迟返回数据,这时Child组件还未加载好,就会显示稍等,加载中
    <a class=Suspense标签效果" />

3. Vue3相对Vue2的其它改变

3.1 全局API的转移

Vue2有许多全局API和配置。例如:注册全局组件、注册全局指令等,如下所示:

// 注册全局组件
Vue.component('MyButton', {data: () => ({count: 0}),template: '<button @click="count++">Clicked {{ count }} times.</button>'
})
// 注册全局指令
Vue.directive('focus', {inserted: el => el.focus()
}

Vue3对这些API做出了调整。将全局的API,即:Vue.xxx调整到应用实例app上

Vue2全局API(Vue)Vue3实例API(app)
Vue.config.xxxxapp.config.xxxx
Vue.config.productionTip移除
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use
Vue.prototypeapp.config.globalProperties

3.2 其他改变

  1. data选项应始终被声明为一个函数
  2. 动画过度类名的更改:

Vue2写法

.v-enter,
.v-leave-to {opacity: 0;
}.v-leave,
.v-enter-to {opacity: 1;
}

Vue3写法

.v-enter-from,
.v-leave-to {opacity: 0;
}.v-leave-from,
.v-enter-to {opacity: 1;
}
  1. 移除keyCode作为v-on的修饰符,同时也不再支持config.keyCodes
  2. 移除v-on.native修饰符

父组件中绑定事件

<my-componentv-on:close="handleComponentEvent"v-on:click="handleNativeClickEvent"
/>

子组件中声明自定义事件

<script>export default {emits: ['close']}
</script>
  1. 移除过滤器(filter)

过滤器虽然这看起来很方便,但它需要一个自定义语法,打破大括号内表达式是“只是JavaScript”的假设,这不仅有学习成本,而且有实现成本!建议用方法调用或计算属性去替换过滤器


http://www.ppmy.cn/devtools/137926.html

相关文章

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

一个鸿蒙开发者的探索:实现相册访问功能

最近我决定开始一个新项目——自己动手开发一个鸿蒙App。这个App的功能想法其实很简单&#xff0c;就是一个能够访问设备相册的应用&#xff0c;方便用户查看、选择和管理照片。在日常使用手机的过程中&#xff0c;相册功能的使用频率很高&#xff0c;我想为鸿蒙设备上的用户提…

python辅助notepad

1 引言 平常使用notepad做文本编辑器比较多&#xff0c;它又支持插件&#xff0c;想着能否用python给它编个插件&#xff0c;提高一下效率。 没想到&#xff0c;还真找到了&#xff0c;往下看。 2 下载并安装PythonScript 官网&#xff1a; http://npppythonscript.sourcef…

第12章 手写Spring MVC

第十二章 手写Spring MVC 12.1 基本结构搭建 12.1.1 创建Maven模块 12.1.2 引入Servlet依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XM…

vue3实现自定义导航菜单

一、创建项目 1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称&#xff1a;vue3demo 选择项目存放目录&#xff1a;D:/HBuilderProjects 一定要注意vue的版本&#xff0c;当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图…

论文笔记(五十八)Trends and challenges in robot manipulation

Trends and challenges in robot manipulation 文章概括背景进展展望摘要机器人今天能做什么&#xff1f;机器人今天不能做什么&#xff1f;为什么设计机器人手很困难&#xff1f;超越拟人化设计下一代机器人手的期望目标操控中的感知抓取&#xff1a;迈向操控的垫脚石从抓取到…

基于spring boot开发的理财管理系统设计

文章目录 项目介绍环境要求技术栈使用说明运行指导运行截图代码 项目介绍 该毕业设计使用了当前较为流行的spring boot&#xff0c;spring&#xff0c;spring mvc&#xff0c;mybatis&#xff0c;shiro框架分页处理使用了pagehelper进行操作&#xff0c;前台使用了模板语言thy…

前端使用fontfaceobserver库实现字体设置

要使用FontFaceObserver来加载设置项目本地的字体&#xff0c;先确保字体文件位于项目中或者可以从服务端获取到&#xff0c;这样就可以使用FontFaceObserver来检测并加载这些字体 主要有以下几步&#xff1a; npm或者yarn安装引入fontfaceobserver字体资源引入和font-face配置…