vue 关于keep-alive 的使用 和 异部组件使用(webpack打包)

keep-active 官网说明: 保持活力 |Vue.js (vuejs.org)

一、KEEP-ACTIVE 说明

<KeepAlive>是一个内置组件,允许我们在多个组件之间动态切换时有条件地缓存组件实例。

如以下代码

当你点击home按钮, F12 会出现相对应的console.log,即创建,再点击其他的,home 会销毁4

但是加上keep-active则不会销毁,它会一直在,保持活跃!!!

APP.vue:

<template>
    <div class="app">
       <div class="tabs">
          <template v-for="(item) in tabs" :key="item">
             <button :class="{active: currentTab===item}" 
                    @click="itemClick(item)"><!--点击使名字等于tabs里的内容-->
             {{ item }} <!--item即tab-->
             </button>
          </template>
       </div>
       <div class="view">
         <!--内部缓存,保存数据,不用再创建销毁 F12看console-->
         <!--全部缓存-->
         <!-- <keep-alive>
            <component :is ="currentTab"></component>
         </keep-alive> -->

         <!-- 只有包含的会缓存 home,about-->
          <!-- 组件的名称来自于组件定义的时候name选项 -->
         <keep-alive include="home,about">
            <component :is ="currentTab"></component>
         </keep-alive>
         <!-- include名称匹配的缓存
         exclude名称匹配的不缓存
         max一旦达到这个数字,那么存缓的组件中最近没有被访问的会被销毁 -->
       </div>
    </div>
  </template>
  
  <script>
  import Home from './vues/Home.vue'
  import About from './vues/About.vue'
  import Category from './vues/Category.vue'
  
  export default {
  
     components:{
        Home,
        About,
        Category,
     },
  
     data() {
       return{
          tabs:["home","about","category"],
        //   currentIndex:0
        currentTab:"home"//初始
       }
     },
     methods:{
       itemClick(tab){
         this.currentTab= tab
       }
     }
  }
  </script>
  
  <style scoped>
  .active{
     color:red
  }
  </style>

Home.vue:

<template>
  <h2>home </h2>
  <h2>当前计数{{ counter }}</h2>
  <button @click="counter++">+1</button>
</template>

<script>
export default {
  name: "home",
  data(){
    return{
      counter: 0
    }
  },
  created(){
    console.log("home created")
  }, 
   unmounted(){
    console.log("home unmounted")
   },

   //对于keep-alive 组件 ,监听没有进行切换
   //进入活跃状态,表选中
  activated(){
    console.log("home activated")
  },
  deactivated(){
    console.log("home deactivated")
  }
}
</script>

<style>

</style>

Category.vue:

<template>
    <h2>category</h2>
  </template>
  
  <script>
  export default {
    name: "category",
   unmounted(){
    console.log("category unmounted")
   }
  }
  </script>
  
  <style>
  
  </style>

二、webpack打包,异部组件使用 说明

npm run build     !!!   =>  dist   文件变小,移除空格,更快

将项目 分离 成 一个独自的文件夹 且 优化,加快载入速度, 生成 映射文件 有错误会从.map文件提示在源码第几行

当你说一个组件是“异步的”时,通常意味着这个组件的代码不是在应用启动时立即加载的,而是在需要渲染这个组件时才会被加载。

Vue中Webpack分包与异步组件的使用主要涉及以下几个方面:

一、Webpack分包

Webpack分包(也称为代码分割)是一种优化技术,它允许将代码分割成多个小块,以便在不同的页面或情境中按需加载。这样可以显著减小初始加载的资源大小,提高网页性能。Webpack提供了几种方式来设置分包,其中最常见的是使用动态导入和Webpack的内置功能SplitChunksPlugin

步骤和关键点

  1. 安装Webpack(如果尚未安装)。
  2. 使用动态导入:在代码中,使用动态导入来实现分包。这会告诉Webpack将导入的模块打包成单独的文件。
  3. 配置Webpack:在Webpack配置文件中,需要做一些调整以启用分包。通常,Webpack的默认配置已经支持分包。如果需要自定义配置,可以设置optimization.splitChunks选项来指定如何分割代码。

二、Vue中的异步组件

Vue异步组件是指通过异步方式加载的组件。当项目达到一定的规模时,对于某些组件来说,我们并不希望一开始全部加载,而是需要的时候进行加载。这样做可以很好地提高用户体验,加快页面的载入速度。首次打开页面会比较慢。

异步组件的注册和加载方式

  1. 基础使用:通过Vue.component方法注册一个异步组件,该组件的工厂函数会返回一个Promise对象,当Promise解析时,组件才会被加载和渲染。
  2. import引入组件:在Vue文件中,可以直接使用import()语法来异步加载组件。这种方式与Webpack的code-splitting功能配合使用,可以将组件分割到不同的bundle中,按需加载。
  3. 局部注册:在Vue组件的components选项中,也可以注册异步组件。

总结

  • Webpack分包和Vue异步组件都是优化前端性能的重要手段。
  • Webpack分包通过动态导入和配置优化,将代码分割成多个小块,按需加载,减小了初始加载的资源大小。
  • Vue异步组件通过异步加载和渲染组件,提高了页面的加载速度和用户体验。两者结合使用,可以进一步提升前端应用的性能。

代码演示:(上面为keep-active用法)

<template>
    <div class="app">
       <div class="tabs">
          <template v-for="(item) in tabs" :key="item">
             <button :class="{active: currentTab===item}" 
                    @click="itemClick(item)"><!--点击使名字等于tabs里的内容-->
             {{ item }} <!--item即tab-->
             </button>
          </template>
       </div>
       <div class="view">
         <!--内部缓存,保存数据,不用再创建销毁 F12看console-->
         <!--全部缓存-->
         <!-- <keep-alive>
            <component :is ="currentTab"></component>
         </keep-alive> -->

         <!-- 只有包含的会缓存 home,about-->
          <!-- 组件的名称来自于组件定义的时候name选项 -->
         <keep-alive include="home,about">
            <component :is ="currentTab"></component>
         </keep-alive>
         <!-- include名称匹配的缓存
         exclude名称匹配的不缓存
         max一旦达到这个数字,那么存缓的组件中最近没有被访问的会被销毁 -->
       </div>
    </div>
  </template>
  
  <script>
  import { defineAsyncComponent } from 'vue';//单独打包必须引用的
  import Home from './vues/Home.vue'
  import About from './vues/About.vue'
//   import Category from './vues/Category.vue'
// const Category =import("./vues/Category.vue")
// 单独打包 用的import函数
const AsyncCategory = defineAsyncComponent(()=>import("./vues/Category.vue"))
  

// 异部组件写法二
// const AsyncHome = defineAsyncComponent({
//    loader:()=> import("./vues/Category.vue"),
//    loadingComponent:Loading,
//    errorComponent:Error,
//    delay: 2000,//在显示 loadingComponent之前的延迟  默认值200ms
// 如果提供了 timeout 并且加载组件超过了设定,将显示错误组件
// 默认值:Infinity 永不超时 ,单位 ms
//    suspensible: true  //定义组件是否可挂起,默认值 true
// });


  export default {
  
     components:{
        Home,
        About,
        Category: AsyncCategory,
     },
  
     data() {
       return{
          tabs:["home","about","category"],
        //   currentIndex:0
        currentTab:"home"//初始
       }
     },
     methods:{
       itemClick(tab){
         this.currentTab= tab
       }
     }
  }
  </script>
  
  <style scoped>
  .active{
     color:red
  }
  </style>

main.js文件:

// import './assets/main.css'

// 这里引用不会单独分包会一起打包

import { createApp } from 'vue'
// import App from './组件嵌套使用/App.vue'
// import App from './父传子通信/App.vue'
// import App from './子传父通信/App.vue'
// import App from './04-案例衣物/App.vue'
// import App from './05-组件插槽/App.vue'
// import App from './06-provide-inject/App.vue'
// import App from './07-事件总线使用/App.vue'
// import App from './08-生命周期/App.vue'
// import App from './09-ref获取元素组件/App.vue'
// import App from './10-动态组件的使用/App.vue'
// import App from './11-Keep-Alive的使用/App.vue'
import App from './12-异部组件的使用/App.vue'

// 这里添加import函数会单独分包  

createApp(App).mount('#app')

自己编写的代码在app.js里面

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值