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 相关文章推荐
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
jQuery功能函数详解
Feb 01 Javascript
javascript倒计时效果实现
Nov 12 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
JavaScript的继承实现小结
May 07 Javascript
关于react中组件通信的几种方式详解
Dec 10 Javascript
jQuery中ajax获取数据赋值给页面的实例
Dec 31 jQuery
vue拖拽组件使用方法详解
Dec 01 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
Dec 05 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
使用js实现单链解决前端队列问题的方法
Feb 03 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代码(抓取网页中的邮箱地址)
2012/07/17 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
JS跨域请求的问题解析
2018/12/03 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
浅谈Python的文件类型
2016/05/30 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
ubuntu上安装python的实例方法
2019/09/30 Python
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
幼儿园秋季开学寄语
2014/08/02 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
对照检查剖析材料
2014/09/30 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
Python进行区间取值案例讲解
2021/08/02 Python
JavaScript函数柯里化
2021/11/07 Javascript