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 相关文章推荐
javascript 在firebug调试时用console.log的方法
May 10 Javascript
JS实现点击下载的小例子
Jul 10 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
Dec 30 Javascript
首页图片漂浮效果示例代码
Jun 05 Javascript
文字垂直滚动之javascript代码
Jul 29 Javascript
jQuery+HTML5加入购物车代码分享
Oct 29 Javascript
JS实现可拖曳、可关闭的弹窗效果
Sep 26 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
Bootstrap学习笔记之css样式设计(1)
Jun 07 Javascript
浅谈JavaScript中数组的增删改查
Jun 20 Javascript
深入理解(function(){... })();
Aug 16 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 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微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
《秋游》教学反思
2014/04/24 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
太行山上观后感
2015/06/05 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
美元符号 $
2022/02/17 杂记
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android