svelte-popup|svelte-popup 基于svelte.js移动端弹窗组件
前两天有给大家分享一个 svelte自定义Tabbar+Navbar组件。
今天给大家带来的是最新开发的svelte自定义手机端模态框组件SveltePopup。
如下图:在lib目录下新建一个Popup组件目录。
文章图片
引入svelte-popup组件
弹窗组件支持组件式(Popup
)+函数式(svPopup
)两种调用方式。
import Popup, {svPopup} from '$lib/Popup'
- 组件式调用
isShowDialog=false},
]}
on:open={handleOpen}
on:close={handleClose}
>
自定义slot插槽显示内容
- 函数式调用
let el = svPopup({
title: '标题信息',
content: '展示内容信息
',
xclose: true,
shadeClose: false,
btns: [
{text: '取消', click: () => { el.$set({open: false}) }},
{text: '确认', style: 'color:#f90;
', click: () => handleOK},
],
onOpen: () => {},
onClose: () => {}
})
一些简单的弹窗效果通过函数调用更加方便,对于一些功能丰富的弹窗展示,可以使用组件式slot自定义插槽方式展示。
文章图片
文章图片
文章图片
文章图片
showConfirm=false},
{text: '确定', style: 'color:#e63d23;
', click: handleInfo},
]}
/> null},
{text: '取消', style: 'color:#a9a9a9;
', click: () => showFooter=false},
]}
/> null},
{text: '取消', click: () => showActionSheet=false},
]}
/> showActionPicker=false},
{text: '确定', style: 'color:#00e0a1;
', click: () => null},
]}
>
- 双肩包
- 鞋子
- 运动裤
还支持函数式 多层混合 方式调用。
function handleInfo(e) {
console.log(e)
console.log('通过函数方式调用弹窗...')let el = svPopup({
title: '标题',
content: `函数式调用:svPopup({...})
`,
btns: [
{
text: '取消',
click: () => {
// 关闭弹窗
el.$set({open: false})
}
},
{
text: '确认',
style: 'color:#09f;
',
click: () => {
svPopup({
type: 'toast',
icon: 'loading',
content: '加载中...',
opacity: .2,
time: 2
})
}
},
]
})
}
文章图片
同样也支持组件式和函数式混合调用。
svelte-popup参数配置
支持如下 20+ 参数混合调用。
弹窗模板及js处理部分。
{#if bool(shade)}{/if}{#if title}{@html title}{/if}
{#if icon&&type=='toast'}{@html toastIcon[icon]}{/if}
{#if $$slots.content}{:else}
{#if content}{@html content}{/if}
{/if}{#if btns}{#each btns as btn,index}
btnClicked(e, index)}>{@html btn.text}
{/each}{/if}
{#if xclose}{/if}/**
* @Descsvelte自定义移动端弹窗组件
* @Timeandy by 2022/3/15
* @AboutQ:282310962wx:xy190310
*/
一开始开发的时候只支持组件式调用。想着如果能支持函数式调用(插入组件至body,关闭即移除)就好了。
后来在svelte官网发现
new Component
可以传入 props
参数,试了下,发现果然可以实现这种效果。const component = new Component(options)
如下是官网给的例子
https://svelte.dev/docs#run-t...
import App from './App.svelte';
const app = new App({
target: document.body,
props: {
// assuming App.svelte contains something like
// `export let answer`:
answer: 42
}
});
于是新建一个popup.js。
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
通过如上方式就完美解决了导出 组件式+函数式 的调用方式了。
【svelte-popup|svelte-popup 基于svelte.js移动端弹窗组件】通过一系列的学习,发现svelte还是挺不错的,尤其编译运行够快,体积够小。不过唯一有点遗憾的是还没有找到类似vue全局引入组件的方法。
推荐阅读
- 深度学习|基于Pytorch的神经网络之Optimizer
- python-opencv图像分割步骤_基于Python-OpenCV的图像分割目标位置检测
- javascript|基于jquery扩展漂亮的单选按钮——RadioButton
- Java|SpringBoot入门项目-基于JPA的App日记后台系统之数据库的创建与JPA的CRUD(二)
- unity|Unity编辑器扩展(基于ScriptableWizard批量为预设添加继承于MonoBehaviour的脚本)
- 如何基于|如何基于 OpenKruise 打破原生 Kubernetes 中的容器运行时操作局限()
- Java(基于AOP的动态数据源切换(附源码))
- Vue.js入门到精通|基于Vue Computed Watch Filter知识点小案例(购物车)
- Vue.js入门到精通|最常见的需求基于Vue的批量删除你会嘛
- 笔记|STM32使用W25QXX flash闪存芯片基于串口自由写入或读取数据