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 相关文章推荐
Prototype 学习 工具函数学习($方法)
Jul 12 Javascript
JS、DOM和JQuery之间的关系示例分析
Apr 09 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
Mar 03 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
Dec 08 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
如何在JS中实现相互转换XML和JSON
Jul 19 Javascript
JavaScript鼠标特效大全
Sep 13 Javascript
js生成随机数方法和实例
Jan 17 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
vue 粒子特效的示例代码
Sep 19 Javascript
微信小程序如何实现精确的日期时间选择器
Jan 21 Javascript
Node.js web 应用如何封装到Docker容器中
Sep 01 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
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
详解Python3 pandas.merge用法
2019/09/05 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
Keras设置以及获取权重的实现
2020/06/19 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
自我鉴定范文
2013/11/10 职场文书
毕业自我评价范文
2013/11/17 职场文书
鲜花方阵解说词
2014/02/13 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
擅自离岗检讨书
2014/09/12 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js