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 相关文章推荐
pjblog修改技巧汇总
Mar 12 Javascript
js form 验证函数 当前比较流行的错误提示
Jun 23 Javascript
javascript 多浏览器 事件大全
Mar 23 Javascript
浅析JavaScript中的常用算法与函数
Nov 21 Javascript
jquery 判断滚动条到达了底部和顶端的方法
Apr 02 Javascript
Javascript解析URL方法详解
Dec 05 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
怎样判断jQuery当前元素是隐藏还是显示
Nov 23 Javascript
JS实现数组去重复值的方法示例
Feb 18 Javascript
详解10分钟学会vue滚动行为
Sep 21 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
May 16 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
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
Javascript的this详解
2019/03/23 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python对文件的操作方法汇总
2020/02/28 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
考博自荐信
2013/10/25 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
办公室保洁员岗位职责
2013/12/02 职场文书
水利水电专业自荐信
2014/07/08 职场文书
校友回访母校寄语
2015/02/26 职场文书
工作试用期自我评价
2015/03/10 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
小孩不笨观后感
2015/06/03 职场文书
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers