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遍历数组与筛选数组的方法
Nov 05 Javascript
无刷新上传文件并返回自定义值
Jun 11 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
实例解析jQuery中proxy()函数的用法
May 24 Javascript
js实现文字截断功能
Sep 14 Javascript
关于angularJs指令的Scope(作用域)介绍
Oct 25 Javascript
Angular2 组件间通过@Input @Output通讯示例
Aug 24 Javascript
JavaScript实现的简单加密解密操作示例
Jun 01 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
vue 中 命名视图的用法实例详解
Aug 14 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
Sep 06 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
基于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自动获取目录下的模板的代码
2010/08/08 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
基于jQuery的倒计时插件代码
2011/05/07 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
Python OpenCV实现视频分帧
2019/06/01 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
批评与自我批评材料
2014/02/15 职场文书
师德模范事迹材料
2014/06/03 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
瘦西湖导游词
2015/02/03 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
MySQL中order by的使用详情
2021/11/17 MySQL