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 相关文章推荐
IE JS无提示关闭窗口不提示的方法
Apr 29 Javascript
js模仿jquery的写法示例代码
Jun 16 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
Mar 11 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
Jul 28 Javascript
JSON与JS对象的区别与对比
Mar 01 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 Javascript
JavaScript中import用法总结
Jan 20 Javascript
详解微信小程序回到顶部的两种方式
May 09 Javascript
如何使用webpack打包一个库library的方法步骤
Dec 18 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
其他功能
2006/10/09 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
php从字符串创建函数的方法
2015/03/16 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
浅谈PHP中的那些魔术常量
2020/12/02 PHP
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
vue监听input标签的value值方法
2018/08/27 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
木马的传播途径主要有哪些
2016/04/08 面试题
五年级英语教学反思
2014/01/31 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
聚美优品广告词改编
2014/03/14 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
2015年度党员个人总结
2015/02/14 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers
MySQL GTID复制的具体使用
2022/05/20 MySQL
从原生JavaScript到React深入理解
2022/07/23 Javascript