基础案例

动态组件切换类比“bilibili-个人中心”的横向菜单切换不同的标签页的功能。

在Vue中可以使用 component 标签,并加一个特殊的属性(attribute) is来实现动态组件的切换。is需要一个组件的名称才能实现切换。

<div id="app">
<!-- 点击按钮,切换is的值 -->
<button @click="change">切换组件</button>
<!-- 绑定is,给一个组件名称 -->
<component v-bind:is="components[index]"></component>
</div>
<script>
Vue.component('student-list', {
// 省略...
}) Vue.component('teacher-list', {
// 省略...
}) let vm = new Vue({
el: '#app',
data: function () {
return {
index: 0,
components: ['student-list', 'teacher-list']
}
},
methods: {
change() {
this.index++
if (this.index === this.components.length) this.index = 0
}
}
})
</script>

在浏览器中的效果:

keep-alive

当在这些组件之间切换的时候,有时会想保持这些组件的状态,希望组件实例能够被在它们第一次被创建的时候缓存下来,以避免反复重渲染导致的性能问题,那么就可以在component外面加一层keep-alive标签。

<div id="app">
<button @click="change">切换组件</button>
<!-- keep-alive保持组件的状态 -->
<keep-alive>
<component v-bind:is="components[index]"></component>
</keep-alive>
</div>
<script>
Vue.component('user-signin', {
// 省略...
}) Vue.component('user-signup', {
// 省略...
}) let vm = new Vue({
el: '#app',
data: () => {
return {
index: 0,
components: ['user-signin', 'user-signup']
}
},
methods: {
change() {
this.index++
if (this.index === this.components.length) this.index = 0
}
}
})
</script>

在浏览器中的效果:

在component标签外套上一层keep-alive之后再切换组件,就不会失去之前的输入状态。

异步组件

应用程序功能不停地增加,核心页面承载太多的组件,如果一次性需要渲染所有的组件,会花费大量时间去做这项工作,这会大大降低用户的体验和心情。我们可能只在需要的时候才从服务器加载一个组件。

<div id="app">
<compo-one></compo-one>
<compo-two></compo-two>
</div>
<script>
const compoOne = {
name: 'compo-one',
template: `<h1>compo-one</h1>`
} let vm = new Vue({
el: '#app',
components: {
compoOne,
// 在局部组件中使用工厂函数方式定义组件
compoTwo: (resolve, reject) => {
setTimeout(() => {
// 定义模板内容
resolve({
template: '<h2>compoTwo加载完成,用时1秒</h2>'
})
}, 1000)
}
}
})
</script>

在浏览器中的效果:

Vue 动态组件和异步组件的更多相关文章

  1. Vue动态加载异步组件

    背景: 目前我们项目都是按组件划分的,然后各个组件之间封装成产品.目前都是采用iframe直接嵌套页面.项目中我们还是会碰到一些通用的组件跟业务之间有通信,这种情况下iframe并不是最好的选择,if ...

  2. vue2组件之异步组件...resolve

    看开源项目的时候看到这样的用法: 发现与之前定义组件的方式不一样,这个resolve又是什么? 原来这个是vue的异步组件实现,可以看这里:<异步组件> 异步组件的需求: 在大型应用中,我 ...

  3. vue 组件高级用法(递归组件,内联模板,动态组件,异步组件)

  4. Vue中异步组件(结合webpack,转载)

    转载,原文出处:https://www.jianshu.com/p/40a364b5e964 1.什么是异步组件? 异步组件就是定义的时候什么都不做,只在组件需要渲染(组件第一次显示)的时候进行加载渲 ...

  5. Vue异步组件Demo

    Vue异步组件Demo 在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载.为了进一步简化,Vue.js 允许将组件定义为一个工厂函数,异步地解析组件的定义.Vue.js 只在组件需要 ...

  6. Vue.js 源码分析(二十七) 高级应用 异步组件 详解

    当我们的项目足够大,使用的组件就会很多,此时如果一次性加载所有的组件是比较花费时间的.一开始就把所有的组件都加载是没必要的一笔开销,此时可以用异步组件来优化一下. 异步组件简单的说就是只有等到在页面里 ...

  7. 揭开Vue异步组件的神秘面纱

    简介 在大型应用里,有些组件可能一开始并不显示,只有在特定条件下才会渲染,那么这种情况下该组件的资源其实不需要一开始就加载,完全可以在需要的时候再去请求,这也可以减少页面首次加载的资源体积,要在Vue ...

  8. vue按需加载组件,异步组件

    说实话,我一开始也不知道什么叫按需加载组件,组件还可以按需加载???后来知道了 学不完啊...没关系,看我的 按需加载组件,或者异步组件,主要是应用了component的 is 属性 template ...

  9. vue-learning:32 - component - 异步组件和工厂函数

    异步组件 只有在这个组件需要使用的时候才从服务器加载这一个组件模块,用于渲染,并且会把结果缓存起来供未来复用. 实现方法: 组件定义的时候,以一个工厂函数的形式传入,在需要组件的执行这个函数,然后将组 ...

随机推荐

  1. win10 启用Hyper-V并安装Ubuntu20.10

    本文的最终目的是要将.netcore5.0(.net5.0)部署在Ubuntu中的docker容器中. 当前环境: 主系统:win10家庭版 虚拟机:Hyper-V (win10自带虚拟机) 虚拟机系 ...

  2. MyBatis 模糊查询的 4 种实现方式

    引言 MyBatis 有 4 种方式可以实现模糊查询. 员工信息表 ( tb_employee ) 如下: id name sex email birthday address 001 张一凡 男 z ...

  3. linux 修改IP, DNS -(转自fighter)

    linux下修改IP.DNS.路由命令行设置 ubuntu 版本命令行设置IP cat /etc/network/interfaces # This file describes the networ ...

  4. ifconfig显示的网卡信息和我的配置文件名不符

    比如我的配置文件, cd /etc/sysconfig/network-scripts/ifcfg-Auto_eth0是这个名称,但是我使用ifconfig显示的信息却是 eth6   Link en ...

  5. python报错“AttributeError: 'set' object has no attribute 'items'“

    作为才开始学爬虫的萌新,遇到了一个这样的错,很懵逼 后面到网络到处查看大佬的解决方法,才发现headers的请求头部信息有错误,headers是一个字典,不是字符串,所以报错了 原代码 headers ...

  6. [LeetCode] 231. 2 的幂

    位运算 231. 2 的幂 ``` class Solution { public boolean isPowerOfTwo(int n) { int cnt = 0; while (n>0) ...

  7. Python+Selenium - js操作

    js操作:日期框 本部分涉及两个知识点:DOM树和js DOM树教程链接: https://www.w3school.com.cn/htmldom/index.asp js教程链接 https://w ...

  8. python 导入同级目录文件、上级目录文件以及下级目录数据集和模块包

    划重点: 其中dataset_path = ''表示在Python工作文件夹 dataset_path = '..'表示在Python工作文件夹的上级文件夹 dataset_path = '某某文件夹 ...

  9. 回文词——线性dp

    #include<iostream> #include<cstdio> using namespace std; int n,f[5002][5002]; char str1[ ...

  10. FCN与U-Net语义分割算法

    FCN与U-Net语义分割算法 图像语义分割(Semantic Segmentation)是图像处理和是机器视觉技术中关于图像理解的重要一环,也是 AI 领域中一个重要的分支.语义分割即是对图像中每一 ...