共计 3978 个字符,预计需要花费 10 分钟才能阅读完成。
最近始终在学习 Svelte 常识。目前版本曾经到 svelte3.x 了。
明天给大家分享两个罕用的自定义组件 Navbar+Tabbar。
svelte 官网:https://svelte.dev/
在公共 lib 目录下新建 Headerbar 及 Tabbar 组件。
引入组件
import HeaderBar from '$lib/HeaderBar.svelte';
import TabBar from '$lib/TabBar.svelte';
Svelte 自定义导航条 Navbar
<!-- // 自定义 HeaderBar 组件 -->
<script>
// 是否显示回退按钮
export let back = true
// 题目
export let title = ''
// 色彩
export let color = '#fff'
// 背景色
export let bgcolor = '#22d59c'
// 是否居中题目
export let center = false
// 是否固定
export let fixed = false
// 是否镂空通明
export let transparent = false
// 层级
export let zIndex = 2021
function goBack() {console.log('go back')
history.go(-1)
// history.back(-1)
}
</script>
<div class="header-bar" class:transparent class:fixed={transparent||fixed}>
<div class="header-bar__wrap flexbox flex-alignc" style:color style:background={bgcolor} style:z-index={zIndex}>
<!-- // 返回 -->
{#if back && back != 'false'}
<div class="action hdbar-action__left" on:click={goBack}>
<slot name="backIco" /><slot name="backText" />
</div>
{/if}
<!-- // 题目 -->
<div class="hdbar-title" class:center>
{#if $$slots.title}
<slot name="title" />
{:else}
{@html title}
{/if}
</div>
<!-- // 搜寻框 -->
<div class="action hdbar-action__search">
<slot name="search" />
</div>
<!-- // 右侧 -->
<div class="action hdbar-action__right">
<slot name="right" />
</div>
</div>
</div>
如上图 :导航条反对 自定义背景 (渐变色)、文字色彩、题目居中、搜寻框、沉迷式悬浮、是否固定及层叠
等性能。
还反对 自定义插槽
丰盛组件性能,实现一些地址抉择、圆点提醒、图片等性能。
通过如下形式疾速调用组件。
<HeaderBar bgcolor="#607d8b" color="#fff" title="Svelte 自定义导航" center zIndex="6666">
<HeaderBar back="true" bgcolor="linear-gradient(to right, #4978ff, #17f532)" color="#e4ff00">
<svelte:fragment slot="backIco"><i class="iconfont icon-close"></i></svelte:fragment>
<svelte:fragment slot="search">
<div class="flex-c flex1">
<input class="ipt flex1" placeholder="Search..." value="搜寻关键字..." />
</div>
</svelte:fragment>
<svelte:fragment slot="right">
<div class="ml-20"><i class="iconfont icon-shoucang"></i></div>
<div class="ml-20"><i class="iconfont icon-female"></i></div>
<!-- <div class="ml-20"><img src="img/logo.png" height="12" /></div> -->
</svelte:fragment>
</HeaderBar>
Svelte 自定义菜单栏 Tabbar
/**
* @Desc Svelte 自定义 Tabbar 组件
* @Time andy by 2022/3/12
* @About Q:282310962 wx:xy190310
*/
<script>
// tab 默认索引
export let current = 0
// 文字色彩
export let color = '#999'
// 背景色
export let bgcolor = '#fff'
// 激活色彩
export let activeColor = '#ff3e00'
// 是否固定
export let fixed = false
// tab 选项
export let tabs = [
{
path: '/',
icon: 'icon-face',
title: '音讯',
badge: 18,
},
{
path: '/contact',
// icon: 'icon-choose',
img: 'https://img.yzcdn.cn/vant/user-inactive.png',
activeImg: 'https://img.yzcdn.cn/vant/user-active.png',
title: '联系人',
},
{
path: '/me',
icon: 'icon-female',
title: '我',
dot: true,
}
]
import {page} from '$app/stores'
import {goto} from '$app/navigation'
import {onMount, createEventDispatcher} from 'svelte'
const dispatch = createEventDispatcher()
$: currentTabIndex = current
onMount(() => {console.log('路由:', $page)
console.log('路由地址:', $page.url)
const curPath = $page.url.pathname
tabs.map((item, index) => {if(item.path == curPath) {currentTabIndex = index}
})
})
function changeTabs(index, item) {
currentTabIndex = index
dispatch('click', index)
if(item.path) {goto(item.path)
}
}
</script>
<div class="tab-bar" class:fixed>
<div class="tab-bar__wrap flexbox flex-alignc" style="background: {bgcolor}">
{#each tabs as item,i}
<div class="navigator" class:on={currentTabIndex==i} on:click={changeTabs(i, item)}>
<div class="ico" class:dock={item.dock}>
{#if item.dock}<i class="dock-bg" style:background={item.dockBg ? item.dockBg : activeColor}></i>{/if}
{#if item.icon}<i class={'iconfont'+item.icon} style:color={currentTabIndex == i && !item.dock ? activeColor : color} style:font-size={item.iconSize}></i>{/if}
{#if item.img}<img class="iconimg" src={currentTabIndex == i && !item.dock ? item.activeImg : item.img} style:font-size={item.iconSize} />{/if}
{#if item.badge}<em class="vui__badge">{@html item.badge}</em>{/if}
{#if item.dot}<em class="vui__badge-dot"></em>{/if}
</div>
<div class="txt" style:color={currentTabIndex == i ? activeColor : color}>{@html item.title}</div>
</div>
{/each}
</div>
</div>
Tabbar.svelte 反对 自定义背景(突变背景)、文字色彩 | 选中色彩、是否固定、两头按钮 dock 凸起
等性能。
须要留神的是,svelte 子组件向父组件传递事件须要引入事件触发器。
import {createEventDispatcher} from 'svelte'
const dispatch = createEventDispatcher()
dispatch('click', 999)
一顿操作下来,发现 svelte 开发组件的确比 vue 精简了不少。不过遗憾的是,目前还没有找到全局引入组件的办法。如果大家有一些比拟好的办法,欢送留言交换。
正文完