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

相关文章

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element