svelte3自定义弹窗svPopup组件|svelte手机端对话框

2024-02-02 19:20

本文主要是介绍svelte3自定义弹窗svPopup组件|svelte手机端对话框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

sv-popup 基于 svelte.js 开发的多功能移动端alert|dialog|model|toast组件。支持超过20+参数自定义配置及多种弹出动画效果。

基于Svelte3.x手机端弹出层组件(组件式+函数式)

在这里插入图片描述
在lib目录下新建Popup弹窗目录。
在这里插入图片描述
在需要的.svelte页面引入组件。

import Popup, {svPopup} from '$lib/Popup'

引入的 Popup 是组件式写法, svPopup 是函数式写法。

  • 标签式写法
<!-- 询问框 -->
<Popup bind:open={showConfirm} shadeClose="false" title="警告信息" xclose zIndex="2001"content="<div style='color:#00e0a1;padding:20px 40px;'>确认框(这里是确认框提示信息,这里确认框提示信息,这里是确认框提示信息)</div>"btns={[{text: '取消', click: () => showConfirm=false},{text: '确定', style: 'color:#e63d23;', click: handleInfo},]}
/>
  • 函数式写法
function handleInfo(e) {// console.log('通过函数方式调用弹窗...')let el = svPopup({title: '标题',content: `<div style="padding:20px;"><p>函数式调用:<em style="color:#999;">svPopup({...})</em></p></div>`,btns: [{text: '取消',click: () => {// 关闭弹窗el.$set({open: false})}},{text: '确认',style: 'color:#09f;',click: () => {svPopup({type: 'toast',icon: 'loading',content: '加载中...',opacity: .2,time: 2})}},]})
}

在这里插入图片描述
在这里插入图片描述

<!-- 信息框 -->
<Popup bind:open={showInfo} anim="scaleIn" content="信息框(这里演示信息框功能效果,这里演示信息框功能效果,这里演示信息框功能效果)"btns={[{text: '知道了', style: 'color:#999;', click: () => showInfo=false},]}
/><!-- 询问框 -->
<Popup bind:open={showConfirm} shadeClose="false" title="警告信息" xclose zIndex="2001"content="<div style='color:#00e0a1;padding:20px 40px;'>确认框(这里是确认框提示信息,这里确认框提示信息,这里是确认框提示信息)</div>"btns={[{text: '取消', click: () => showConfirm=false},{text: '确定', style: 'color:#e63d23;', click: handleInfo},]}
/>

在这里插入图片描述

<!-- Ios样式 -->
<Popup bind:open={showIos1} type="ios" shadeClose="false" title="标题内容" zIndex="1990"content="弹窗内容,告知当前状态、信息和解决方法,描述文字尽量控制在三行内"btns={[{text: '知道了', click: () => showIos1=false},{text: '确定', style: 'color:#00e0a1;', click: handleInfo},]}
>
</Popup>

svelte自定义弹窗组件

组件支持如下参数配置

<script>// 是否打开弹窗bind:open={showDialog}export let open = false// 弹窗标识符// export let id = 'svpopup-' + Math.random().toString(32)export let id = undefined// 标题export let title = ''// 内容export let content = ''// 弹窗类型export let type = ''// 自定义弹窗样式export let popupStyle = undefined// toast图标export let icon = ''// 是否显示遮罩层export let shade = true// 点击遮罩层是否关闭export let shadeClose = true// 遮罩层透明度export let opacity = ''// 是否显示圆角export let round = false// 是否显示关闭图标export let xclose = false// 关闭图标位置export let xposition = 'right'// 关闭图标颜色export let xcolor = '#333'// 弹窗动画export let anim = 'scaleIn'// 弹窗位置export let position = ''// 长按/右键弹窗export let follow = null// 弹窗自动关闭时间export let time = 0// 弹窗层级export let zIndex = 202203// 弹窗按钮组export let btns = null/* export let btns = [{ text: '取消', style: 'color:#aaa', disabled: true, click: null },{ text: '确定', style: 'color:#f90', click: null }] */// 函数式打开|关闭回调export let onOpen = undefinedexport let onClose = undefined// 接收函数式移除指令export let remove = undefined// ...</script>
/*** @Desc     svelte自定义多功能弹框组件* @Time     andy by 2022/3/15* @About    Q:282310962  wx:xy190310*/
<script>// ...import { onMount, afterUpdate, createEventDispatcher, tick } from 'svelte'const dispatch = createEventDispatcher()let opened = falselet closeCls = undefinedlet toastIcon = {loading: '',success: '',fail: '',}const bool = (boolean) => JSON.parse(boolean) ? true : falseonMount(() => {console.log('监听弹窗开启...')return () => {console.log('监听弹窗关闭...')}})afterUpdate(() => {// console.log('监听弹窗更新...')/* if(opened) {if(!open) {opened = falsedispatch('close')}}else if(open) {opened = truedispatch('open')} */})$: if(open) {show()}else {hide()}/*** 打开弹窗*/async function show() {if(opened) returnopened = truedispatch('open')typeof onOpen == 'function' && onOpen()zIndex = getZIndex() + 1// 倒计时关闭if(time) {index++if(timer[index] != null) clearTimeout(timer[index])timer[index] = setTimeout(() => {hide()}, parseInt(time)*1000)}// 长按|右键菜单if(follow) {// ...}}/*** 关闭弹窗*/function hide() {if(!opened) returncloseCls = truesetTimeout(() => {opened = falsecloseCls = falseopen = false// ...}, 200)}// 点击遮罩层function shadeClicked() {if(bool(shadeClose)) {hide()}}// ...// 临界坐标点function getPos(x, y, ow, oh, winW, winH) {let l = (x + ow) > winW ? x - ow : xlet t = (y + oh) > winH ? y - oh : yreturn [l, t]}
</script><div class="sv__popup" class:opened class:sv__popup-closed={closeCls} id={id} style="z-index: {zIndex}" bind:this={el}>{#if bool(shade)}<div class="vui__overlay" on:click={shadeClicked} style:opacity></div>{/if}<div class="vui__wrap"><div class="vui__wrap-section"><div class="vui__wrap-child {type&&'popupui__'+type} anim-{anim} {position}" class:round style="{popupStyle}">{#if title}<div class="vui__wrap-tit">{@html title}</div>{/if}{#if icon&&type=='toast'}<div class="vui__toast-icon">{@html toastIcon[icon]}</div>{/if}{#if $$slots.content}<div class="vui__wrap-cnt"><slot name="content" /></div>{:else}{#if content}<div class="vui__wrap-cnt">{@html content}</div>{/if}{/if}<slot />{#if btns}<div class="vui__wrap-btns">{#each btns as btn,index}<span class="btn"style="{btn.style}" on:click={e => btnClicked(e, index)}>{@html btn.text}</span>{/each}</div>{/if}{#if xclose}<span class="vui__xclose {xposition}" style="color: {xcolor}" on:click={hide}></span>{/if}</div></div></div>
</div>

通过 new Component 来实现挂载组件到body上。

import Popup from './Popup.svelte'let uuid = function() {return 'svpopup-' + Math.floor(Math.random() * 10000)
}export function svPopup(options = {}) {options.id = uuid()const mountNode = document.createElement('div')document.body.appendChild(mountNode)const app = new Popup({target: mountNode,props: {...options,open: true,// 传入函数移除指令remove() {document.body.removeChild(mountNode)}}})return app
}export default Popup

ok,以上就是svelte开发自定义弹窗组件的一些分享,希望能对大家有些帮助。

这篇关于svelte3自定义弹窗svPopup组件|svelte手机端对话框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671699

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3