vue动态注册组件实例代码详解


Posted in Javascript onMay 30, 2019

写本篇文章之前其实也关注过vue中的一个关于加载动态组件is的API,最开始研究它只是用来实现一个tab切换的功能,使用起来也蛮不错的。

is

预期:string | Object (组件的选项对象)

用于动态组件且基于 DOM 内模板的限制来工作。

示例:

<!-- 当 `currentView` 改变时,组件也跟着改变 -->
<component v-bind:is="currentView"></component>

详见vue API中关于is的定义和用法

至于用在tab切换中,大概就是:

<template>
 <div>
 <div>#动态组件实现tab切换效果#</div><br><br><br>
 

<nav>
 


<a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="toggleTabs(first);">{{first}}</a>
     
<a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="toggleTabs(second);">{{second}}</a>
   
  <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="toggleTabs(third);">{{third}}</a>
 

</nav>



 <first :is="currentView" keep-alive></first>

 </div>
</template>

<script>
import first from 'components/first';
import second from 'components/second';
import third from 'components/third';

export default {
  data () {
    return {
     first: "first",
    second: "second",
    third: "third",
    currentView: 'first',
    };
   },
   components: { 
    first,
    second,
    third
   },
   methods: {
    toggleTabs (tabText) {
     this.currentView = tabText;
    }
   }
 }
</script>

但是今天,一个前端同行在群里问我“如果当前页面是根据传进来的参数的不同而显示不同的组件,而且当前页面中可能会import进来几十个子组件,而我又不想挨个去import这些组件,同时这些组件又是按需加载的,该咋实现?” 说实话,一开始我也懵了。

我在想,实在不行就用const demo = () => import ( './demo.vue'),或者在组件的components:中按需引入:

components: {
 demo: () => import ( './demo.vue')
}

但是我一想,也不对啊,这样虽然能实现按需加载,但是还是要挨个import这些组件,还是没有解决实际的问题。

经过查阅资料发现,vue有一个extend的方法可以实现。那么这个extend方法到底是干嘛的?

Vue.extend( options )

Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器。经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元素时,会自动调用“扩展实例构造器”来生成组件实例,并挂载到自定义元素上。

只是,extend创建的是一个组件构造器,而不是一个具体的组件实例,所以他不能直接在new Vue中这样使用。

使用Vue.extend创建的组件构造器最终是可以通过Vue.components注册成全局组件或new实例化后注册为局部组件。

接下来就来实现以下使用Vue.extendVue.components注册全局组件:

import Vue from 'vue';

const globalComponent = Vue.extend({
 template:"<p><a :href='url'>{{nama}}</a></p>",
 data:function(){
  return{
   nama:'某度',
   url:'http://www.moudu.com'
  }
 }
});

Vue.component('globalComponent', globalComponent);

使用这个全局注册的组件:

<template>
 <globalComponent />
</template>

注册全局组件还是很简单的,接下来就来实现根据传参的不同加载不同组件的方法:

<template>
 <button type="button" @click="toggle('test')">动态注册组件<button>
 <p><div ref="currentView"></div>
</template>

<script>
import Vue from 'vue'

export default {
 data(){
 return {}
 },
 methods: {
 toggle(componentName){
  this.registerComponent(componentName).then(Component => {
  // new Component().$mount(this.$refs.currentView)

  new Component({
   el: this.$refs.currentView
  })
  })
 },
 registerComponent(componentName) {
  return import(`@/views/${componentName}.vue`).then(component => {
  return Vue.extend(component.default);
  });
 }
 },
}
</script>

这样,我们就可以根据动态传入的参数,通过import( @/views/${componentName}.vue )来加载不同的组件,注意import有一个回调的方法,在该回调中就可以使用 Vue.extend(component.default)来创建一个组件的构造器,然后通过new关键字就可以实现局部注册组件了。

总结

以上所述是小编给大家介绍的vue动态注册组件实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript数组使用调用方法汇总
Dec 08 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
关于图片的预加载过程中隐藏未知的
Dec 19 Javascript
使用js实现的简单拖拽效果
Mar 18 Javascript
AngularJS的内置过滤器详解
May 14 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
jQuery密码强度验证控件使用详解
Jan 05 Javascript
Webpack打包css后z-index被重新计算的解决方法
Jun 18 Javascript
详解Vue取消eslint语法限制
Aug 04 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
Aug 08 jQuery
vue中rem的配置的方法示例
Aug 30 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
实用的Vue开发技巧
May 30 #Javascript
vue-router的两种模式的区别
May 30 #Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 #Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
May 30 #Javascript
全面分析JavaScript 继承
May 30 #Javascript
浅谈Express.js解析Post数据类型的正确姿势
May 30 #Javascript
vue组件三大核心概念图文详解
May 30 #Javascript
You might like
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
利用原生JS实现data方法示例代码
2019/05/28 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
用实例说明python的*args和**kwargs用法
2013/11/01 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
Python实现在线音乐播放器
2017/03/03 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
学校采购员岗位职责
2014/01/02 职场文书
经销商年会策划方案
2014/05/29 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers