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 相关文章推荐
下拉列表select 由左边框移动到右边示例
Dec 04 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
Apr 16 Javascript
jQuery中after()方法用法实例
Dec 25 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
创建自己的jquery表格插件
Nov 25 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
Jan 10 Javascript
three.js加载obj模型的实例代码
Nov 10 Javascript
Vue修改mint-ui默认样式的方法
Feb 03 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
Sep 27 Javascript
vue自动化路由的实现代码
Sep 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP 日,周,月点击排行统计
2012/01/11 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
destoon常用的安全设置概述
2014/06/21 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
如何实现JS函数的重载
2006/09/22 Javascript
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
基于JavaScript实现的顺序查找算法示例
2017/04/14 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python编程入门的一些基本知识
2015/05/13 Python
Python中几个比较常见的名词解释
2015/07/04 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python 实现进度条的六种方式
2021/01/06 Python
HTML5 拖放(Drag 和 Drop)详解与实例代码
2017/09/14 HTML / CSS
2014全国两会大学生学习心得体会
2014/03/10 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
出售房屋协议书范本
2014/10/06 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript