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 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
JQuery的ajax基础上的超强GridView展示
Sep 18 Javascript
IE6下CSS图片缓存问题解决方法
Dec 09 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
Jquery解析Json格式数据过程代码
Oct 17 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
Feb 21 Javascript
JS中setTimeout的巧妙用法前端函数节流
Mar 24 Javascript
AngularJs每天学习之总体介绍
Aug 07 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
Jan 16 Javascript
爬虫利器Puppeteer实战
Jan 09 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 Javascript
Vue SPA 首屏优化方案
Feb 26 Vue.js
浅谈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/10/21 PHP
PHP 面向对象详解
2012/09/13 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
Javascript this 的一些学习总结
2012/08/02 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
Python中线程编程之threading模块的使用详解
2015/06/23 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
人力资源部培训专员岗位职责
2014/01/02 职场文书
简历里的自我评价
2014/01/31 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
校外活动方案
2014/08/28 职场文书
python使用glob检索文件的操作
2021/05/20 Python
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL
Python实现仓库管理系统
2022/05/30 Python
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS