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 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
js单例模式的两种方案
Oct 22 Javascript
基于javascript实现全屏漂浮广告
Mar 31 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
Sep 30 Javascript
微信小程序 条件渲染详解
Oct 09 Javascript
利用jQuery实现简单的拖曳效果实例代码
Oct 20 jQuery
vue-cli axios请求方式及跨域处理问题
Mar 28 Javascript
jQuery 导航自动跟随滚动的实现代码
May 30 jQuery
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
实用的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
dedecms中常见问题修改方法总结
2007/03/21 PHP
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
取得父标签
2006/11/14 Javascript
JavaScript 特殊字符
2007/04/05 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
利用Webpack实现小程序多项目管理的方法
2019/02/25 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
Python最基本的输入输出详解
2015/04/25 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
详解Django 时间与时区设置问题
2019/07/23 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
python 读取.nii格式图像实例
2020/07/01 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
销售主管竞聘书
2014/03/31 职场文书
出差报告格式模板
2014/11/06 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
二胎满月酒致辞
2015/07/29 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
pandas提升计算效率的一些方法汇总
2021/05/30 Python