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 相关文章推荐
基于jQuery的实现简单的分页控件
Oct 10 Javascript
Juqery Html(),append()等方法的Bug解决方法
Dec 13 Javascript
jQuery函数的等价原生函数代码示例
May 27 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
Jun 03 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
深入理解Angular2 模板语法
Aug 07 Javascript
用jQuery实现优酷首页轮播图
Jan 09 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
js+css实现红包雨效果
Jul 12 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 Javascript
vue各种事件监听实例(小结)
Jun 24 Javascript
浅谈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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
jquery validate poshytip 自定义样式
2012/11/26 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
python实现定时播放mp3
2015/03/29 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
python的mysqldb安装步骤详解
2017/08/14 Python
python实现简易版计算器
2020/06/22 Python
python 不以科学计数法输出的方法
2018/07/16 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
二年级评语大全
2014/04/23 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
表彰大会策划方案
2014/05/13 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
董事长岗位职责
2015/02/13 职场文书
2015年保管员工作总结
2015/04/30 职场文书
mysql如何查询连续记录
2022/05/11 MySQL