Vue3从入门到精通(三)
vue3插槽Slots
在 Vue3 中,插槽(Slots)的使用方式与 Vue2 中基本相同,但有一些细微的差异。以下是在 Vue3 中使用插槽的示例:
// ChildComponent.vue
<template>
<div>
<h2>Child Component</h2>
<slot></slot>
</div>
</template>
// ParentComponent.vue
<template>
<div>
<h1>Parent Component</h1>
<ChildComponent>
<p>This is the content of the slot.</p>
</ChildComponent>
</div>
</template>
<script>
import { defineComponent } from 'vue'
import ChildComponent from './ChildComponent.vue'
export default defineComponent({
name: 'ParentComponent',
components: {
ChildComponent
}
})
</script>
在上面的示例中,ChildComponent 组件定义了一个默认插槽,使用 <slot></slot> 标签来表示插槽的位置。在 ParentComponent 组件中,使用 <ChildComponent> 标签包裹了一段内容 <p>This is the content of the slot.</p>,这段内容将被插入到 ChildComponent 组件的插槽位置。
需要注意的是,在 Vue3 中,默认插槽不再具有具名插槽的概念。如果需要使用具名插槽,可以使用 v-slot 指令。以下是一个示例:
// ChildComponent.vue
<template>
<div>
<h2>Child Component</h2>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>
// ParentComponent.vue
<template>
<div>
<h1>Parent Component</h1>
<ChildComponent>
<template v-slot:header>
<h3>This is the header slot</h3>
</template>
<p>This is the content of the default slot.</p>
<template v-slot:footer>
<p>This is the footer slot</p>
</template>
</ChildComponent>
</div>
</template>
<script>
import { defineComponent } from 'vue'
import ChildComponent from './ChildComponent.vue'
export default defineComponent({
name: 'ParentComponent',
components: {
ChildComponent
}
})
</script>
在上面的示例中,ChildComponent 组件定义了三个插槽,分别是名为 header、默认插槽和名为 footer 的插槽。在 ParentComponent 组件中,使用 <template v-slot:header> 来定义 header 插槽的内容,使用 <template v-slot:footer> 来定义 footer 插槽的内容。默认插槽可以直接写在组件标签内部。
需要注意的是,在 Vue3 中,v-slot 只能用在 <template> 标签上,不能用在普通的 HTML 标签上。如果要在普通 HTML 标签上使用插槽,可以使用 v-slot 的缩写语法 #。例如,<template v-slot:header> 可以简写为 #header。
vue3组件生命周期
在 Vue3 中,组件的生命周期钩子函数与 Vue2 中有一些变化。以下是 Vue3 中常用的组件生命周期钩子函数:
beforeCreate: 在实例初始化之后、数据观测之前被调用。created: 在实例创建完成之后被调用。此时,实例已完成数据观测、属性和方法的运算,但尚未挂载到 DOM 中。beforeMount: 在挂载开始之前被调用。在此阶段,模板已经编译完成,但尚未将模板渲染到 DOM 中。mounted: 在挂载完成之后被调用。此时,组件已经被挂载到 DOM 中,可以访问到 DOM 元素。beforeUpdate: 在数据更新之前被调用。在此阶段,虚拟 DOM 已经重新渲染,并将计算得到的变化应用到真实 DOM 上,但尚未更新到视图中。updated: 在数据更新之后被调用。此时,组件已经更新到最新的状态,DOM 也已经更新完成。beforeUnmount: 在组件卸载之前被调用。在此阶段,组件实例仍然可用,可以访问到组件的数据和方法。unmounted: 在组件卸载之后被调用。此时,组件实例已经被销毁,无法再访问到组件的数据和方法。
需要注意的是,Vue3 中移除了一些生命周期钩子函数,如 beforeDestroy 和 destroyed。取而代之的是 beforeUnmount 和 unmounted。
另外,Vue3 中还引入了新的生命周期钩子函数 onRenderTracked 和 onRenderTriggered,用于追踪组件的渲染过程和触发的依赖项。
需要注意的是,Vue3 推荐使用 Composition API 来编写组件逻辑,而不是依赖于生命周期钩子函数。Composition API 提供了 setup 函数,用于组件的初始化和逻辑组织。在 setup 函数中,可以使用 onBeforeMount、onMounted、onBeforeUpdate、onUpdated、onBeforeUnmount 等函数来替代相应的生命周期钩子函数。
vue3生命周期应用
Vue3 的生命周期钩子函数可以用于在组件的不同生命周期阶段执行相应的操作。以下是一些 Vue3 生命周期的应用场景示例:
beforeCreate和created:在组件实例创建之前和创建之后执行一些初始化操作,如设置初始数据、进行异步请求等。
export default {
beforeCreate() {
console.log('beforeCreate hook');
// 执行一些初始化操作
},
created() {
console.log('created hook');
// 执行一些初始化操作
},
};
beforeMount和mounted:在组件挂载之前和挂载之后执行一些 DOM 操作,如获取 DOM 元素、绑定事件等。
export default {
beforeMount() {
console.log('beforeMount hook');
// 执行一些 DOM 操作
},
mounted() {
console.log('mounted hook');
// 执行一些 DOM 操作
},
};
beforeUpdate和updated:在组件数据更新之前和更新之后执行一些操作,如更新 DOM、发送请求等。
export default {
beforeUpdate() {
console.log('beforeUpdate hook');
// 执行一些操作
},
updated() {
console.log('updated hook');
// 执行一些操作
},
};
beforeUnmount和unmounted:在组件卸载之前和卸载之后执行一些清理操作,如取消订阅、清除定时器等。
export default {
beforeUnmount() {
console.log('beforeUnmount hook');
// 执行一些清理操作
},
unmounted() {
console.log('unmounted hook');
// 执行一些清理操作
},
};
这些示例展示了 Vue3 生命周期钩子函数的一些常见应用场景。根据具体需求,你可以在相应的生命周期钩子函数中执行适当的操作。
vue3动态组件
在 Vue3 中,可以使用动态组件来根据不同的条件或状态动态地渲染不同的组件。使用动态组件可以使应用更加灵活和可扩展。以下是使用动态组件的示例:
使用
component元素和:is属性来实现动态组件的渲染:
<template>
<div>
<component :is="currentComponent"></component>
<button @click="toggleComponent">Toggle Component</button>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'ComponentA',
};
},
methods: {
toggleComponent() {
this.currentComponent = this.currentComponent === 'ComponentA' ? 'ComponentB' : 'ComponentA';
},
},
components: {
ComponentA,
ComponentB,
},
};
</script>
在上面的示例中,根据 currentComponent 的值动态地渲染 ComponentA 或 ComponentB 组件。点击按钮时,切换 currentComponent 的值,从而实现动态组件的切换。
使用
v-if和v-else来根据条件渲染不同的组件:
<template>
<div>
<component-a v-if="showComponentA"></component-a>
<component-b v-else></component-b>
<button @click="toggleComponent">Toggle Component</button>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
showComponentA: true,
};
},
methods: {
toggleComponent() {
this.showComponentA = !this.showComponentA;
},
},
components: {
ComponentA,
ComponentB,
},
};
</script>
在上面的示例中,根据 showComponentA 的值使用 v-if 和 v-else 来渲染 ComponentA 或 ComponentB 组件。点击按钮时,切换 showComponentA 的值,从而实现动态组件的切换。
这些示例演示了在 Vue3 中如何使用动态组件来根据条件或状态动态地渲染不同的组件。你可以根据具体需求选择适合的方式来使用动态组件。
vue3组件保持存活
在 Vue3 中,可以使用 <keep-alive> 组件来保持组件的存活状态,即使组件在组件树中被切换或销毁,它的状态仍然会被保留。这对于需要在组件之间共享状态或缓存数据的场景非常有用。以下是使用 <keep-alive> 组件来保持组件存活的示例:
<template>
<div>
<button @click="toggleComponent">Toggle Component</button>
<keep-alive>
<component :is="currentComponent"></component>
</keep-alive>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'ComponentA',
};
},
methods: {
toggleComponent() {
this.currentComponent = this.currentComponent === 'ComponentA' ? 'ComponentB' : 'ComponentA';
},
},
components: {
ComponentA,
ComponentB,
},
};
</script>
在上面的示例中,使用 <keep-alive> 组件将 <component> 包裹起来,这样在切换组件时,被包裹的组件的状态将会被保留。点击按钮时,切换 currentComponent 的值,从而切换要渲染的组件。
需要注意的是,被 <keep-alive> 包裹的组件在切换时会触发一些特定的生命周期钩子函数,如 activated 和 deactivated。你可以在这些钩子函数中执行一些特定的操作,如获取焦点、发送请求等。
<template>
<div>
<h2>Component A</h2>
</div>
</template>
<script>
export default {
activated() {
console.log('Component A activated');
// 执行一些操作
},
deactivated() {
console.log('Component A deactivated');
// 执行一些操作
},
};
</script>
在上面的示例中,当组件 A 被激活或停用时,分别在 activated 和 deactivated 钩子函数中输出相应的信息。
使用 <keep-alive> 组件可以方便地保持组件的存活状态,并在组件之间共享状态或缓存数据。
vue3异步组件
在 Vue3 中,可以使用异步组件来延迟加载组件的代码,从而提高应用的性能和加载速度。异步组件在需要时才会被加载,而不是在应用初始化时就加载所有组件的代码。以下是使用异步组件的示例:
使用
defineAsyncComponent函数来定义异步组件:
<template>
<div>
<button @click="loadComponent">Load Component</button>
<component v-if="isComponentLoaded" :is="component"></component>
</div>
</template>
<script>
import { defineAsyncComponent } from 'vue';
const AsyncComponent = defineAsyncComponent(() =>
import('./Component.vue')
);
export default {
data() {
return {
isComponentLoaded: false,
component: null,
};
},
methods: {
loadComponent() {
this.isComponentLoaded = true;
this.component = AsyncComponent;
},
},
};
</script>
在上面的示例中,使用 defineAsyncComponent 函数来定义异步组件 AsyncComponent。当点击按钮时,设置 isComponentLoaded 为 true,并将 component 设置为 AsyncComponent,从而加载异步组件。
使用
Suspense组件来处理异步组件的加载状态:
<template>
<div>
<Suspense>
<template #default>
<component :is="component"></component>
</template>
<template #fallback>
<div>Loading...</div>
</template>
</Suspense>
<button @click="loadComponent">Load Component</button>
</div>
</template>
<script>
import { defineAsyncComponent, Suspense } from 'vue';
const AsyncComponent = defineAsyncComponent(() =>
import('./Component.vue')
);
export default {
data() {
return {
component: null,
};
},
methods: {
loadComponent() {
this.component = AsyncComponent;
},
},
};
</script>
在上面的示例中,使用 Suspense 组件来处理异步组件的加载状态。在 default 插槽中,渲染异步组件,而在 fallback 插槽中,渲染加载状态的提示信息。当点击按钮时,加载异步组件。
这些示例演示了在 Vue3 中如何使用异步组件来延迟加载组件的代码。使用异步组件可以提高应用的性能和加载速度,特别是在应用中有大量组件时。
vue3依赖注入
在 Vue3 中,可以使用依赖注入来在组件之间共享数据或功能。Vue3 提供了 provide 和 inject 两个函数来实现依赖注入。
使用
provide函数在父组件中提供数据或功能:
<template>
<div>
<ChildComponent></ChildComponent>
</div>
</template>
<script>
import { provide } from 'vue';
import MyService from './MyService';
export default {
setup() {
provide('myService', new MyService());
},
};
</script>
在上面的示例中,使用 provide 函数在父组件中提供了一个名为 myService 的数据或功能,它的值是一个 MyService 的实例。
使用
inject函数在子组件中注入提供的数据或功能:
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
import { inject } from 'vue';
export default {
setup() {
const myService = inject('myService');
const message = myService.getMessage();
return {
message,
};
},
};
</script>
在上面的示例中,使用 inject 函数在子组件中注入了父组件提供的名为 myService 的数据或功能。通过注入的 myService 实例,可以调用其中的方法或访问其中的属性。
通过使用 provide 和 inject 函数,可以在组件之间实现依赖注入,从而实现数据或功能的共享。这在多个组件需要访问相同的数据或功能时非常有用。
vue3应用
Vue3 是一个用于构建用户界面的现代化 JavaScript 框架。它具有响应式数据绑定、组件化、虚拟 DOM 等特性,使得开发者可以更高效地构建交互式的 Web 应用。
下面是一些使用 Vue3 开发应用的步骤:
安装 Vue3:使用 npm 或 yarn 安装 Vue3 的最新版本。
npm install vue@next
创建 Vue3 应用:创建一个新的 Vue3 项目。
vue create my-app
编写组件:在
src目录下创建组件文件,例如HelloWorld.vue。
<template>
<div>
<h1>{{ message }}</h1>
<button @click="changeMessage">Change Message</button>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const message = ref('Hello, Vue3!');
const changeMessage = () => {
message.value = 'Hello, World!';
};
return {
message,
changeMessage,
};
},
};
</script>
在上面的示例中,使用 ref 函数创建了一个响应式的数据 message,并在模板中使用它。通过点击按钮,可以改变 message 的值。
使用组件:在
App.vue中使用自定义的组件。
<template>
<div>
<HelloWorld></HelloWorld>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default {
components: {
HelloWorld,
},
};
</script>
在上面的示例中,导入并注册了自定义的 HelloWorld 组件,并在模板中使用它。
运行应用:在命令行中运行以下命令启动应用。
npm run serve
这将启动开发服务器,并在浏览器中打开应用。
这只是一个简单的示例,你可以根据实际需求编写更复杂的组件和应用逻辑。Vue3 还提供了许多其他功能和工具,如路由、状态管理、单文件组件等,以帮助你构建更强大的应用。
希望这个简单的示例能帮助你入门 Vue3 应用的开发!
Vue3从入门到精通(三)的更多相关文章
- iOS开发-UI 从入门到精通(三)
iOS开发-UI 从入门到精通(三)是对 iOS开发-UI 从入门到精通(一)知识点的综合练习,搭建一个简单地登陆界面,增强实战经验,为以后做开发打下坚实的基础! ※在这里我们还要强调一下,开发环境和 ...
- MyBatis从入门到精通(三):MyBatis XML方式的基本用法之多表查询
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. 多表查询 上篇博客中,我们示例的 ...
- visual studio 2015 搭建python开发环境,python入门到精通[三]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...
- python入门到精通[三]:基础学习(2)
摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...
- MyBatis 入门到精通(三) 高级结果映射
MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是.如果有一个数据库能够完美映射到所有应用程序,也将是非常 ...
- Atom编辑器入门到精通(三) 文本编辑基础
身为编辑器,文本编辑的功能自然是放在第一位的,此节将总结常用的文本编辑的方法和技巧,掌握这些技巧以后可以极大地提高文本编辑的效率 注意此节中用到的快捷键是Mac下的,如果你用的系统是Win或者Linu ...
- PHP从入门到精通(三)
PHP数组的分类 按照下标的不同,PHP数组分为关联数组与索引数组: 索引数组:下标从0开始,依次增长:关联数组: 下标为字符串格式,每个下标字符串与数组的值一一关联对应.(有点像对象的键值对) 关于 ...
- flutter从入门到精通三
flutter可以通过一套代码运行在多个平台上,包括移动,web,桌面,嵌入式,但是在 Web 平台的支持尚未达到 Beta 阶段,请不要用在生产环节,在阅读文档时候,推荐大家阅读https://fl ...
- SaltStack 入门到精通第三篇:Salt-Minion配置文件详解
SaltStack 入门到精通第三篇:Salt-Minion配置文件详解 作者:ArlenJ 发布日期:2014-06-09 17:52:16 ##### 主要配置设置 ##### 配置 默认值 ...
- GPU 编程入门到精通(三)之 第一个 GPU 程序
博主因为工作其中的须要.開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
随机推荐
- 利用Nextcloud搭建私有同步云盘
1. 简介 Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或团队的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本控制.团队协作等功能.它的客户端覆盖了W ...
- 【贪心算法】NO134 加油站
134. 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升 ...
- python绘图之turtle库的相关使用
目录 turtle库的介绍 turtle库的使用 turtle库中相关的函数 窗体 setup()函数 screensize()函数 坐标 goto()函数 position()函数 home()函数 ...
- TEC-6计算机组成原理实验(简图)
TEC-6计算机组成原理实验
- 密码学与网安——intro
Terminology primitive: 原语 (一种不可分割的最基础操作,跟具体的视角和情形有关) 两个时间节点 1949年(1945年):Shannon 提出完全安全性,开始现代密码学 197 ...
- R的画图
关于R基础 有3个需要总结的地方 R的画图(统计学图,ggplot) R的基本语法 R dataframe相关 Plot plot(1,2) plot(c(1, 2, 3, 4, 5), c(3, 7 ...
- nginx启动报错80端口号已占用
开启或重启Nginx时报如下错误: Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 原因是端口号80被其 ...
- Vue中的$set的使用 (为对象设置属性)
data() { return { obj: { name: 'shun' } } } 对象只有name属性,通过$set给对象添加属性(三个参数,对象名,属性名, 属性) setage() { th ...
- 2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给
2022-11-09:给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给 ...
- 2022-07-19:f(i) : i的所有因子,每个因子都平方之后,累加起来。 比如f(10) = 1平方 + 2平方 + 5平方 + 10平方 = 1 + 4 + 25 + 100 = 130。
2022-07-19:f(i) : i的所有因子,每个因子都平方之后,累加起来. 比如f(10) = 1平方 + 2平方 + 5平方 + 10平方 = 1 + 4 + 25 + 100 = 130. ...