Vue动态创建注册component的实例代码


Posted in Javascript onJune 14, 2019

前言

在深入了解Vue动态创建Component前先了解一下常规组件声明形式。

Vue 的组件通常可以通过两种方式来声明,一种是通过 Vue.component,另外一种则是 Single File Components(SFC) 单文件组件 。

常规组件声明与注册

// 定义一个名为 button-counter 全局注册的组件
Vue.component("button-counter", {
 template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>',
 data() {
  return {
   count: 0
  }
 }
});

new Vue({
 template: `
  <div id="app">
   <h1>App Component</h1>
   <button-counter></button-counter>
  </div>
 `
}).$mount("#app");

在上面的代码中我们声明了一个叫做 button-counter 的组件。如果在常规情况下使用的话,只需要在页面上写对应的 <button-counter></button-counter> 标签就够了。

全局创建注册组件可以实现动态创建,但是我们必须在 template 声明使用该组件,而且如果把所有组件都全局注册这并不是一个好办法。

在官方文档中我们可以看到,我们可以通过 Vue.component('component-name') 的方式来注册一个组件。

而组件实例又有 $mount 这样一个方法,官方对于 $mount 的解释如下:

vm.$mount( [elementOrSelector] )
Arguments:
{Element | string} [elementOrSelector]
{boolean} [hydrating]
Returns: vm - the instance itself
Usage:
If a Vue instance didn't receive the el option at instantiation, it will be in “unmounted” state, without an associated DOM element. vm.$mount() can be used to manually start the mounting of an unmounted Vue instance.
If elementOrSelector argument is not provided, the template will be rendered as an off-document element, and you will have to use native DOM API to insert it into the document yourself.
The method returns the instance itself so you can chain other instance methods after it.

那我们是否可以通过这种方式来达到我们的需求呢?

还不够!

为什么???

因为 Vue.component 返回的结果是一个 function!它返回的并不是 组件实例,而是一个构造函数。

那到这里其实我们就清楚了。 对于 Vue.component 声明的组件,我们先通过 Vue.component 获取它的构造函数,再 new 出一个组件实例,最后 通过 $mount 挂载到 html 上。

// 定义一个名为 button-counter 全局注册的组件
Vue.component("button-counter", {
 template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>',
 data() {
  return {
   count: 0
  }
 }
});

new Vue({
 template: `
  <div id="app">
   <h1>App Component</h1>
   <button @click="insert">click to insert button-counter comonent</button>
   <div id="insert-container"></div>
  </div>
 `,
 methods: {
  insert() {
   const ButtonCounter = Vue.component("button-counter"); // 只能查找到全局注册到组件
   const instance = new ButtonCounter();
   instance.$mount("#insert-container");
  }
 }
}).$mount("#app");

上述代码中,Vue.component 先获取到组件的构造函数,然后构造实例,通过实例的一些方法来处理数据和挂载节点。

但是我们发现 Vue.component 只负责全局注册或查找。

如果想要针对局部注册的组件使用动态创建并添加我们需要使用 Vue.extend 基础Vue构造器创建"子类"达到目的。

其实 Vue.component 方法传入的选项是一个对象时,Vue自动调用 Vue.extend。

完整代码示例:

const ButtonCounterComponent = {
 template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>',
 data() {
  return {
   count: 0
  }
 }
};

new Vue({
 template: `
  <div id="app">
   <h1>App Component</h1>
   <button @click="insert">click to insert button-counter comonent</button>
   <div id="insert-container"></div>
  </div>
 `,
 methods: {
  insert() {
   const ButtonCounter = Vue.extend(ButtonCounterComponent);
   const instance = new ButtonCounter();
   instance.$mount("#insert-container");
  }
 }
}).$mount("#app");

单文件应用

在实际使用场景里,大部分都是用脚手架构建到项目,使用 *.vue 这种单文件方式注册组件。

<template></template>
<script>
export default {
 data() {
  return {
   msg: "hello"
  }
 },
 created() {},
 mounted() {},
 destroy() {}
};
</script>
<style scoped></style>

import *.vue 返回的就是模版中 script 中 export 部分。

总结

至此,我们知道了,全局组件动态注册 和 局部组件动态注册 的使用方法和注意事项,我们可以结合实际情况去选择不同方案进行搭配即可。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript函数中的arguments参数
Aug 01 Javascript
一次失败的jQuery优化尝试小结
Feb 06 Javascript
jquery.validate.js插件使用经验记录
Jul 02 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
Mar 13 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
AngularJs concepts详解及示例代码
Sep 01 Javascript
微信小程序 开发指南详解
Sep 27 Javascript
js图片切换具体实现代码
Oct 13 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
Dec 05 Javascript
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
Mar 08 Javascript
JS Ajax请求会话过期处理问题解决方法分析
Nov 16 Javascript
基于Proxy的小程序状态管理实现
Jun 14 #Javascript
深度了解vue.js中hooks的相关知识
Jun 14 #Javascript
Vue 实现前进刷新后退不刷新的效果
Jun 14 #Javascript
在Vue中使用icon 字体图标的方法
Jun 14 #Javascript
移动端底部导航固定配合vue-router实现组件切换功能
Jun 13 #Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 #Javascript
vue路由插件之vue-route
Jun 13 #Javascript
You might like
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
php常用字符函数实例小结
2016/12/29 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
pandas如何处理缺失值
2019/07/31 Python
Python如何实现的二分查找算法
2020/05/27 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
求职信范文大全
2014/05/26 职场文书
2014年减负工作总结
2014/12/10 职场文书
公司2015年终工作总结
2015/05/26 职场文书
关于python类SortedList详解
2021/09/04 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技