1
- import React , { useEffect , useState , useRef , useCallback , useMemo } from 'react' ;
1
+ import React , { useEffect , useState , useRef , useCallback } from 'react' ;
2
2
import { IProps , HTMLDivProps } from '@uiw/utils' ;
3
3
import Pane from './Pane' ;
4
- import './style/index.less' ;
5
4
import Popover from '@uiw/react-popover' ;
6
-
5
+ import * as Styled from './style' ;
7
6
export * from './Pane' ;
8
7
9
8
Tabs . Pane = Pane ;
10
9
11
10
let labelWidth : number = 0 ;
12
11
export interface TabsProps extends IProps , HTMLDivProps {
13
- prefixCls ?: string ;
14
12
activeKey ?: string ;
15
13
type ?: 'default' | 'line' | 'card' ;
16
14
children ?: React . ReactNode ;
@@ -26,20 +24,11 @@ type FlowNavType = {
26
24
} ;
27
25
28
26
export default function Tabs ( props : TabsProps ) {
29
- const {
30
- prefixCls = 'w-tabs' ,
31
- className,
32
- children,
33
- type = 'default' ,
34
- activeKey : _ ,
35
- onTabClick,
36
- ...elementProps
37
- } = props ;
27
+ const { className, children, type = 'default' , activeKey : _ , onTabClick, ...elementProps } = props ;
38
28
39
29
const [ activeKey , setActiveKey ] = useState ( props . activeKey ) ;
40
30
const [ slideStyle , setSlideStyle ] = useState ( { width : 0 , left : 0 } ) ;
41
31
const activeItem = useRef < HTMLDivElement | undefined > ( ) ;
42
- const cls = [ prefixCls , className , type ? `${ prefixCls } -${ type } ` : null ] . filter ( Boolean ) . join ( ' ' ) . trim ( ) ;
43
32
44
33
const [ flowNav , flowNavSet ] = useState < FlowNavType > ( {
45
34
content : 0 ,
@@ -52,7 +41,7 @@ export default function Tabs(props: TabsProps) {
52
41
const deviation = 15 ;
53
42
54
43
const [ nodes , nodesSet ] = useState < any > ( ) ;
55
- const divContentRef = useCallback ( ( node ) => {
44
+ const divContentRef = useCallback ( ( node : HTMLDivElement | null ) => {
56
45
if ( node !== null ) {
57
46
nodesSet ( nodes ) ;
58
47
node . addEventListener ( 'scroll' , ( e : any ) => {
@@ -66,7 +55,7 @@ export default function Tabs(props: TabsProps) {
66
55
}
67
56
} , [ ] ) ;
68
57
69
- const divNavRef = useCallback ( ( node , key : number , itemKey : React . Key | null ) => {
58
+ const divNavRef = useCallback ( ( node : HTMLDivElement | null , key : number , itemKey : React . Key | null ) => {
70
59
if ( node !== null ) {
71
60
node . addEventListener ( 'click' , ( e : any ) => {
72
61
activeItem . current = node ;
@@ -117,40 +106,40 @@ export default function Tabs(props: TabsProps) {
117
106
}
118
107
119
108
return (
120
- < div className = { cls } { ...elementProps } >
121
- < div style = { { display : 'flex' } } >
122
- < div style = { { overflow : 'hidden' } } >
123
- < div className = { ` ${ prefixCls } -bar` } ref = { divContentRef } >
124
- < div className = { ` ${ prefixCls } -nav` } style = { { width : 'max-content' } } >
109
+ < Styled . TabsWarp className = { className } { ...elementProps } >
110
+ < Styled . TabsDivFlex >
111
+ < Styled . TabsDivHidden >
112
+ < Styled . TabsDivBar ref = { divContentRef } >
113
+ < Styled . TabsDivNav >
125
114
{ renderNav ( children ) }
126
- < div style = { slideStyle } className = { ` ${ prefixCls } -slide` } />
127
- </ div >
128
- </ div >
129
- </ div >
115
+ < Styled . TabsDivSlide style = { slideStyle } />
116
+ </ Styled . TabsDivNav >
117
+ </ Styled . TabsDivBar >
118
+ </ Styled . TabsDivHidden >
130
119
{ hiddenNav . length > 0 && (
131
120
< Popover
132
121
trigger = "click"
133
122
placement = "bottomRight"
134
123
visibleArrow = { false }
135
124
content = {
136
- < div className = { ` ${ prefixCls } -nav-hidden` } >
125
+ < Styled . TabsNavHidden >
137
126
{ renderNav ( hiddenNav . map ( ( idx ) => ( children as Array < React . ReactElement > ) [ idx ] ) ) }
138
- </ div >
127
+ </ Styled . TabsNavHidden >
139
128
}
140
129
>
141
- < div onClick = { showHideenNav } className = { ` ${ prefixCls } -flow-content` } >
130
+ < Styled . TabsFlowContent onClick = { showHideenNav } >
142
131
< span > …</ span >
143
- </ div >
132
+ </ Styled . TabsFlowContent >
144
133
</ Popover >
145
134
) }
146
- </ div >
135
+ </ Styled . TabsDivFlex >
147
136
{ React . Children . map ( children , ( item : any ) => {
148
137
if ( ! item || activeKey !== item . key ) {
149
138
return null ;
150
139
}
151
140
return React . cloneElement ( item , Object . assign ( { } , item . props , { } ) ) ;
152
141
} ) }
153
- </ div >
142
+ </ Styled . TabsWarp >
154
143
) ;
155
144
156
145
function renderNav ( children : React . ReactNode ) : React . ReactNode {
@@ -159,14 +148,6 @@ export default function Tabs(props: TabsProps) {
159
148
return null ;
160
149
}
161
150
const divProps : HTMLDivProps = {
162
- className : [
163
- `${ prefixCls } -item` ,
164
- item . key === activeKey ? 'active' : null ,
165
- item . props . disabled ? 'disabled' : null ,
166
- ]
167
- . filter ( Boolean )
168
- . join ( ' ' )
169
- . trim ( ) ,
170
151
children : item . props . label ,
171
152
} ;
172
153
if ( ! item . props . disabled ) {
@@ -176,7 +157,16 @@ export default function Tabs(props: TabsProps) {
176
157
calcSlideStyle ( ) ;
177
158
} ;
178
159
}
179
- return < div key = { key } ref = { ( ref ) => divNavRef ( ref , key , item . key ) } { ...divProps } /> ;
160
+ return (
161
+ < Styled . TabsItem
162
+ type = { type }
163
+ disabled = { item . props . disabled }
164
+ active = { item . key === activeKey }
165
+ key = { key }
166
+ ref = { ( ref ) => divNavRef ( ref , key , item . key ) }
167
+ { ...divProps }
168
+ />
169
+ ) ;
180
170
} ) ;
181
171
}
182
172
}
0 commit comments