vue中动态引进组件、动态引进js模块文件方式

 更新时间:2026年05月31日 10:23:55   作者:赏花赏景赏时光  
本文详细介绍了Vue中动态引入组件和JS模块文件的方法与应用场景,包括包括通过动态引入组件和解决组件资源浪费问题is通过动态引入JS模块文件is优化解决第三方业务个性化需求导致的资源加载浪费问题为Vue开发提供了优化方案

本文主要介绍vue内容如下:

1、在.vue文件中动态引进组件

2、在.vue文件中动态引进js模块文件

一、动态引进组件

动态引进组件原因:在实际业务中,比如订单详情页面detail.vue,里面包含了多个第三业务的订单详情,但是不同的业务详情页面区别又很大,所以只能根据不同的业务来源,书写不同的详情组件,在根据业务来源展示相应的组件

问题:如果详情对接的业务来源越来越多,并且不同的来源对于详情页面定制化需求又高,这样就会增加越来越多的组件,如果在页面都是直接引进组件,那么没用到的组件就会造成资源浪费,导致页面文件大,并在加载时间变长

一般写法如下,页面中用到的组件都直接引进来

<template>
  <div>
    <Bcomponent v-if="isShowBComponent" />
    <CComponent v-else-if="isShowCComponent" />
    <p v-else-if="isShowPage">show another something</p>
  </div>
</template>
<script>
// 直接引进来,不必要的组件也加载,造成页面体积增大
import BComponent from './b.vue'
import CComponent from './c.vue'
export default {
  data() {
    return {
      isShowBComponent: false,
      isShowCComponent: false,
      isShowPage: false,
      condition: 0
    }
  },
  components: {
    BComponent,
    CComponent
  },
  mounted() {
    this.gtDataFromInterface()
  },
  methods: {
    gtDataFromInterface() {
      // 通过接口拿到数据后,根据字段返回值,确定要展示那个组件,比如接口返回字段condition,根据它的返回值展示
      // 在这里赋值
      this.condition = condition
      this.handleShowPage()
    },
    handleShowPage() {
      if (this.condition === 1) {
        this.isShowBComponent = true
      } else if (this.condition === 1) {
        this.isShowCComponent = false
      } else {
        this.isShowPage = true
      }
    }
  }
}
</script>

动态引进vue组件写法,和上面写法不同的地方就是引进组件的方式不一样

动态引进组件语法:

  • a)在components属性里面用这种方式引进组件:BComponent: () => {'./b.vue'}
  • b)在template中用v-if控制展示:<BComponent v-if="isShowBComponent" />
  • c)在符合的条件下将isShowBComponent设置为true
<template>
  <div>
    <Bcomponent v-if="isShowBComponent" />
    <CComponent v-else-if="isShowCComponent" />
    <p v-else-if="isShowPage">show another something</p>
  </div>
</template>
<script>
export default {
  data() {
    return {
      isShowBComponent: false,
      isShowCComponent: false,
      isShowPage: false,
      condition: 0
    }
  },
  components: {
    // 动态引进,当isShowBComponent=true的时候,才会真正加载BComponent组件文件
    BComponent: () => import('./b.vue'),
    CComponent: () => import('./c.vue')
  },
  mounted() {
    this.gtDataFromInterface()
  },
  methods: {
    gtDataFromInterface() {
      // 通过接口拿到数据后,根据字段返回值,确定要展示那个组件,比如接口返回字段condition,根据它的返回值展示
      // 在这里赋值
      this.condition = condition
      this.handleShowPage()
    },
    handleShowPage() {
      if (this.condition === 1) {
        this.isShowBComponent = true
      } else if (this.condition === 1) {
        this.isShowCComponent = false
      } else {
        this.isShowPage = true
      }
    }
  }
}
</script>

特殊说明:

1、当路由放在<keep-alive>里面,则vue文件里面就有activated属性

2、如果BComponent里面有activated属性

动态引进的化,BComponent的activated里面的方法就不会执行

 components: {
    // 动态引进,当isShowBComponent=true的时候,才会真正加载BComponent组件文件
    BComponent: () => import('./b.vue'),
    CComponent: () => import('./c.vue')
  }

如果不用动态引进组件的方式,则BComponent的activated里面的方法会执行

动态引进activated里面的方法不执行原因:

在初始化组件的声明周期方法的时候,就会对activated进行收集,如果是动态引进,则当文件加载完成时候,已经过了activated进行收集的时机,那么自然BComponent的activated里面的方法不会执行

二、在.vue文件中动态引进js模块文件

动态引进原因:比如payResult.vue文件表示支付结果页面,现实中我们有很多第三方业务场景在支付完成之后跳转到支付结果页面,在该页面不同的第三方业务会有一些个性化的需求,比如A、B业务需要做分享功能,C业务不需要做分享功能,这时候我们将分享功能的一些逻辑处理放在了handle.js文件里面,share.vue表示分享组件。这时候如果不区分业务来源,一进页面统一加载handle.js  share.vue组件,那么C业务本身不需要分享功能,但也加载了分享的相关文件,这会造成不必要的资源加载,浪费页面渲染性能

理想状态:根据业务来源,当为A、B业务的时候才加载分享相关文件,当为C业务则不加载,这时候就需要动态引进js模块文件了

动态引进大概流程

  • 1)一般进页面可能会调相应的接口拿数据,比如订单详情接口,该接口返回的数据可能有可以区分业务来源的字段,比如processNo
  • 2)可以根据processNo来动态引进handle.js
  • 3)动态引进js文件语法:import('./share.js').then(res => {}),res为object,是share.js导出的内容,如果有具名导出为aa和默认导出,则结果为res.default,res.aa

示例代码如下:

payResult.vue

<template>
  <div>
    <Sahre  :isShow="shareData.isShow" :dataInfo="shareData.dataInfo" @click="shareData.closeEvent"/>
  </div>
</template>
<script>
export default {
  components: {
    // 动态引进组件
    Share: () => import('./share.vue')
  },
  data() {
    return {
      shareData: {
        isShow: false,         // 控制组件的显隐,
        dataInfo: {},          // 组件的数据
        closeEvent: () => {}   // 组件的关闭事件
      }
    }
  },
  mounted() {
    this.getInitData()
  },
  methods: {
    getInitData() {
      // 通过接口拿到数据,判断是某服务,serviceName
      let flag1 = serviceName === 'daiJia'
      let flag2 = serviceName === 'battery'
      if (flag1 || flag2) {
        // 这种动态引进的方式,会返回一个Promise
        import('./share.js').then(res => {
          // share.js是默认导出,所以通过res.default拿到数据
          this.shareData = res.default
          // 根据相应的服务,调用相应的方法
          if (flag1) {
            // 这里要把组件实例传过去
            this.shareData.getSetDaiJiaData(this)
          } else if (flag2) {
            this.shareData.getSetBatteryData(this)
          }
        })
      }
    }
  }
}
</script>

share.js

export default {
  isShow: false,
  dataInfo: {},
  closeEvent: () => {
    // 注意这里要用箭头函数,才能拿到this对象,并且this指向的是该文件导出的内容,即有个default属性的对象
    // 如果用一般的声明方式,则this为null
    this.default.isShow = false
  },
  getSetDaiJiaData(vm) {
    // 通过接口那数据
    // 这里不能通过this.$store去访问,需要在调用的地方传vm进来
    vm.$store.dispatch('').then(res => {
      this.isShow = res.isShow
      this.dataInfo = res.data
    }).catch(err => {
      console.error(err)
    })
  },
  getSetBatteryData(vm) {
    // 通过接口那数据
    vm.$store.dispatch('').then(res => {
      this.isShow = res.isShow
      this.dataInfo = res.dataInfo
    }).catch(err => {
      console.error(err)
    })
},
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue父组件调用子组件方法报错问题及解决

    vue父组件调用子组件方法报错问题及解决

    这篇文章主要介绍了vue父组件调用子组件方法报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 详解vue-router 路由元信息

    详解vue-router 路由元信息

    本篇文章主要介绍了vue-router 路由元信息,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • vue中@change兼容问题详解

    vue中@change兼容问题详解

    这篇文章主要介绍了vue中@change兼容问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Vue指令详解之v-if与v-show的对比与常见应用分析

    Vue指令详解之v-if与v-show的对比与常见应用分析

    Vue提供了v-if和v-show两个指令来实现条件渲染,虽然它们都能控制元素的显示与隐藏,但在实现机制和使用场景上有着显著差异,本文将深入探讨这两个指令的工作原理、性能特点以及适用场景,帮助开发者在实际项目中做出合理选择,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • 关于element中表格和表单的封装方式

    关于element中表格和表单的封装方式

    这篇文章主要介绍了关于element中表格和表单的封装方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue-cli中的:visible.sync是什么意思

    vue-cli中的:visible.sync是什么意思

    visible前面加冒号的,说明后面是一个变量或者表达式;没加冒号的后面就是对应的字符串字面量,这篇文章主要介绍了vue-cli中的:visible.sync是什么,需要的朋友可以参考下
    2022-11-11
  • vue.js整合vux中的上拉加载下拉刷新实例教程

    vue.js整合vux中的上拉加载下拉刷新实例教程

    这篇文章主要给大家介绍了关于vue.js整合vux中上拉加载下拉刷新的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)

    Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)

    这篇文章主要介绍了Vuejs 2.0 子组件访问/调用父组件的方法(示例代码),需要的朋友可以参考下
    2018-02-02
  • vue项目中自定义video视频控制条的实现代码

    vue项目中自定义video视频控制条的实现代码

    这篇文章主要介绍了vue项目中自定义video视频控制条的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 谈谈vue中mixin的一点理解

    谈谈vue中mixin的一点理解

    vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用。下面给大家谈谈我对vue中mixin的一点理解,需要的朋友参考下吧
    2017-12-12

最新评论