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 遮罩层实现(mask)实现代码
Jan 09 Javascript
JavaScript中数组成员的添加、删除介绍
Dec 30 Javascript
javascript中的altKey 和 Event属性大全
Nov 06 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 Javascript
BootStrap 弹出层代码
Feb 09 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
Jan 12 Javascript
vue实现未登录跳转到登录页面的方法
Jul 17 Javascript
this在vue和小程序中的使用详解
Jan 28 Javascript
JS使用正则表达式实现常用的表单验证功能分析
Apr 30 Javascript
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
聊聊JS ES6中的解构
Apr 29 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 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
PHP脚本数据库功能详解(上)
2006/10/09 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
php-msf源码详解
2017/12/25 PHP
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python注释详解
2016/06/01 Python
Python基础知识点 初识Python.md
2019/05/14 Python
django实现支付宝支付实例讲解
2019/10/17 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
初中新生军训方案
2014/05/13 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
企业愿景口号
2015/12/25 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python