Skip to content

Commit afb1f9f

Browse files
committed
feat: update patch
1 parent 1a854ef commit afb1f9f

File tree

9 files changed

+101
-398
lines changed

9 files changed

+101
-398
lines changed

.npmrc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
# npm config ls -l
55

66
# It helps to use the same node.js version always
7-
lts/fermium
8-
https://registry.npmmirror.com/
9-
# registry = https://registry.npmjs.org/
7+
# lts/fermium
8+
# https://registry.npmmirror.com/
9+
registry = https://registry.npmjs.org/
1010
# registry = https://registry.npmmirror.com/
1111
# registry = https://r.cnpmjs.org/
12-
sentrycli_cdnurl=https://npm.taobao.org/mirrors/sentry-cli/
12+
# sentrycli_cdnurl=https://npm.taobao.org/mirrors/sentry-cli/
1313

1414
engine-strict=true
1515
# tag-version-prefix=""

src/components/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export { default as MouseTrail } from './stateless/MouseTrail'
8888
export { default as MultiColorBorder } from './stateless/MultiColorBorder'
8989
export { default as MultiDirectionSlide } from './stateless/MultiDirectionSlide'
9090
export { default as MusicPlayer } from './stateless/MusicPlayer'
91-
export { default as NavigationTabs } from './stateless/NavigationTabs'
91+
// export { default as NavigationTabs } from './stateless/NavigationTabs'
9292
export { default as NoMatch } from './stateless/NoMatch'
9393
export { default as NotificationDrawer } from './stateless/NotificationDrawer'
9494
export { default as NumberFlowFix } from './stateless/NumberFlowFix'
@@ -110,7 +110,6 @@ export { default as ScriptView } from './stateless/ScriptView'
110110
export { default as ScrollAnimation } from './stateless/ScrollAnimation'
111111
export { default as ScrollToTop } from './stateless/ScrollToTop'
112112
export { default as ScrollVelocity } from './stateless/ScrollVelocity'
113-
export { default as SearchForm } from './stateless/SearchForm'
114113
export { default as SettingDrawer } from './stateless/SettingDrawer'
115114
export { default as ShiCode } from './stateless/ShiCode'
116115
export { default as ShiftingCard } from './stateless/ShiftingCard'

src/components/stateless/NavigationTabs/index.tsx

Lines changed: 70 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,109 @@
1-
import React, { useState } from 'react'
1+
import React, { useState, useMemo } from 'react'
22
import styles from './index.module.less'
33

4-
// 模拟组件数据
5-
const mockComponents = {
6-
'0': () => <div className={styles.mockContent}>首页内容</div>,
7-
'1': () => <div className={styles.mockContent}>产品介绍内容</div>,
8-
'2': () => <div className={styles.mockContent}>关于我们内容</div>,
9-
'3-0': () => <div className={styles.mockContent}>服务概览内容</div>,
10-
'3-1': () => <div className={styles.mockContent}>技术支持内容</div>,
11-
'3-2': () => <div className={styles.mockContent}>售后服务内容</div>,
12-
'4': () => <div className={styles.mockContent}>联系我们内容</div>,
4+
export interface TabItem {
5+
label: string
6+
key?: string | number
7+
content?: React.ReactNode
8+
children?: TabItem[]
139
}
1410

15-
const NavigationTabs: React.FC = () => {
16-
const [activeIndex, setActiveIndex] = useState<number>(0)
17-
const [subActiveIndex, setSubActiveIndex] = useState<string>('')
11+
export interface NavigationTabsProps {
12+
items?: TabItem[]
13+
className?: string
14+
style?: React.CSSProperties
15+
}
1816

19-
// 导航数据
20-
const navItems = [
21-
{ label: '首页' },
22-
{ label: '产品' },
23-
{ label: '关于' },
24-
{
25-
label: '服务',
26-
children: [{ label: '概览' }, { label: '技术支持' }, { label: '售后' }],
27-
},
28-
{ label: '联系' },
29-
]
17+
// 默认模拟数据,用于演示组件功能
18+
const defaultItems: TabItem[] = [
19+
{
20+
label: '首页',
21+
content: <div className={styles.mockContent}>首页内容</div>,
22+
},
23+
{
24+
label: '产品',
25+
content: <div className={styles.mockContent}>产品介绍内容</div>,
26+
},
27+
{
28+
label: '关于',
29+
content: <div className={styles.mockContent}>关于我们内容</div>,
30+
},
31+
{
32+
label: '服务',
33+
children: [
34+
{ label: '概览', content: <div className={styles.mockContent}>服务概览内容</div> },
35+
{ label: '技术支持', content: <div className={styles.mockContent}>技术支持内容</div> },
36+
{ label: '售后', content: <div className={styles.mockContent}>售后服务内容</div> },
37+
],
38+
},
39+
{
40+
label: '联系',
41+
content: <div className={styles.mockContent}>联系我们内容</div>,
42+
},
43+
]
44+
45+
const NavigationTabs: React.FC<NavigationTabsProps> = ({ items = defaultItems, className, style }) => {
46+
const [activeIndex, setActiveIndex] = useState<number>(0)
47+
const [subActiveIndex, setSubActiveIndex] = useState<number>(0)
3048

31-
// 处理一级导航点击
3249
const handleTabClick = (index: number) => {
3350
setActiveIndex(index)
34-
const item = navItems[index]
35-
36-
// 如果有子项,默认选中第一个子项
37-
if (item.children && item.children.length > 0) {
38-
setSubActiveIndex(`${index}-0`)
39-
} else {
40-
setSubActiveIndex('')
41-
}
51+
setSubActiveIndex(0) // 切换一级导航时,重置二级导航选中项
4252
}
4353

44-
// 处理二级导航点击
45-
const handleSubTabClick = (parentIndex: number, subIndex: number) => {
46-
setSubActiveIndex(`${parentIndex}-${subIndex}`)
54+
const handleSubTabClick = (index: number) => {
55+
setSubActiveIndex(index)
4756
}
4857

49-
// 获取当前要渲染的组件
50-
const getCurrentComponent = () => {
51-
const key = subActiveIndex || activeIndex.toString()
52-
const Component = mockComponents[key as keyof typeof mockComponents]
53-
return Component ? <Component /> : <div className={styles.mockContent}>默认内容</div>
54-
}
58+
const activeItem = items[activeIndex]
59+
const subItems = activeItem?.children || []
60+
const hasChildren = subItems.length > 0
61+
62+
// 获取当前显示的内容
63+
const currentContent = useMemo(() => {
64+
if (hasChildren) {
65+
return subItems[subActiveIndex]?.content || null
66+
}
67+
return activeItem?.content || null
68+
}, [activeItem, hasChildren, subItems, subActiveIndex])
5569

5670
return (
57-
<div className={styles.container}>
71+
<div className={`${styles.container} ${className || ''}`} style={style}>
5872
{/* 一级导航 */}
5973
<div className={styles.tabsContainer}>
6074
<div className={styles.tabsList}>
61-
{navItems.map((item, index) => {
75+
{items.map((item, index) => {
6276
const isActive = activeIndex === index
63-
const hasChildren = item.children && item.children.length > 0
64-
const isActiveWithChildren = isActive && hasChildren
77+
const itemHasChildren = item.children && item.children.length > 0
6578

6679
return (
6780
<div
6881
key={index}
6982
className={`${styles.tabItem} ${
70-
isActiveWithChildren ? styles.hasArrow : isActive ? styles.actived : ''
83+
itemHasChildren && isActive ? styles.hasArrow : isActive ? styles.actived : ''
7184
}`}
7285
onClick={() => handleTabClick(index)}
7386
>
7487
<span>{item.label}</span>
75-
{hasChildren && <span className={`${styles.arrow} ${isActive ? styles.arrowDown : ''}`}></span>}
88+
{itemHasChildren && <span className={`${styles.arrow} ${isActive ? styles.arrowDown : ''}`}></span>}
7689
</div>
7790
)
7891
})}
7992
</div>
8093

8194
{/* 二级导航 */}
82-
{navItems[activeIndex]?.children && (
95+
{hasChildren && (
8396
<div className={styles.subTabsList}>
84-
{navItems[activeIndex].children!.map((subItem, subIndex) => {
85-
const isSubActive = subActiveIndex === `${activeIndex}-${subIndex}`
86-
97+
{subItems.map((subItem, index) => {
98+
const isSubActive = subActiveIndex === index
8799
return (
88100
<div
89-
key={subIndex}
101+
key={index}
90102
className={`${styles.subTabItem} ${isSubActive ? styles.presented : ''}`}
91-
onClick={() => handleSubTabClick(activeIndex, subIndex)}
103+
onClick={(e) => {
104+
e.stopPropagation()
105+
handleSubTabClick(index)
106+
}}
92107
>
93108
{subItem.label}
94109
</div>
@@ -99,7 +114,7 @@ const NavigationTabs: React.FC = () => {
99114
</div>
100115

101116
{/* 内容区域 */}
102-
<div className={styles.contentArea}>{getCurrentComponent()}</div>
117+
<div className={styles.contentArea}>{currentContent || <div className={styles.mockContent}>暂无内容</div>}</div>
103118
</div>
104119
)
105120
}

0 commit comments

Comments
 (0)