Vue.extend封装函数式调用弹窗组件

68 篇文章 3 订阅
订阅专栏
33 篇文章 1 订阅
订阅专栏
12 篇文章 0 订阅
订阅专栏

问题背景:

平时我们使用组件都是import xxx from 'xxx';然后components里面注册,最后template中使用,这样一套流程下来略麻烦,有没有一种方式能像ElementUI的弹窗组件一样代码调用呢?下面看看如何实现

封装组件:

首先准备好组件和一个js文件用于导出调用组件的函数:

组件目录结构大概就是这样 

然后我们需要在index.js中创建调用组件的函数,创建组件的代码就是继承一份原组件进行实例化然后挂载到叶面的节点中,这里我是挂载了一个弹窗组件,封装了一些默认props:

import emitter from '@/plugins/mitt';
import router from '@/router';
import { Message } from 'element-ui';
import Vue from 'vue';
import PayDialog from './pay-dialog.vue';
const PayDialogConstructor = Vue.extend(PayDialog); // 倒入组件然后先继承一份组件得到新的组件构造函数
/**
 * @description 付费弹窗组件props校验
 * @param {{
 * url: string,
 * trackingId?: number,
 * onSuccess?: function,
 * } | string} props
 * @param {PromiseRejectionEvent} reject
 * @param {Function} executeFunc
 */
const validateProps = (props, reject, executeInitComponent) => {
  const propsTypes = ['string', 'object'];
  const propsType = typeof props;
  if (!propsTypes.includes(propsType)) {
    return reject(
      `Error in component PayDialog: invalid props type! expected ${propsTypes.join(
        ','
      )}, got ${propsType}`
    );
  }
  if (propsType === 'string' && props.trim() === '') {
    return reject('Error in component PayDialog: url can not be empty string!');
  }
  if (propsType === 'object' && props.trackingId && !props.url) {
    return reject(
      'Error in component PayDialog: renewal must be have props trackingId with valid url!'
    );
  }
  executeInitComponent();
};
/**
 * @description 付费/续费弹窗组件
 * 付费: 只需要传入url
 * 续费: 需要同时传入url和trackingId 传了trackingId就代表是续费
 * @param {{
 * url: string,
 * trackingId?: number,
 * onSuccess?: function,
 * } | string} options
 */
export default function (options) {
  return new Promise((resolve, reject) => {
    const executeInitComponent = () => {
      const propsData = {
        onDialogClosed(instance) {
          document.querySelector('.app').removeChild(instance.$el); // 窗口完全关闭后销毁窗口
          resolve(); // dosomething...
        },
        onSuccess: () => {
          // 如果没传成功的回调就走默认的成功提示和页面跳转逻辑
          if (!options.onSuccess) {
            Message({
              message: `${options.trackingId ? '续费' : '添加'}成功`,
              type: 'success',
              duration: 3000,
            });
            if (options.trackingId) {
              return emitter.emit('reloadPage'); // 如果传了trackingId则是续费,刷新页面
            }
            return router.push('/safety'); // 如果没传trackingId就是添加,跳转至检测链接页面
          }
          options.onSuccess(); // 付费/续费成功自定义dosomething...
        },
      };
      if (typeof options === 'string') {
        propsData.url = options; // 如果是ASIN字符串 则为付费
      } else {
        Object.assign(propsData, {
          trackingId: options.trackingId || 0, // 续费需要传商品的trackingId,
          url: options.url, // asin/商品url
        });
      }
      const payDialogInstance = new PayDialogConstructor({
        propsData, // props的key叫做propsData 这个和普通组件不一样要注意
      }); // 实例化组件
      document
        .querySelector('.app')
        .appendChild(payDialogInstance.$mount().$el); // $mount()不传参就是将组件实例挂载到文档外,返回值就是实例本身,传选择器就是挂载到具体元素里
      payDialogInstance.visible = true; // 组件挂载后显示出来
    };
    validateProps(options, reject, executeInitComponent); // 校验props
  });
}

这样我们在使用时直接从index.js中导入函数调用即可:

 

vue组件函数调用--弹窗组件
weixin_43117402的博客
04-21 1581
除了用自定义组件双向绑定的方法完成弹框的显示和隐藏外,我们还可以把 visible 直接写在子组件中,通过在父组件调用组件方法的形,修改子组件中的 visible 的值,完成弹框的显示和隐藏。 想要调用组件中的方法,其实就是访问子组件实例,调用实例中的方法。 可以利用 Vue 提供的 ref 属性来访问子组件实例,并调用组件中的方法。 改写子组件 Modal.vue 首先需要修改一下子组...
通过vue.extend实现一个弹窗组件
HamsterKnight的博客
01-15 847
1.首先编写需要被继承的弹窗组件 <template> <div v-if="show" ref="modal" class="ek-modal_wrap"> <div class="ek-modal-content"> <div class="modal-title-wrap"> <div clas...
Vue——函数调用组件
J_________的博客
02-28 6436
正常情况下使用组件 import 组件 import xxx from 'XXXx/XXX.vue' 注册组件 export default { components:{ XXX }, } 然后再使用组件以及配置,如果要显示这个组件就要改别isShow的值 &lt;template&gt; &lt;div&gt; &lt;xxx ...
Vue3中函数弹窗Dialog控制
最新发布
qq_55100815的博客
08-18 1238
vue函数弹窗Dialog控制 h函数与render函数 挂载虚拟dom
vue2和vue3中 封装组件 通过函数调用
qq_38758763的博客
07-27 1589
vue2和vue3中封装组件通过函数调用
vue函数调用 创建组件
weixin_55333190的博客
02-05 981
01-创建一个好的组件 02-在js文件创建函数 html <!-- * @Author: Allyn * @Description: * @Date: 2022-02-05 19:47:40 * @LastEditTime: 2022-02-05 20:05:03 * @FilePath: \hmYouGou\components\test.vue --> <template> <div v-show="isshow"> <div cl
vue2封装弹框全局组件,通过函数调用
wenliang6669的博客
02-17 2068
vue2封装弹框全局组件,通过函数调用
Vue 实现一个命令弹窗组件功能
10-16
这样可以在Vue应用的任何地方,以一种统一的方调用弹窗组件,而不需要每次都手动处理挂载和卸载逻辑。 实现命令弹窗组件Vue开发中一项基础但实用的技能,它不仅涉及Vue的实例化、挂载和销毁,还涉及到组件的...
portal:提供了一种在Vue项目中使用函数调用,将弹窗组件渲染到body节点的方
05-25
Vue2.x 中并没有类似的功能,该 npm 包利用 Vue 中的 extend 和 Js 中的 appendChild 将需要的组件 append 到 body 下,实现弹窗和主体页面充分解耦,并且利用 Promise 实现使用组件函数化,脱离对具体 UI 的依赖...
vue 全局弹窗函数调用
babyrita的博客
05-23 589
------------------------分割线------------------------------------------------------------------------分割线-----------------------------------------------//new出来的元素,是不在根元素下的,需要手动添加路由,否则如果需要路由跳转,是没办法实现的,这里很重要。想要实现函数调用,不能用Vue.component()注册。需要写一个js文件,一个 vue文件。
vue3 封装一个全局通用弹窗提示组件(利用js调用 类似于element)
06-21
全局直接使用js调用 this.$confirmation() 调用通用提示弹窗可二次封装 点击确认取消后 会有相应的回调 利用的Promise封装
vue2.x extend()】使用Vue.extend()封装自定义弹窗组件
马云
03-21 1821
前言 Vue.extend()是什么? 在vue2.x中,被用于创建一个基于Vue构造函数的子类,其参数应为一个包含组件选项的对象。 使用Vue.extend()可以做什么? 比如,我们需要封装一个弹窗组件,该弹窗组件的DOM结构不可以在根app节点下面,他要跟根app节点平级,那么就需要到Vue.extend()才可以实现。 使用Vue.extend封装弹窗组件 效果展示 代码编写 组件目录: - components - MyUI 组件库 - MessageBox 弹框组件 -
一个基于vue3的通过函数调用的弹框组件
chendf__的博客
11-18 2744
因项目需求需要一个弹框提示,之前是使用elemne-plus,但是因为项目调整不使用第三方ui库了,所以简单实现下element-plus的elMessage(ps:只做了单弹框提示,并没有做多个。动画也没有~,感兴趣的小伙伴可以自己添加哦) 处理svg的vite插件,并且全局注册使用 message.vue <!-- 目前的 message 只支持全局只有一个,暂时不修改为多个 --> <template> <div v-show="visible" class="r
Vue函数组件
weixin_65644264的博客
07-10 749
Vue.js 中,函数组件是一种无状态组件,主要用于那些只依赖于输入(props)并返回渲染结果的组件函数组件不需要管理自身的状态或生命周期方法,因此它们通常性能较高。
函数组件Vue.js中的运用
油墨香^-^的博客
08-10 163
你是否曾经遇到过这样一个场景,你有个需求需要引入一个第三方库,然而你只需要使用这个库里面某一个功能,如果这个库不支持分模块导出的话,就会因为引入整个库而导致项目体积变大,进而影响项目加载性能。再比如,下拉列表、时间选择器或者自动填充属性等自定义控件都是非常复杂的,需要考虑很多边缘的复杂情况。虽然有很多库很好的解决了这种复杂性,但是他们也带来了不好的缺点,就是这类组件无法自定义样
Vue函数弹窗组件封装原理
梦想成为全栈的切图仔
10-18 1887
很明显指的就是vue的实例。细心的朋友会发现,这个页面与以往的组件页面不一致,那是因为,我们本次的组件是需要JavaScript调用的,而非传递数据改变其状态调用。所以在这一步,我们就必须将当前的弹窗进行实例化,因为我们不是常规使用组件方法,所以这是哈哈我们使用Vue.extend 或者 newVue 实例化后,利用$mount 挂载到body下。因为我们通过已知的业务,通知可以是多条的,并且每一条都可以有不同的展示时间,所以在弹窗展示这里,我们用notices 数组来保存一个个的单内容。
vueVue3中使用函数调用组件函数和创建组件【超详细】
我的开源项目:https://gitee.com/derekgo/vue-cms_xg
07-06 4493
我发现还真的只能创建实例和传参数,不能调用组件内的方法。反正我是在createApp函数里挂载后也找不到组件内的方法使用。今天突然觉得在视图上应用组件,然后在script脚本里操作组件这方特别的麻烦。因为每次使用组件时都要进行应用,不管你用不用你都要引用,就比如以下图片。所以我为了偷懒就开始想直接调用函数去创建组件和使用组件内的方法。创建实例,并对组件传入你想要给他的参数,就相当于父传子参数一样。评论,你的意见是我进步的财富!
vue3函数交互代码封装调用vue2同理
m0_64207574的博客
03-20 3263
vue3函数交互代码封装调用vue2同理
写文章

热门文章

  • distinct多字段去重查询问题 23969
  • Vue修改数据页面不更新的问题解决 13785
  • el-upload手动控制上传多文件校验和文件删除 12090
  • axios控制台爆红问题Uncaught (in promise):xxx解决 10553
  • whistle+switchyOmega配置web代理 7504

分类专栏

  • js 68篇
  • mysql 4篇
  • git 4篇
  • webpack 8篇
  • react 21篇
  • 计算机网络 1篇
  • css 3篇
  • LeetCode 1篇
  • nodejs 9篇
  • elementui 12篇
  • vue 33篇
  • 微信小程序 1篇
  • ts 6篇
  • ant-mobile 2篇
  • cra 1篇
  • vue-test-util 3篇
  • vuex 2篇
  • axios 2篇
  • uniapp 1篇
  • js特效 1篇
  • java 5篇
  • io 4篇
  • java语法 1篇
  • java运算符 1篇
  • 数据库 7篇
  • 网络故障
  • Tomcat 4篇

最新评论

  • el-table组件的固定表头和高度自适应问题

    楚楚梦厦: 感谢,很有用,真强!

  • whistle+switchyOmega配置web代理

    williamyi74: 前人踩坑后人乘凉表情包如果有帮助到你三连一下~

  • whistle+switchyOmega配置web代理

    a42558444: 很棒,看了这个 一下就整明白了

  • vue截图到剪切板(使用html2canvas)

    williamyi74: 那用executeCommand('copy') 这个是所有都兼容

  • vue截图到剪切板(使用html2canvas)

    perfect*: firefix不支持ClipboardItem

最新文章

  • Image.network加载网络图片报错
  • vscode的settings配置
  • js实现两个大数的相加
2024年1篇
2023年32篇
2022年29篇
2021年75篇
2020年9篇
2019年13篇
2018年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家滁州特色玻璃钢雕塑定做价格玻璃钢马车雕塑图片大全深圳人物石氏玻璃钢雕塑大兴玻璃钢卡通雕塑体育运动玻璃钢雕塑中山哪里有玻璃钢雕塑厂无锡小型玻璃钢雕塑厂家直供通辽小品系列玻璃钢雕塑定做甘肃抽象人物玻璃钢雕塑订做高质量玻璃钢雕塑生产厂家深圳卡通人玻璃钢雕塑摆件商场美陈在哪里学习门头沟商场美陈装饰制作河南组合式玻璃钢花盆河南玻璃钢动物雕塑批发玉溪市玻璃钢雕塑设计多少钱玻璃钢消防雕塑贵安新区玻璃钢雕塑定做电话玻璃钢大禹治水雕塑玻璃钢雕塑怎样防治开裂欧式人物玻璃钢雕塑施工哪家好利川玻璃钢雕塑设计方案常用商场美陈生产公司广州开业商场美陈通许玻璃钢雕塑设计商场中庭简单美陈山东玻璃钢雕塑招聘双阳玻璃钢雕塑达超玻璃钢仿铜雕塑金华玻璃钢广场雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化