Vue 动态组件 & 异步组件(is 、keep-alive、异步组件、处理懒加载)

本文介绍了Vue中动态组件的使用,结合`keep-alive`实现数据缓存,以避免组件切换时数据重置。同时,探讨了异步组件的加载策略,如何在需要时按需加载,提高应用性能。通过示例展示了如何定义异步组件工厂函数,以处理加载状态,包括加载中、加载成功和加载失败的情况。
摘要由CSDN通过智能技术生成

动态组件 & 异步组件

动态组件 is+keep-alive

vue可以通过is来动态切换组件。

<component v-bind:is="currentTabComponent?currentTabComponent1:currentTabComponent2 "></component>
<button @click="currentTabComponent"> 切换 </button>

import currentTabComponent1 from './currentTabComponent1'
import currentTabComponent2 from './currentTabComponent2'
 components:{
  currentTabComponent:true
 }
data(){
 return {
 currentTabComponent:currentTabComponent1
  }
}
methods;{
 currentTabComponent(){
 this.currentTabComponent=!currentTabComponent
}
}

切换后的组件数据再重新切换回来数据还是会刷新为之前的,例如两个计算器组件一个已经计算了值为100切换为·另一个计算器组件时再切回来值会重置为0,如果想保存这个数据就可以使用keep-alive

<!-- 失活的组件将会被缓存!-->
<keep-alive>
  <component v-bind:is="currentTabComponent"></component>
</keep-alive>

这样就会将数据缓存起来无论切换多少次切换回去仍然为之前更改的数据

is不加v-bind的用法它可以解决html模板的限制。
例如:


 <ul>
  <li></li>
</ul>

成组件

 <ul>
  <li-list></li-list>
</ul>

但是html在渲染dom的时候,li-listt对ul来说并不是有效的dom,甚至会报错。
这个时候就可以使用is来解决这个问题

 <ul>
  <li is=“li-list”></li>
</ul>
  • 其实就相当于,语义上是一样一样的,就是解决了html模板的限制。

    异步组件

    在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。为了简化,Vue 允许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。

    例如:
    我通过v-show 来控制lists组件的显示和隐藏我希望页面加载的时候不去下载这个lists的js,那么就可以通过异步组件来解决这个问题了。

    <li v-show='isli'>
       <lists />
    </li>
    <button @click="Lilist">切换</button>
    
    import 'lists' from './lists'
     components:{
      lists
     }
    data(){
     isli:false
    }
    methods:{
      Lilist(){
       this.isli=!this.isli
      }
    }
    

    来改造一下

    <li v-show='isli'>
       <lists />
    </li>
    <button @click="Lilist">切换</button>
    
    // import 'lists' from './lists'  这个时候就不在这里引入了
     components:{
      lists:()=>import('./lists')
     }
    data(){
     isli:false
    }
    methods:{
      Lilist(){
       this.isli=!this.isli
      }
    }
    

    在这里插入图片描述
    这个时候点击按钮显示的时候就会加载出这个lists
    我们来给他起个名字可以这样写。

     components:{
      lists:()=>import(/*webpackChunName:'list'*/'./lists')
     }
    

    这样加载就是这样的了
    在这里插入图片描述

    接下来我们可以定义一个异步组件工厂函数

    <li v-show='isli'>
       <lists />
    </li>
    <button @click="Lilist">切换</button>
    
    import 'LoadingComponent' from './LoadingComponent'
    import 'ErrorComponent' from './ErrorComponent'
    const AsyncComponent = () => ({
      // 需要加载的组件 (应该是一个 `Promise` 对象)
      component: import( /*webpackChunName:'list'*/ './list'),
      // 异步组件加载时使用的组件
      loading: LoadingComponent,
      // 加载失败时使用的组件
      error: ErrorComponent,
      // 展示加载时组件的延时时间。默认值是 200 (毫秒)
      delay: 200,
      // 如果提供了超时时间且组件加载也超时了,
      // 则使用加载失败时使用的组件。默认值是:`Infinity`
      timeout: 3000
    })
    // import 'lists' from './lists'  这个时候就不在这里引入了
     components:{
      AsyncComponent 
     }
    data(){
     isli:false
    }
    methods:{
      Lilist(){
       this.isli=!this.isli
      }
    }
    

    这样当组件加载的时候就会加载loding组件内容,当加载成功后会积在list

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值