Vue3技术8之Fragment、Suspense、Vue3中其他的改变

article/2025/10/13 1:36:04

Vue3技术8

  • Fragment
  • Teleport
    • 弹窗案例
      • 目录结构
      • App.vue
      • Child.vue
      • Son.vue
      • Dialog.vue
    • 总结
  • Suspense
    • 普通写法
      • App.vue
      • Child.vue
    • 使用suspense之后
      • App.vue
      • Child.vue
    • 不再自己调整网络低速
      • Child.vue
      • App.vue
    • 总结
      • 补充setup的一个知识点
      • Suspense总结
  • Vue3中其他的改变
    • 全局API的转移
    • 其他改变

Fragment

  1. 在Vue2中:组件必须有一个根标签
  2. 在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中
  3. 好处:减少标签层级,减少内存占用
    在这里插入图片描述

Teleport

弹窗案例

目录结构

在这里插入图片描述

App.vue

<template><div class="app"><h1>我是App组件</h1><Child></Child></div>
</template><script>
import Child from "@/components/Child";export default {name: 'App',components: {Child},
}
</script><style scoped>
.app{background-color: gray;padding: 10px;
}
</style>

Child.vue

<template><div class="child"><h1>我是Child组件</h1><Son></Son></div>
</template><script>
import Son from "@/components/Son";
export default {name: "Child",components: {Son}
}
</script><style scoped>
.child{background-color: orange;padding: 10px;
}
</style>

Son.vue

<template><div class="son"><h1>我是Son组件</h1><Dialog></Dialog></div>
</template><script>
import Dialog from "@/components/Dialog";
export default {name: "Son",components: {Dialog},
}
</script><style scoped>
.son{background-color: pink;padding: 10px;
}
</style>

Dialog.vue

<template><div><button @click="isShow=true">点我弹个窗</button><teleport to="body"><div class="mask"  v-if="isShow"><div class="dialog"><h3>我是一个弹窗</h3><h4>一些内容</h4><h4>一些内容</h4><h4>一些内容</h4><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 scoped>
.mask{position: absolute;top: 0;bottom: 0;left: 0;right: 0;background-color: rgba(0,0,0,0.5);
}
.dialog{width: 300px;height: 300px;background-color: skyblue;text-align: center;position: absolute;left: 50%;top: 50%;transform: translate(-50%,-50%);
}
</style>

请添加图片描述

总结

  1. 什么是Teleport?——Teleport是一种能将我们的组件html结构移动到指定位置的技术
<teleport to="移动位置"><div v-if="isShow" class="mask"><div class="dialog"><h3>我是一个弹窗</h3><button @click="isShow=false">关闭弹窗</button></div></div>
</teleport>

Suspense

普通写法

App组件和Child组件是一起加载出来的

App.vue

<template><div class="app"><h1>我是App组件</h1><Child></Child></div>
</template><script>
import Child from "@/components/Child";  //静态引入export default {name: 'App',components: {Child},
}
</script><style scoped>
.app{background-color: gray;padding: 10px;
}
</style>

Child.vue

<template><div class="child"><h1>我是Child组件</h1></div>
</template><script>
export default {name: "Child",
}
</script><style scoped>
.child{background-color: orange;padding: 10px;
}
</style>

请添加图片描述

使用suspense之后

App.vue

<template><div class="app"><h1>我是App组件</h1><suspense><template v-slot:default><Child></Child></template><template v-slot:fallback><h3>稍等,加载中...</h3></template></suspense></div>
</template><script>
// import Child from "@/components/Child";  //静态引入
import {defineAsyncComponent} from 'vue'
const Child=defineAsyncComponent(()=>import('@/components/Child'))  //异步引入
export default {name: 'App',components: {Child},
}
</script><style scoped>
.app{background-color: gray;padding: 10px;
}
</style>

Child.vue

<template><div class="child"><h1>我是Child组件</h1></div>
</template><script>
export default {name: "Child",
}
</script><style scoped>
.child{background-color: orange;padding: 10px;
}
</style>

请添加图片描述

不再自己调整网络低速

Child.vue

<template><div class="child"><h1>我是Child组件</h1><div>{{sum}}</div></div>
</template><script>
import {ref} from "vue";export default {name: "Child",async setup(){let sum=ref(0)const p=  new Promise((resolve, reject) => {setTimeout(() => {resolve({sum})},3000)})return await p}
}
</script><style scoped>
.child{background-color: orange;padding: 10px;
}
</style>

App.vue

<template><div class="app"><h1>我是App组件</h1><suspense><template v-slot:default><Child></Child></template><template v-slot:fallback><h3>稍等,加载中...</h3></template></suspense></div>
</template><script>
// import Child from "@/components/Child";  //静态引入
import {defineAsyncComponent} from 'vue'
const Child=defineAsyncComponent(()=>import('@/components/Child'))  //异步引入
export default {name: 'App',components: {Child},
}
</script><style scoped>
.app{background-color: gray;padding: 10px;
}
</style>

总结

补充setup的一个知识点

  1. setup不能是一个async函数,因为返回值不再是return的对象,而是promise,模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)

Suspense总结

  1. 等待异步组件时渲染一些额外内容,让应用有更好的用户体验
  2. 使用步骤
    (1)异步引入组件
import {defineAsyncComponent} from 'vue'
const Child=defineAsyncComponent(()=>import('@/components/Child'))  //异步引入

(2)使用Suspense包裹组件,并配置好defaultfallback

<template><div class="app"><h1>我是App组件</h1><suspense><template v-slot:default><Child/></template><template v-slot:fallback><h3>稍等,加载中...</h3></template></suspense></div>
</template>

Vue3中其他的改变

全局API的转移

  1. Vue 2.x 有许多全局 API 和配置。
    例如:注册全局组件、注册全局指令等
//注册全局组件Vue.component('MyButton', {data: () => ({count: 0}),template: '<button @click="count++">Clicked {{ count }} times.</button>'})//注册全局指令Vue.directive('focus', {inserted: el => el.focus()}
  1. Vue3中对这些API做了调整
    将全局的API,即:Vue.xxx调整到应用实例(app)

    2.x 全局 API(Vue3.x 实例 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

其他改变

  1. data选项应始终被声明为一个函数。
  2. 过度类名的更改:
  • Vue2.x写法

    .v-enter,
    .v-leave-to {opacity: 0;
    }
    .v-leave,
    .v-enter-to {opacity: 1;
    }
    
  • Vue3.x写法

    .v-enter-from,
    .v-leave-to {opacity: 0;
    }.v-leave-from,
    .v-enter-to {opacity: 1;
    }
    
  1. 移除keyCode作为 v-on 的修饰符,同时也不再支持config.keyCodes
  2. 移除修饰符
  • 父组件中绑定事件

    <my-componentv-on:close="handleComponentEvent"v-on:click="handleNativeClickEvent"
    />
    
  • 子组件中声明自定义事件

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

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


http://chatgpt.dhexx.cn/article/bIbLhUld.shtml

相关文章

从Vue2到Vue3【五】——新的组件(Fragment、Teleport、Suspense)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API&#xff08;第一章&#xff09;从Vue2到Vue3【二】Composition API&#xff08;第二章&#xff09;从Vue2到Vue3【三】Composition API&#xff08;第三章&#xff09;从Vue2到Vue3【四】C…

【Vue3】Fragment组件、Teleport组件和Suspense组件

Fragment组件 在Vue2中&#xff0c;组件必须有一个根标签 在Vue3中&#xff1a;组件可以没有根标签&#xff0c;内部会将多个标签包含在一个Fragment虚拟元素中 好处&#xff1a;减少标签层次&#xff0c;减少内侧占用 Teleport组件 是一种能够将我们的组件html结构移动到指…

vue3笔记案例——Suspense使用之骨架屏

文章目录 skeleton组件sync组件 Suspense使用 skeleton组件 示例图 代码 <template><div class"sk"><div class"sk-2"><div class"sk-2-1"></div><div></div></div><hr><div class…

Vue3 异步组件 suspense

vue在解析我们的组件时&#xff0c; 是通过打包成一个 js 文件&#xff0c;当我们的一个组件 引入过多子组件是&#xff0c;页面的首屏加载时间 由最后一个组件决定 优化的一种方式就是采用异步组件 &#xff0c;先给慢的组件一个提示语或者 骨架屏 &#xff0c;内容回来在显示…

React18: 如何使用Suspense 等待数据异步加载

Suspense API Suspense 主要有两大用途&#xff1a; 1&#xff1a;动态加载组件 &#xff08;但这并不是一个react 18的新特性&#xff09; 2: 等待数据异步加载 想要实现这两种功能&#xff0c;需要满足对应的条件&#xff0c;可以在官方文档中清楚的看到&#xff1a; 从文档…

Vue3:异步加载await <suspense>

异步加载await TOC 1. public静态资源中放入data.json数据: {"data": {"name": "admin","age": 23,"url": "","desc": "胜多负少的份上水电费seafood水电费收到是是地方是水电费 "} }2. 原…

vue3父组件异步获取后端数据,子组件无法及时渲染问题分析、解决及使用suspense组件进行骨架屏优化

vue3中一个常见场景&#xff0c;父组件向后端异步获取数据&#xff0c;再父子传参给子组件&#xff0c;由子组件来渲染获取到的数据。 简单的props父子传参 只用props进行父子传参&#xff0c;子组件在其一系列生命周期开始时是获取不到数据的。父子组件的生命周期流程如下&a…

Vue3尝鲜之Suspense异步组件(踩坑)

Suspense组件是Vue3中的知名功能之一。 它们允许我们的应用程序在等待异步组件时渲染一些后备内容&#xff0c;可以让我们创建一个平滑的用户体验。 值得庆幸的是&#xff0c;Suspense组件非常容易理解&#xff0c;它们甚至不需要任何额外的导入! 可以解决异步请求的困境&…

Vue——vue3 suspense async await用法 onErrorCaptured 抓取错误

子组件 my-project\src\components\DogShow.vue <template><img :src"result && result.message" /> </template><script lang"ts"> import axios from "axios"; import { defineComponent } from "vue&…

React18介绍及setState、suspense、useTransition、useDeferredValue的使用

文章目录 1. 带来了什么2. 创建项目3. 入口文件的改变4. setState5. 条件渲染传异步数据给子组件6. suspense结合异步组件实现条件渲染7. useTransition降级渲染8. useDeferredValue节流处理 1. 带来了什么 改进已有属性&#xff0c;如自动批量处理【setState】、改进Suspense…

【VUE】vue3学习笔记(异步组件,包含defineAsyncComponent、Suspense的使用)

&#x1f431; 个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &am…

Vue3——Suspense组件

Suspense组件 官网中有提到他是属于实验性功能&#xff1a; <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我…

vue3中的Suspense

1、Suspense作用 等待异步组件时渲染一些额外内容&#xff0c;让应用有更好的用户体验 2、使用步骤 使用步骤&#xff1a; 异步引入组件 import {defineAsyncComponent} from vue const Child defineAsyncComponent(()>import(./components/Child.vue)) 使用Suspense包裹组…

react-Suspense工作原理分析

Suspense 基本应用 Suspense 目前在 react 中一般配合 lazy 使用&#xff0c;当有一些组件需要动态加载(例如各种插件)时可以利用 lazy 方法来完成。其中 lazy 接受类型为 Promise<() > {default: ReactComponet}> 的参数&#xff0c;并将其包装为 react 组件。React…

vue3新增Suspense组件

在开始介绍Vue的Suspense组件之前&#xff0c;我们有必要先了解一下React的Suspense组件&#xff0c;因为他们的功能类似。 React React 16.6 新增了 <Suspense> 组件&#xff0c;让你可以“等待”目标代码加载&#xff0c;并且可以直接指定一个加载的界面&#xff08;…

Suspense组件

先上官网&#xff1a;https://cn.vuejs.org/guide/built-ins/suspense.html 注意一下 <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 在使用了之后在浏览器控制台会有如下打印&#xff0c;至少目前是…

详解Vue3 Suspense:是什么?能干什么?如何用?

本篇文章带大家深入了解一下Vue3 Suspense&#xff0c;聊聊Suspense是什么、能干什么&#xff0c;以及如何使用它&#xff0c;希望对大家有所帮助&#xff01; Suspense 不是你想的那样。是的&#xff0c;它帮助我们处理异步组件&#xff0c;但它的作用远不止于此。&#xff0…

Vue3.0的新特性(8)Suspense

Suspense是Vue3推出的一个内置组件&#xff0c;它允许我们的程序在等待异步组件时渲染一些后备的内容&#xff0c;可以让我们创建一个平滑的用户体验&#xff1b;Vue中加载异步组件其实在Vue2.x中已经有了&#xff0c;我们用的vue-router中加载的路由组件其实也是一个异步组件&…

实现分布式锁的解决方案

目录 1. 分布式锁1.1 什么是分布式锁1.2 为什么要使用分布式锁1.3 分布式锁应具有的特性 2 分布式锁实现方案2.1 数据库实现分布式锁2.2 ZooKeeper实现分布式锁2.3 Redis实现分布式锁2.3.1 版本一2.3.2 版本二2.3.3 版本三 3. Redisson3.1 Redisson介绍3.2 Redisson分布式锁使用…

什么是分布式锁,分布式锁有什么作用?

1 、什么是分布式锁 为了防止分布式系统中的多个进程之间相互干扰&#xff0c;我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。 2、为什么要使用分布式锁 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中&#xff1b…