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 相关文章推荐
使用jscript实现二进制读写脚本代码
Jun 09 Javascript
用jquery和json从后台获得数据集的代码
Nov 07 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
Jquery常用的方法汇总
Sep 01 Javascript
用jquery获取自定义的标签属性的值简单实例
Sep 17 Javascript
Boostrap实现的登录界面实例代码
Oct 09 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
Oct 18 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
Nov 09 Javascript
npm国内镜像 安装失败的几种解决方案
Jun 04 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
Aug 06 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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
input 高级限制级用法
2009/03/26 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
jquery 手势密码插件
2017/03/17 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
Python中的函数作用域
2018/05/07 Python
python实现批量注册网站用户的示例
2019/02/22 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
物流专业大学的自我评价
2014/01/11 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python