当前位置: 首页 > news >正文

Vue组件:动态组件、缓存组件、异步组件

1、动态组件

Vue.js 提供了对动态组件的支持。在使用动态组件时,多个组件使用同一挂载点,根据条件在不同组件之间进行动态切换。动态组件通过使用 Vue.js 中的 <component>元素,动态绑定到该元素的 is 属性,根据 is 属性的值来判断使用哪个组件。

语法格式如下:

<!-- 动态组件 -->
<component :is="componentName"></component>

动态组件经常应用在路由控制或选项卡切换中。下面通过一个切换选项卡的实例来说明动态组件的基本用法。

【实例】动态组件的基本用法。

(1)创建 ComponentA.vue 组件

<template><fieldset><legend>组件A</legend><p>博客信息:{{ blogName }}</p><p>博客地址:{{ blogUrl }}</p></fieldset>
</template><script>
export default {data() {return {blogName: '您好,欢迎访问 pan_junbiao的博客',blogUrl: 'https://blog.csdn.net/pan_junbiao'}}
}
</script>

(2)创建 ComponentB.vue 组件

<template><fieldset><legend>组件B</legend><p>用户名称:<input type="text" v-model="userModel.userName" /></p><p>用户年龄:<input type="number" v-model="userModel.age" /></p><p>用户性别:<input id="male" type="radio" value="1" v-model="userModel.sex" /><label for="male">男</label><input id="female" type="radio" value="2" v-model="userModel.sex" /><label for="female">女</label></p><button @click="loadData">加载数据</button></fieldset>
</template><script>
export default {data() {return {userModel: {userName: '',age: 0,sex: 2}}},methods: {loadData: function () {this.userModel.userName = 'pan_junbiao的博客';this.userModel.age = 36;this.userModel.sex = 1;}}
}
</script><style scoped>
.b_text {width: 300px;padding: 3px;font-size: 16px;
}
</style>

(3)在 App.vue 根组件中引入两个组件,并实现切换功能

<template><button :disabled="active" @click="trigger('ComponentA')">组件 A</button><button :disabled="!active" @click="trigger('ComponentB')">组件 B</button><!-- 第三步:使用动态组件 --><component :is="componentName"></component>
</template><script>
//第一步:引用组件
import ComponentA from '@/components/ComponentA.vue';
import ComponentB from '@/components/ComponentB.vue';export default {data() {return {componentName: 'ComponentA',active: true}},//第二步:注册组件components: {ComponentA,ComponentB},methods: {//切换组件trigger: function (componentName) {this.componentName = componentName;this.active = !this.active;}}
}
</script><style>
button {font-size: 16px;padding: 5px 20px;margin: 0px 10px 10px 0px;
}
</style>

执行结果:

(1)切换组件A效果:

(2)切换组件B效果:

2、缓存组件

在多个组件之间进行切换的时候,有时需要保持这些组件的状态,将切换后的状态保留在内存中,以避免重复渲染。为了解决这个问题,可以用一个 <keep-alive> 元素将动态组件包含起来。

语法格式如下:

<!-- 缓存组件 -->
<keep-alive><component :is="componentName"></component>
</keep-alive>

【实例】实现选项卡内容的缓存效果。

修改 App.vue 根组件中引入两个组件,并使用  <keep-alive> 元素实现组件内容的缓存效果。

<template><button :disabled="active" @click="trigger('ComponentA')">组件 A</button><button :disabled="!active" @click="trigger('ComponentB')">组件 B</button><!-- 第三步:使用缓存组件 --><keep-alive><component :is="componentName"></component></keep-alive>
</template>

执行结果:

3、异步组件

异步组件是Vue.js中的另一个重要特性,它允许你定义一个组件,但不是立即加载它,而是在需要时才加载。这种机制对于构建大型应用程序尤其有用,因为它可以帮助减少应用程序的初始加载时间,提高性能。异步组件通过动态导入模块来实现,这使得组件的加载成为异步操作。

语法格式如下:

// 第一步:导入 defineAsyncComponent 函数
import { defineAsyncComponent } from 'vue'// 第二步:定义异步组件
const ComponentB = defineAsyncComponent(() => import('@/components/ComponentB.vue'));

【实例】使用异步组件。

修改 App.vue 根组件中引入两个组件,其中组件B使用异步组件。

<template><button :disabled="active" @click="trigger('ComponentA')">组件 A</button><button :disabled="!active" @click="trigger('ComponentB')">组件 B</button><!-- 第三步:使用缓存组件 --><keep-alive><component :is="componentName"></component></keep-alive>
</template><script>
// 导入 defineAsyncComponent 函数
import { defineAsyncComponent } from 'vue'//第一步:引用组件
import ComponentA from '@/components/ComponentA.vue';
//import ComponentB from '@/components/ComponentB.vue';// 核心代码:定义异步组件
const ComponentB = defineAsyncComponent(() => import('@/components/ComponentB.vue'));export default {data() {return {componentName: 'ComponentA',active: true}},//第二步:注册组件components: {ComponentA,ComponentB},methods: {//切换组件trigger: function (componentName) {this.componentName = componentName;this.active = !this.active;}}
}
</script><style>
button {font-size: 16px;padding: 5px 20px;margin: 0px 10px 10px 0px;
}
</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CentOs7 解决yum更新源报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。
  • 微信小程序登录与获取手机号 (Python)
  • 计算机毕业设计Spark+PyTorch知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计
  • opencv学习:信用卡卡号识别
  • 别总是“系统错误,请稍后重试!”了,解决问题要彻底!
  • 铲屎官都该知道的除浮毛神器——希喂、美的、352宠物空气净化器
  • Python VTK 绘制等高线初步
  • image.size()和image.shape包含的信息一样,那image.size()存在的意义是什么?
  • 2024.9.9(极客大挑战 2019]EasySQL,[极客大挑战 2019]Knife)
  • 什么是3PL EDI 集成?优化供应链指南
  • springboot请求传参常用模板
  • CSS属性选择器选择属性值中包含指定字符串的元素
  • Android 12系统源码_应用加载流程(一)资源加载
  • 服务网关工作原理,如何获取用户真实IP?
  • 分享6个我喜欢的常用网站,来看看有没有你感兴趣的!
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Java编程思想》读书笔记-对象导论
  • dva中组件的懒加载
  • ES学习笔记(12)--Symbol
  • input实现文字超出省略号功能
  • 观察者模式实现非直接耦合
  • 前端工程化(Gulp、Webpack)-webpack
  • 微服务入门【系列视频课程】
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 问题之ssh中Host key verification failed的解决
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​如何使用QGIS制作三维建筑
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (Charles)如何抓取手机http的报文
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二)测试工具
  • (二)学习JVM —— 垃圾回收机制
  • (蓝桥杯每日一题)love
  • (七)Java对象在Hibernate持久化层的状态
  • (五)activiti-modeler 编辑器初步优化
  • (转)nsfocus-绿盟科技笔试题目
  • (转)关于多人操作数据的处理策略
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 的程序集加载上下文
  • .NetCore发布到IIS
  • .NET开源、简单、实用的数据库文档生成工具
  • :not(:first-child)和:not(:last-child)的用法
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ C++ ] STL---仿函数与priority_queue
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android]如何调试Native memory crash issue