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 相关文章推荐
xml分页+ajax请求数据源+dom取结果实例代码
Oct 31 Javascript
jquery 全局AJAX事件使用代码
Nov 05 Javascript
Prototype源码浅析 Enumerable部分之each方法
Jan 16 Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 Javascript
深入理解jQuery 事件处理
Jun 14 Javascript
基于AngularJS实现表单验证功能
Jul 28 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 Javascript
vue弹出框组件封装实例代码
Oct 31 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 Javascript
JS手写一个自定义Promise操作示例
Mar 16 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 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函数分享之curl方式取得数据、模拟登陆、POST数据
2014/06/04 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
JavaScript队列函数和异步执行详解
2017/06/19 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
python删除本地夹里重复文件的方法
2020/11/19 Python
python逆序打印各位数字的方法
2018/06/25 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
python实现快递价格查询系统
2020/03/03 Python
Python对象的属性访问过程详解
2020/03/05 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
面试后感谢信
2014/02/01 职场文书
优秀广告词大全
2014/03/19 职场文书
五一口号
2014/06/19 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
Django与数据库交互的实现
2021/06/03 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技