vue 开发插件二

2023-10-30

接上一篇《vue 开发插件 一

完善插件交互逻辑

插件讲究高度配置化,弹框提示的插件要始终保持一个,并且要保证上一个弹框已经关闭

处理配置参数

定义一个方法来接受弹框内容和配置进行处理参数,并且有默认的参数,同时判断显示隐藏,
如果只是传入一个字符串,那就是直接作为弹框提示内容

// 记录最后一个弹框
let lastAlert = null;
function alert(config) {
  // 默认的参数 和 组件的属性要同步
  const defaultConfig = {
    title: '',
    useHtml: false,
    button: '确定',
    cusClass: '',
    message: ''
  };
  // 保存最终配置
  let _config = null;
  // 参数处理
  if(typeof config ==='sring'){
    _config = Object.assign(defaultConfig,{message: config});
  }else {
    _config = Object.assign(defaultConfig,config);
  }
  return lastAlert;
}

es6 中 Object.assign 合并两个对象,如果合并的不是对象就会转化为对象;2、源对象的参数如果和合并目标参数重复就覆盖,第一个参数是目标,第二个参数是源对象,可以有很多源对象
展示和关闭的方法用异步处理完成时候的回调,点击按钮关闭用vue的once方法,点击事件将只会触发一次

async function  show(config) {
   return new Promise(resolve =>{
     for(const key of Object.keys(config)){
      $alert[key] = config[key];
     }
     // 组件提供的监听方法,点击确定的时候
     $alert.$once('but-click',()=>{
      // 控制显示隐藏
      $alert.visible = false;
      // 关闭之后的回调
      resolve(undefined);
     })
     $alert.visible = true;
   })
}

Object.keys 返回一个数组

var obj = { foo: 'bar', baz: 42 };
Object.keys(obj)
// ["foo", "baz"]

打开 app.vue 调用插件的入口页面看一下代码:
直接调用

tFn (){
  // 插件可以直接this 调用
   this.$alert();
 }

目前可以正常打开和关闭弹框。在加入内容试试

tFn (){
      // 插件可以直接this 调用
      this.$alert('木子聊前端测试弹框');
    }

发现没有内容弹框。原因是

if(typeof config ==='sring'){

这段代码,预期想判断是否是 字符串类型结果发现写错,结果走到了下一个判断,由于Object.assign 可以吧源对象转化为对象,但是组件没有预定义,参数导致没有办法显示
改一下

if(typeof config ==='string'){

在运行 npm run dev 浏览器打开,弹框正常运行。
为了校验代码的完整性,对照需求依次测试一下,回调方法
点击关闭的时候,在控制台打印,来证明证明回调方法可行

this.$alert('木子聊前端测试弹框').then(()=>{
   console.log('控制台打印。。');
});

依据 返回 Promise 可以用then来回调,npm run dev 运行成功,
看一下自定义div标签,同时添加一个class

this.$alert({useHtml:true,
      message:'<div>我是标签内容</div>',
      cusClass:'testClass' 
     })

npm run dev 看效果

在这里插入图片描述
和预期一样;
完整插件代码:

import Alert  from '../component/alert/index.vue'; // 引入组建
// 保存当前对象流程
let $alert = null;
// 记录最后一个弹框
let lastAlert = null;

function alert(config) {
  // 默认的参数 和 组件的属性要同步
  const defaultConfig = {
    title: '',
    useHtml: false,
    button: '确定',
    cusClass: '',
    message: ''
  };
  // 保存最终配置
  let _config = null;
  // 参数处理
  if(typeof config ==='string'){
    _config = Object.assign(defaultConfig,{ message: config});
  }else {
    _config = Object.assign(defaultConfig,config);
  }
  // 展示弹框
  lastAlert=show(_config);
  return lastAlert;
}
async function  show(config) {
   return new Promise(resolve =>{
     for(const key of Object.keys(config)){
      $alert[key] = config[key];
     }
     // 组件提供的监听方法,点击确定的时候
     $alert.$once('but-click',()=>{
      // 控制显示隐藏
      $alert.visible = false;
      // 关闭之后的回调
      resolve(undefined);
     })
     $alert.visible = true;
   })
}
export default {
  install (Vue,props = { visible: false }){
    const AlertComponent = Vue.extend(Alert); //构造器创建子类
    $alert = new AlertComponent({
      el: document.createElement('div'),
      propsData: {
        ...props
      }
    });
    document.body.appendChild($alert.$el);

    Vue.mixin({
      created() {
        
      },
      methods: {
        $alert(config) {
           return alert(config);
        }
      },
    });
  }
}

如果你喜欢 欢迎关注留言。。谢谢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 开发插件二 的相关文章

  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 标签获取 href 值

    我有以下 html div class threeimages a img alt Australia src Images Services 20button tcm7 9688 gif a div class text h2 a hre
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • FireFox 中的自动滚动

    我的应用程序是实时聊天 我有一个 Div 来包装消息 每条消息都是一个 div 所以 在几条消息之后 我的 DOM 看起来像这样 div div Message number two div div div div
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 简单的 Vue.js 计算属性说明

    我对 Vue js 并不陌生 但我会再次浏览文档 试图找出我第一次错过的任何内容 我在以下地方看到了这个声明使用计算属性的基本示例部分 https v2 vuejs org v2 guide computed html Basic Exam
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 如何将vue组件插入到contenteditable div中

    我想用 vue 创建简单的所见即所得编辑器 我发现只有一个在 vue js 上创建的真正的所见即所得编辑器 这里是 https quasar dev vue components editor 但我没有发现有插入图像的能力 其他 vue w
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐

  • 基于QT的TCP通信实现(TCPServer和TCPClient)

    文章目录 一 软件介绍 1 1 TCPServer服务端界面 1 2 TCPClient客户端界面 1 3 服务端和客户端建立连接并通信演示 二 QT实现TCPServer和TCPClient 2 1 TCPClient客户端 2 1 TC
  • C#中实现神经网络算法打包dll(给Unity调用)

    最近做Unity项目的时候有一个需求 在Unity中实现神经网络算法 最终还要满足跨平台 也就是在windows下和android下都能使用 在Unity中只涉及到网络的实现部分 也就是正向传播部分 网络的训练可以放到matlab和pyth
  • 面试之-redis-01-并发安全问题-lua脚本

    我们正常理解的线程安全问题是指单进程多线程模型内部多个线程操作进程内共享内存导致的数据资源充突 而 Redis 的线程安全问题的产生 并不是来自于 Redis 服务器内部 因为redis是单线程的 本身并没有线程安全问题 Redis 作为数
  • 实例化为子物体

    1 GameObject g Instantiate cube as GameObject g transform parent 你想成为父物体的对象 2 GameObject grassPres GameObject Instantiat
  • 别被官方文档迷惑了!这篇文章帮你详解yarn公平调度

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由 edwinhzhang发表于云 社区专栏 FairScheduler是yarn常用的调度器 但是仅仅参考官方文档 有很多参数和概念文档里没有详细说明 但是这些参明显会影响到集
  • 腾讯云/阿里云通过docker安装git服务

    腾讯云 阿里云通过docker安装git服务 这一次是需要一个文件管理系统把之前写的几个小说和对应的资料放到腾讯云的服务器同步 想到了使用git作为服务器 之后就是确定使用万能的docker了 Gogs 这一次使用的docker包用的是Go
  • pads多层板减少层的三种方法,将PCB由4层改为2层

    现在介绍第三种方法 我们以4层改2层讲解 第一步 打开我们需要修改的文件 选择file export 相信很多朋友遇到过为降低成本把6层板改为4层 或8层改为6层的经历 网上有两种方法更改 1 把不需要的两层上所有东西删掉 然后修改层设置
  • 复试编程训练十一

    101 共用体类型存储方式 include
  • Ubuntu18.0下安装cuda与cudnn,以及解决nvcc -V查看到的cuda与下载版本不一致的问题

    安装cuda与cudnn 查看当前设备和cuda驱动版本 ubuntu drivers devices nvidia smi 注意 高版本的驱动可以向下兼容低版本的cuda 下载cuda 1 查看驱动所能支持的cuda版本 https do
  • Docker创建rabbitMq镜像和容器

    前提条件 docker环境 rabbitmq 1 查找下rabbitmq镜像 访问开放云原生应用 云原生 Cloud Native 云原生介绍 阿里云 页面如下 2 下载镜像 这边用的是阿里的镜像库 docker pull rabbitmq
  • Java8集合之HashMap的hash计算、扩容等问题

    参考资料 Java 8系列之重新认识HashMap 作者为美团技术团队 Java8的HashMap源码分析 JKD版本为1 7 为什么 HashMap 是线程不安全的 为什么Java8中HashMap链表使用红黑树而不是AVL树 JDK1
  • C++实现俄罗斯方块(源码+详解)

    Take me Hand Acoustic C cile Corbel 单曲 网易云音乐 源码Debug工具 1 cppreference com 主 2 必应 bing com 3 GPT 主 4 Google 学习过程中 如果缺少了cp
  • 关于VMware虚拟机创建时磁盘分配过大的解决方法

    写这个文章是因为在虚拟机创建之时给的硬盘空间太大 想压缩一下 到各大论坛搜索相关帖子 发现能解决问题的太少了 所幸最后成功压缩 接下来分享一下我压缩虚拟机硬盘空间的经验 目录 1 首先打开虚拟机右键 此电脑 管理 磁盘管理 2 找到我们要压
  • 腾讯云服务器+ContOS 7.6安装MySql(一)

    腾讯云服务器 ContOS 7 6安装MySql 本地远程登录 近日斥巨资采购了一台腾讯腾讯轻量云服务器 2CPU2G内存5M带宽包月500G的 价格是398一年 买的时候刚好618活动吗 不然还得更贵 这都是题外话 先来看一下买好的服务器
  • MySQL学习笔记(基础篇)

    一 SQL语言的规则与规范 1 SQL大小写规范 建议遵守 MySQL 在 Windows 环境下是大小写不敏感 推荐采用统一的书写规范 数据库名 表名 表别名 字段名 字段别名等都小写 SQL 关键字 函数名 绑定变量等都大写 2 注释
  • spark端口作用配置及修改

    spark端口作用配置及修改 Master节点的web端口是8080 仅在 standalone模式使 配置方式在spark env sh加一行 export SPARK MASTER WEBUI PORT 8080 work节点的web端
  • 汇编指令对应的十六进制表示

    空 nop jmp 32位立即数 jmp a E9 a jmp 内存地址 jmp 0x8d8d3a FF25 0x8d8d3a jmp far 内存地址 jmp far 0x8d8d3a FF2D 0x8d8d3a 直接远跳 jmp 0x8
  • 外键SQL语句的编写

    学习目标 能够写出删除外键约束的SQL语句 1 外键约束作用 外键约束 对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证 数据如果不合法则更新和插入会失败 保证数据的有效性 2 对于已经存在的字段添加外键约束 为cls id字段
  • chatGPT之Python API启用上下文管理

    chatGPT已经爆火一段时间了 我想大多数的开发者都在默默的在开发和测试当中 可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧 为什么别人的机器人能联想之前的语料 而你的却像个每次都只如初见的高冷机器人 我也是参考
  • vue 开发插件二

    接上一篇 vue 开发插件 一 完善插件交互逻辑 插件讲究高度配置化 弹框提示的插件要始终保持一个 并且要保证上一个弹框已经关闭 处理配置参数 定义一个方法来接受弹框内容和配置进行处理参数 并且有默认的参数 同时判断显示隐藏 如果只是传入一