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 相关文章推荐
js正文内容高亮效果的实现方法
Jun 30 Javascript
js鼠标滑过图片震动特效的方法
Feb 17 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
AngularJs Understanding the Controller Component
Sep 02 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
Feb 28 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
前端把html表格生成为excel表格的实例
Sep 19 Javascript
Angularjs Promise实例详解
Mar 15 Javascript
JS实现仿微信支付弹窗功能
Jun 25 Javascript
浅谈VUE单页应用首屏加载速度优化方案
Aug 28 Javascript
JavaScript用document.write()输出换行的示例代码
Nov 26 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
二进制交叉权限微型php类分享
2014/02/07 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
js获取json元素数量的方法
2015/01/27 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python删除字符串中指定字符的方法
2018/08/13 Python
wxPython的安装与使用教程
2018/08/31 Python
python实现多线程端口扫描
2019/08/31 Python
opencv+python实现均值滤波
2020/02/19 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
python中实现栈的三种方法
2020/12/19 Python
如何提高MySql的安全性
2014/06/19 面试题
自荐信的两点禁忌
2013/10/30 职场文书
部队领导证婚词
2014/01/12 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
大学生求职简历自我评价
2015/03/02 职场文书