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 相关文章推荐
JS实现下拉框的动态添加(附效果)
Apr 03 Javascript
通过url查找a元素应用案例
Apr 29 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
Jul 10 Javascript
vue实现动态按钮功能
May 13 Javascript
详解vue-cli3开发Chrome插件实践
May 29 Javascript
手写Vue弹窗Modal的实现代码
Sep 11 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
Nov 20 Javascript
通过原生vue添加滚动加载更多功能
Nov 21 Javascript
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 jQuery
JavaScript构造函数原理及实现流程解析
Nov 19 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 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
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
PHP安全配置
2006/12/06 PHP
php 生成饼图 三维饼图
2009/09/28 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
Maps Javascript
2007/01/22 Javascript
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
jQuery实现简易聊天框
2020/02/08 jQuery
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Python pip 常用命令汇总
2020/10/19 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
清洁工表扬信
2014/01/08 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
公司年会主持词范文!
2019/05/07 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书