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 相关文章推荐
jQuery获取注册信息并提示实现代码
Apr 21 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
javascript通过元素id和name直接取得元素的方法
Apr 28 Javascript
深入浅出 jQuery中的事件机制
Aug 23 Javascript
vue-axios使用详解
May 10 Javascript
AngularJS实现动态添加Option的方法
May 17 Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
jquery html添加元素/删除元素操作实例详解
May 20 jQuery
JS字符串和数组如何实现相互转化
Jul 02 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 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和MySql来与ODBC数据连接
2006/10/09 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
php实现简单四则运算器
2020/11/29 PHP
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
Python封装shell命令实例分析
2015/05/05 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
python如何读写json数据
2018/03/21 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
python pycharm的安装及其使用
2019/10/11 Python
简单了解python列表和元组的区别
2020/05/14 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
学生实习推荐信范文
2013/11/26 职场文书
打架检讨书500字
2014/01/29 职场文书
入党介绍人评语
2014/05/06 职场文书
干部鉴定材料
2014/05/18 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
中标通知书格式
2015/04/17 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP