提交 cfcf773c 编写于 作者: d-u-a's avatar d-u-a

feat: vue3 H5 tabbar 支持 iconfont

上级 08b45f6b
...@@ -284,6 +284,15 @@ declare namespace UniApp { ...@@ -284,6 +284,15 @@ declare namespace UniApp {
redDot?: boolean redDot?: boolean
badge?: string badge?: string
visible?: boolean visible?: boolean
iconfont?: TabBarItemIconfontOptions
}
interface TabBarItemIconfontOptions {
text: string
selectedText: string
fontSize?: string
color?: string
selectedColor?: string
} }
interface TabBarNormalItemOptions extends TabBarItemBaseOptions { interface TabBarNormalItemOptions extends TabBarItemBaseOptions {
...@@ -307,6 +316,7 @@ declare namespace UniApp { ...@@ -307,6 +316,7 @@ declare namespace UniApp {
selectedColor: string selectedColor: string
backgroundColor: string backgroundColor: string
borderStyle?: 'black' | 'white' borderStyle?: 'black' | 'white'
iconfontSrc?: string
list: TabBarItemOptions[] list: TabBarItemOptions[]
blurEffect?: 'none' | 'dark' | 'extralight' | 'light' blurEffect?: 'none' | 'dark' | 'extralight' | 'light'
fontSize?: string fontSize?: string
......
import { watch, watchEffect, computed, ref, Ref } from 'vue' import { watch, watchEffect, computed, ref, Ref, onMounted } from 'vue'
import { RouteLocationNormalizedLoaded, useRoute } from 'vue-router' import { RouteLocationNormalizedLoaded, useRoute } from 'vue-router'
import { invokeHook, updatePageCssVar } from '@dcloudio/uni-core' import { invokeHook, updatePageCssVar } from '@dcloudio/uni-core'
import { import {
...@@ -10,8 +10,11 @@ import { defineSystemComponent } from '@dcloudio/uni-components' ...@@ -10,8 +10,11 @@ import { defineSystemComponent } from '@dcloudio/uni-components'
import { getRealPath } from '../../../platform' import { getRealPath } from '../../../platform'
import { useTabBar } from '../../setup/state' import { useTabBar } from '../../setup/state'
import { cssBackdropFilter } from '../../../service/api/base/canIUse' import { cssBackdropFilter } from '../../../service/api/base/canIUse'
import { loadFontFace } from '../../../service/api/ui/loadFontFace'
import { normalizeWindowBottom } from '../../../helpers/cssVar' import { normalizeWindowBottom } from '../../../helpers/cssVar'
const UNI_TABBAR_ICON_FONT = 'UniTabbarIconFont'
export default /*#__PURE__*/ defineSystemComponent({ export default /*#__PURE__*/ defineSystemComponent({
name: 'TabBar', name: 'TabBar',
setup() { setup() {
...@@ -21,6 +24,16 @@ export default /*#__PURE__*/ defineSystemComponent({ ...@@ -21,6 +24,16 @@ export default /*#__PURE__*/ defineSystemComponent({
useTabBarCssVar(tabBar) useTabBarCssVar(tabBar)
const onSwitchTab = useSwitchTab(useRoute(), tabBar, visibleList) const onSwitchTab = useSwitchTab(useRoute(), tabBar, visibleList)
const { style, borderStyle, placeholderStyle } = useTabBarStyle(tabBar) const { style, borderStyle, placeholderStyle } = useTabBarStyle(tabBar)
onMounted(() => {
if (tabBar.iconfontSrc) {
loadFontFace({
family: UNI_TABBAR_ICON_FONT,
source: `url("${tabBar.iconfontSrc}")`,
})
}
})
return () => { return () => {
const tabBarItemsTsx = createTabBarItemsTsx( const tabBarItemsTsx = createTabBarItemsTsx(
tabBar, tabBar,
...@@ -183,10 +196,22 @@ function createTabBarItemsTsx( ...@@ -183,10 +196,22 @@ function createTabBarItemsTsx(
const textColor = selected ? selectedColor : color const textColor = selected ? selectedColor : color
const iconPath = const iconPath =
(selected ? item.selectedIconPath || item.iconPath : item.iconPath) || '' (selected ? item.selectedIconPath || item.iconPath : item.iconPath) || ''
const iconfontText = item.iconfont
? selected
? item.iconfont.selectedText || item.iconfont.text
: item.iconfont.text
: undefined
const iconfontColor = item.iconfont
? selected
? item.iconfont.selectedColor || item.iconfont.color
: item.iconfont.color
: undefined
if (!__UNI_FEATURE_TABBAR_MIDBUTTON__) { if (!__UNI_FEATURE_TABBAR_MIDBUTTON__) {
return createTabBarItemTsx( return createTabBarItemTsx(
textColor, textColor,
iconPath, iconPath,
iconfontText,
iconfontColor,
item, item,
tabBar, tabBar,
index, index,
...@@ -197,6 +222,8 @@ function createTabBarItemsTsx( ...@@ -197,6 +222,8 @@ function createTabBarItemsTsx(
? createTabBarMidButtonTsx( ? createTabBarMidButtonTsx(
textColor, textColor,
iconPath, iconPath,
iconfontText,
iconfontColor,
item, item,
tabBar, tabBar,
index, index,
...@@ -205,6 +232,8 @@ function createTabBarItemsTsx( ...@@ -205,6 +232,8 @@ function createTabBarItemsTsx(
: createTabBarItemTsx( : createTabBarItemTsx(
textColor, textColor,
iconPath, iconPath,
iconfontText,
iconfontColor,
item, item,
tabBar, tabBar,
index, index,
...@@ -216,6 +245,8 @@ function createTabBarItemsTsx( ...@@ -216,6 +245,8 @@ function createTabBarItemsTsx(
function createTabBarItemTsx( function createTabBarItemTsx(
color: string, color: string,
iconPath: string, iconPath: string,
iconfontText: string | undefined,
iconfontColor: string | undefined,
tabBarItem: UniApp.TabBarItemOptions, tabBarItem: UniApp.TabBarItemOptions,
tabBar: UniApp.TabBarOptions, tabBar: UniApp.TabBarOptions,
index: number, index: number,
...@@ -227,7 +258,14 @@ function createTabBarItemTsx( ...@@ -227,7 +258,14 @@ function createTabBarItemTsx(
class="uni-tabbar__item" class="uni-tabbar__item"
onClick={onSwitchTab(tabBarItem, index)} onClick={onSwitchTab(tabBarItem, index)}
> >
{createTabBarItemBdTsx(color, iconPath || '', tabBarItem, tabBar)} {createTabBarItemBdTsx(
color,
iconPath || '',
iconfontText,
iconfontColor,
tabBarItem,
tabBar
)}
</div> </div>
) )
} }
...@@ -235,13 +273,22 @@ function createTabBarItemTsx( ...@@ -235,13 +273,22 @@ function createTabBarItemTsx(
function createTabBarItemBdTsx( function createTabBarItemBdTsx(
color: string, color: string,
iconPath: string, iconPath: string,
iconfontText: string | undefined,
iconfontColor: string | undefined,
tabBarItem: UniApp.TabBarItemOptions, tabBarItem: UniApp.TabBarItemOptions,
tabBar: UniApp.TabBarOptions tabBar: UniApp.TabBarOptions
) { ) {
const { height } = tabBar const { height } = tabBar
return ( return (
<div class="uni-tabbar__bd" style={{ height: height }}> <div class="uni-tabbar__bd" style={{ height: height }}>
{iconPath && createTabBarItemIconTsx(iconPath, tabBarItem, tabBar)} {iconfontText
? createTabBarItemIconfontTsx(
iconfontText,
iconfontColor || BLUR_EFFECT_COLOR_DARK,
tabBarItem,
tabBar
)
: iconPath && createTabBarItemIconTsx(iconPath, tabBarItem, tabBar)}
{tabBarItem.text && createTabBarItemTextTsx(color, tabBarItem, tabBar)} {tabBarItem.text && createTabBarItemTextTsx(color, tabBarItem, tabBar)}
</div> </div>
) )
...@@ -264,6 +311,32 @@ function createTabBarItemIconTsx( ...@@ -264,6 +311,32 @@ function createTabBarItemIconTsx(
) )
} }
function createTabBarItemIconfontTsx(
iconfontText: string,
iconfontColor: string,
tabBarItem: UniApp.TabBarItemOptions,
tabBar: UniApp.TabBarOptions
) {
const { type, text, redDot } = tabBarItem
const { iconWidth } = tabBar
const clazz = 'uni-tabbar__icon' + (text ? ' uni-tabbar__icon__diff' : '')
const style = { width: iconWidth, height: iconWidth }
const iconfontStyle = {
fontSize: tabBarItem.iconfont?.fontSize || iconWidth,
color: iconfontColor,
}
return (
<div class={clazz} style={style}>
{type !== 'midButton' && (
<div class="uni-tabbar__iconfont" style={iconfontStyle}>
{iconfontText}
</div>
)}
{redDot && createTabBarItemRedDotTsx(tabBarItem.badge)}
</div>
)
}
function createTabBarItemTextTsx( function createTabBarItemTextTsx(
color: string, color: string,
tabBarItem: UniApp.TabBarItemOptions, tabBarItem: UniApp.TabBarItemOptions,
...@@ -293,6 +366,8 @@ function createTabBarItemRedDotTsx(badge?: string) { ...@@ -293,6 +366,8 @@ function createTabBarItemRedDotTsx(badge?: string) {
function createTabBarMidButtonTsx( function createTabBarMidButtonTsx(
color: string, color: string,
iconPath: string, iconPath: string,
iconfontText: string | undefined,
iconfontColor: string | undefined,
midButton: UniApp.TabBarMidButtonOptions, midButton: UniApp.TabBarMidButtonOptions,
tabBar: UniApp.TabBarOptions, tabBar: UniApp.TabBarOptions,
index: number, index: number,
...@@ -323,7 +398,14 @@ function createTabBarMidButtonTsx( ...@@ -323,7 +398,14 @@ function createTabBarMidButtonTsx(
/> />
)} )}
</div> </div>
{createTabBarItemBdTsx(color, iconPath, midButton, tabBar)} {createTabBarItemBdTsx(
color,
iconPath,
iconfontText,
iconfontColor,
midButton,
tabBar
)}
</div> </div>
) )
} }
...@@ -36,7 +36,13 @@ import { getRouteOptions } from '@dcloudio/uni-core' ...@@ -36,7 +36,13 @@ import { getRouteOptions } from '@dcloudio/uni-core'
import { addLeadingSlash } from '@dcloudio/uni-shared' import { addLeadingSlash } from '@dcloudio/uni-shared'
import { useTabBar } from '../../../framework/setup/state' import { useTabBar } from '../../../framework/setup/state'
const setTabBarItemProps = ['text', 'iconPath', 'selectedIconPath', 'visible'] const setTabBarItemProps = [
'text',
'iconPath',
'iconfont',
'selectedIconPath',
'visible',
]
const setTabBarStyleProps = [ const setTabBarStyleProps = [
'color', 'color',
'selectedColor', 'selectedColor',
......
...@@ -83,6 +83,10 @@ uni-tabbar { ...@@ -83,6 +83,10 @@ uni-tabbar {
height: 100%; height: 100%;
} }
.uni-tabbar__iconfont {
font-family: 'UniTabbarIconFont';
}
.uni-tabbar__label { .uni-tabbar__label {
position: relative; position: relative;
text-align: center; text-align: center;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册