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 相关文章推荐
IE中jscript/javascript的条件编译
Sep 07 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
May 13 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
Sep 01 Javascript
js获取会话框prompt的返回值的方法
Jan 10 Javascript
jQuery给多个不同元素添加class样式的方法
Mar 26 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
JavaScript的设计模式经典之代理模式
Feb 24 Javascript
JavaScript动态添加css样式和script标签
Jul 19 Javascript
微信小程序实现单选功能
Oct 30 Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 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 数组入门教程小结
2009/05/20 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
JavaScript动态加载样式表的方法
2015/03/21 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
javascript实现tab响应式切换特效
2016/01/29 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
简单的js计算器实现
2016/10/26 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
详解Python函数作用域的LEGB顺序
2016/05/14 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
Python实现爬取并分析电商评论
2020/06/19 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
python中的插入排序的简单用法
2021/01/19 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
《最后的姿势》教学反思
2014/02/27 职场文书
爱护公物标语
2014/06/24 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
课外活动总结
2015/02/04 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
浅谈MySQL中的六种日志
2022/03/23 MySQL