Vue 2.0->3.0学习笔记(Vue 3 (五)- 新的组件)

Vue 2.0->3.0学习笔记(Vue 3 (五)- 新的组件)

  • 新的组件
    • [1. Fragment](#1. Fragment)
    • [2. Teleport](#2. Teleport)
    • [3. Suspense](#3. Suspense)

新的组件

1. Fragment

笔记

  • 在Vue2中: 组件必须有一个根标签
  • 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中
  • 好处: 减少标签层级, 减小内存占用

2. Teleport

笔记

  • 什么是Teleport?------ Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。
js 复制代码
<teleport to="移动位置">
	<div v-if="isShow" class="mask">
		<div class="dialog">
			<h3>我是一个弹窗</h3>
			<button @click="isShow = false">关闭弹窗</button>
		</div>
	</div>
</teleport>
  • 目录
  • Child.vue
javascript 复制代码
<template>
	<div class="child">
		<h3>我是Child组件</h3>
		<Son/>
	</div>
</template>

<script>
	import Son from './Son'
	export default {
		name:'Child',
		components:{Son},
	}
</script>

<style>
	.child{
		background-color: skyblue;
		padding: 10px;
	}
</style>
  • Dialog.vue
javascript 复制代码
<template>
	<div>
		<button @click="isShow = true">点我弹个窗</button>
		<teleport to="body">
			<div v-if="isShow" class="mask">
				<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>
	.mask{
		position: absolute;
		top: 0;bottom: 0;left: 0;right: 0;
		background-color: rgba(0, 0, 0, 0.5);
	}
	.dialog{
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translate(-50%,-50%);
		text-align: center;
		width: 300px;
		height: 300px;
		background-color: green;
	}
</style>
  • Son.vue
javascript 复制代码
<template>
	<div class="son">
		<h3>我是Son组件</h3>
		<Dialog/>
	</div>
</template>

<script>
	import Dialog from './Dialog.vue'
	export default {
		name:'Son',
		components:{Dialog}
	}
</script>

<style>
	.son{
		background-color: orange;
		padding: 10px;
	}
</style>
  • App.vue
javascript 复制代码
<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>
  • main.js
javascript 复制代码
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'

//创建应用实例对象------app(类似于之前Vue2中的vm,但app比vm更"轻")
const app = createApp(App)

//挂载
app.mount('#app')

3. Suspense

笔记

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

    js 复制代码
    import {defineAsyncComponent} from 'vue'
    const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
  • 使用Suspense包裹组件,并配置好defaultfallback

    vue 复制代码
    <template>
    	<div class="app">
    		<h3>我是App组件</h3>
    		<Suspense>
    			<template v-slot:default>
    				<Child/>
    			</template>
    			<template v-slot:fallback>
    				<h3>加载中.....</h3>
    			</template>
    		</Suspense>
    	</div>
    </template>
  • 目录
  • Child.vue
javascript 复制代码
<template>
	<div class="child">
		<h3>我是Child组件</h3>
		{{sum}}
	</div>
</template>

<script>
	import {ref} from 'vue'
	export default {
		name:'Child',
		async 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>
  • App.vue
javascript 复制代码
<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 Child from './components/Child'//静态引入
	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>
  • main.js
javascript 复制代码
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数
import { createApp } from 'vue'
import App from './App.vue'

//创建应用实例对象------app(类似于之前Vue2中的vm,但app比vm更"轻")
const app = createApp(App)

//挂载
app.mount('#app')
  • 本文仅作个人学习笔记使用,无商业用途。
  • 上述内容笔记大部分摘自"B站尚硅谷"
  • 如若转载,请先声明。
相关推荐
憧憬成为web高手11 小时前
[HITCON 2017]SSRFme
学习
妖精的羽翼11 小时前
AI + 前端、可视化 & 大屏
学习
xuhaoyu_cpp_java18 小时前
项目学习(三)分页查询
java·经验分享·笔记·学习
小宋加油啊20 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
原则猫20 小时前
HOOKS 背后机制
前端
码语智行20 小时前
首页导航跳转功能深度解析-系统内和系统外
前端
Xzh042321 小时前
AI Agent 学习路线(Java 后端方向)
java·人工智能·学习
阿猫的故乡21 小时前
Vue过渡动画从入门到装X:淡入淡出、滑动、列表动画、第三方库全搞定
前端·javascript·vue.js
裕波21 小时前
Vue&ViteConf 2026 将于 7 月 18 日在上海举办,尤雨溪将现场发表主题演讲
vue.js·vite
IManiy21 小时前
总结之Vibe Coding前端骨架
前端