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设置IFrame高度自适应(兼容各主流浏览器)
Jun 05 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
Mar 03 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
Sep 03 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 Javascript
javascript实现Table排序的方法
May 15 Javascript
javascript 动态修改css样式方法汇总(四种方法)
Aug 27 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
Oct 10 Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 Javascript
JavaScript Tab菜单实现过程解析
May 13 Javascript
JavaScript实现雪花飘落效果
Dec 27 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
Smarty保留变量用法分析
2016/05/23 PHP
利用javascript查看html源文件
2006/11/08 Javascript
[推荐]javascript 面向对象技术基础教程
2009/03/03 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
Python解析多帧dicom数据详解
2020/01/13 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
sort命令的作用和用法
2012/11/04 面试题
物流专业大学生的自我鉴定
2013/11/13 职场文书
简历中个人自我评价范文
2013/12/26 职场文书
高一生物教学反思
2014/01/17 职场文书
小学生美德少年事迹
2014/02/02 职场文书
安全生产演讲稿
2014/05/09 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书