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的简单&amp;简陋Tabs插件代码
Feb 09 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
Feb 27 Javascript
jquery中使用循环下拉菜单示例代码
Sep 24 Javascript
微信小程序 Flex布局详解
Oct 09 Javascript
微信小程序 UI布局常用技巧整理总结
Dec 05 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
Oct 31 Javascript
vue-cli常用设置总结
Feb 24 Javascript
js中DOM事件绑定分析
Mar 18 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
JS实现判断图片是否加载完成的方法分析
Jul 31 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
Apr 10 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设计模式 State (状态模式)
2011/06/26 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JavaScript 基本概念
2015/01/20 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
js中new一个对象的过程
2017/02/20 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
python获取android设备的GPS信息脚本分享
2015/03/06 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python性能提升之延迟初始化
2016/12/04 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
初中学校军训方案
2014/05/09 职场文书
学校创先争优活动总结
2014/08/28 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
开学第一周总结
2015/07/16 职场文书
技能培训通讯稿
2015/07/18 职场文书
python基础之匿名函数详解
2021/04/21 Python
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
JavaScript实例 ODO List分析
2022/01/22 Javascript
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL