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中Math对象使用说明
Jan 16 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 Javascript
初窥JQuery(一)jquery选择符 必备知识点
Nov 25 Javascript
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
JS打开新窗口的2种方式
Apr 18 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
JS实现单行文字不间断向上滚动的方法
Jan 29 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
Oct 09 Javascript
sencha ext js 6 快速入门(必看)
Jun 01 Javascript
javascript作用域、作用域链(菜鸟必看)
Jun 16 Javascript
解决Mac安装thrift因bison报错的问题
May 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写的小东西
2006/12/06 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
js实现课堂随机点名系统
2019/11/21 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
python变量不能以数字打头详解
2016/07/06 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
Python @property原理解析和用法实例
2020/02/11 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
铭立家具面试题
2012/12/06 面试题
《雨点》教学反思
2014/02/12 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL