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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
ext form 表单提交数据的方法小结
Aug 08 Javascript
js实现两个值相加alert出来精确到指定位
Sep 25 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
jQuery入门基础知识学习指南
Aug 14 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
Jun 28 Javascript
Vue中添加手机验证码组件功能操作方法
Dec 07 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
理解JavaScript中的Proxy 与 Reflection API
Sep 21 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
Oct 22 Javascript
vue实现简单的登录弹出框
Oct 26 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
一个好用的分页函数
2006/11/16 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
JS控制表格隔行变色
2006/06/26 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
python smtplib发送带附件邮件小程序
2018/05/22 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
营销与策划个人求职信
2013/09/22 职场文书
销售2014年度工作总结
2014/12/08 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
党校培训学习心得体会
2016/01/06 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python