Vue.extend 编程式插入组件的实现


Posted in Javascript onNovember 18, 2019

前言

日常中我们要使用一个弹框组件的方式通常是先通过Vue.component 全局或是 component 局部注册后,然后在模版中使用。接下来我们尝试编程式的使用组件。

实现

其实步骤很简单

  1. 通过 Vue.extend() 创建构造器
  2. 通过 Vue.$mount() 挂载到目标元素上
  3. 目标实现一个 alert 弹框,确认和取消功能如下图

Vue.extend 编程式插入组件的实现

document.createElement

其实想要插入一个元素,通过 document.createElement 就可以实现,并非一定需要上面两步,但是涉及到组件的复杂度、样式设置、可维护性所以使用创建构造器的方式比较可行。

Vue.extend()

首先来定义这个弹框的结构和样式,就是正常的写组件即可

<template>
 <div class="grid">
   <h1 class="head">这里是标题</h1>
   <div @click="close">{{ cancelText }}</div>
   <div @click="onSureClick">{{ sureText }}</div>
 </div>
</template>
<script>
export default {
 props:{
  close:{
   type:Function,
   default:()=>{}
  },
  cancelText:{
   type:String,
   default:'取消'
  },
  sureText:{
   type:String,
   default:'确定'
  }
 },
 methods:{
  onSureClick(){
   // 其他逻辑
   this.close()
  }
 }
};
</script>

将创建构造器和挂载到目标元素上的逻辑抽离出来,多处可以复用

export function extendComponents(component,callback){
 const Action = Vue.extend(component)
 const div = document.createElement('div')
 document.body.appendChild(div)
 const ele = new Action({
  propsData:{
   cancelText:'cancel',
   sureText:'sure',
   close:()=>{
    ele.$el.remove()
    callback&&callback()
   }
  }
 }).$mount(div)
}

上面代码需要注意以下几点:

  1. Vue.extend 获得是一个构造函数,可以通过实例化生成一个 Vue 实例
  2. 实例化时可以向这个实例传入参数,但是需要注意的是 props 的值需要通过 propsData 属性来传递
  3. 得到 Vue 实例后,我们需要通过一个目标元素来挂载它,有人首先会想到挂载到 #app 上,这个挂载的过程是将目标元素的内容全部替换,所以一旦挂载到 #app 上,该元素的所有子元素都会消失被替换
  4. 针对第3点,所以创建了一个 div 元素插入到 body 中,我们将想要挂载的内容替换到这个div上

Vue.extend 和 Vue.component component 的区别

  1. Vue.component component两者都是需要先进行组件注册后,然后在 template 中使用注册的标签名来实现组件的使用。Vue.extend 则是编程式的写法
  2. 关于组件的显示与否,需要在父组件中传入一个状态来控制 或者 在组件外部用 v-if/v-show 来实现控制,而 Vue.extend 的显示与否是手动的去做组件的挂载和销毁。
  3. Vue.component component 在组件中需要使用 slot 等自定义UI时更加灵活,而 Vue.extend 由于没有 template的使用,没有slot 都是通过 props 来控制UI,更加局限一些。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
Aug 15 Javascript
Prototype 学习 Prototype对象
Jul 12 Javascript
JS案例分享之金额小写转大写
May 15 Javascript
精通JavaScript的this关键字
May 28 Javascript
基于javascript实现全屏漂浮广告
Mar 31 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
Jul 01 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
Jun 06 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
Mar 05 Javascript
JS+CSS实现过渡特效
Jan 02 Javascript
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
浅谈Webpack4 Tree Shaking 终极优化指南
Nov 18 #Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
Nov 18 #jQuery
webpack常用配置总览(小结)
Nov 18 #Javascript
vue使用一些外部插件及样式的配置代码
Nov 18 #Javascript
重置Redux的状态数据的方法实现
Nov 18 #Javascript
JavaScript数值类型知识汇总
Nov 17 #Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
Nov 17 #Javascript
You might like
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
php的sso单点登录实现方法
2015/01/08 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
javascript getElementsByClassName函数
2010/04/01 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
js实现select下拉框选择
2020/01/11 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[00:10]神之谴戒
2019/03/06 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
详解Python3中字符串中的数字提取方法
2017/01/14 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
采购类个人求职的自我评价
2014/02/18 职场文书
银行服务感言
2014/03/01 职场文书
廉洁自律承诺书
2014/03/27 职场文书
学校教师读书活动总结
2014/07/08 职场文书
2015年征兵工作总结
2015/07/23 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS