Skip to content

Commit 3cfdc2e

Browse files
committed
feat: 重构collapse为details实现
1 parent 74a99fe commit 3cfdc2e

File tree

4 files changed

+22
-18
lines changed

4 files changed

+22
-18
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ coverage
2828
es
2929
yarn.lock
3030
package-lock.json
31+
pnpm-lock.yaml
3132
.storybook
3233
.doc
3334

src/Collapse.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,21 @@ const Collapse = React.forwardRef<HTMLDivElement, CollapseProps>((props, ref) =>
4646
});
4747

4848
const onItemClick = (key: React.Key) =>
49-
setActiveKey(() => {
50-
if (accordion) {
51-
return activeKey[0] === key ? [] : [key];
52-
}
49+
// ? 为了解决https://github.com/facebook/react/issues/15486
50+
React.startTransition(() => {
51+
setActiveKey(() => {
52+
if (accordion) {
53+
return activeKey[0] === key ? [] : [key];
54+
}
5355

54-
const index = activeKey.indexOf(key);
55-
const isActive = index > -1;
56-
if (isActive) {
57-
return activeKey.filter((item) => item !== key);
58-
}
56+
const index = activeKey.indexOf(key);
57+
const isActive = index > -1;
58+
if (isActive) {
59+
return activeKey.filter((item) => item !== key);
60+
}
5961

60-
return [...activeKey, key];
62+
return [...activeKey, key];
63+
});
6164
});
6265

6366
// ======================== Children ========================

src/Panel.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import React from 'react';
55
import type { CollapsePanelProps } from './interface';
66
import PanelContent from './PanelContent';
77

8-
const CollapsePanel = React.forwardRef<HTMLDivElement, CollapsePanelProps>((props, ref) => {
8+
const CollapsePanel = React.forwardRef<HTMLDetailsElement, CollapsePanelProps>((props, ref) => {
99
const {
1010
showArrow = true,
1111
headerClass,
@@ -87,8 +87,8 @@ const CollapsePanel = React.forwardRef<HTMLDivElement, CollapsePanelProps>((prop
8787

8888
// ======================== Render ========================
8989
return (
90-
<div {...resetProps} ref={ref} className={collapsePanelClassNames}>
91-
<div {...headerProps}>
90+
<details {...resetProps} ref={ref} className={collapsePanelClassNames} open={isActive}>
91+
<summary {...headerProps}>
9292
{showArrow && iconNode}
9393
<span
9494
className={classNames(`${prefixCls}-title`, customizeClassNames?.title)}
@@ -98,7 +98,7 @@ const CollapsePanel = React.forwardRef<HTMLDivElement, CollapsePanelProps>((prop
9898
{header}
9999
</span>
100100
{ifExtraExist && <div className={`${prefixCls}-extra`}>{extra}</div>}
101-
</div>
101+
</summary>
102102
<CSSMotion
103103
visible={isActive}
104104
leavedClassName={`${prefixCls}-panel-hidden`}
@@ -124,7 +124,7 @@ const CollapsePanel = React.forwardRef<HTMLDivElement, CollapsePanelProps>((prop
124124
);
125125
}}
126126
</CSSMotion>
127-
</div>
127+
</details>
128128
);
129129
});
130130

src/interface.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface ItemType
1616
> {
1717
key?: CollapsePanelProps['panelKey'];
1818
label?: CollapsePanelProps['header'];
19-
ref?: React.RefObject<HTMLDivElement>;
19+
ref?: React.RefObject<HTMLDetailsElement>;
2020
}
2121

2222
export interface CollapseProps {
@@ -42,15 +42,15 @@ export interface CollapseProps {
4242
}
4343

4444
export type SemanticName = 'header' | 'title' | 'body' | 'icon';
45-
export interface CollapsePanelProps extends React.DOMAttributes<HTMLDivElement> {
45+
export interface CollapsePanelProps extends React.DOMAttributes<HTMLDetailsElement> {
4646
id?: string;
4747
header?: string | React.ReactNode;
4848
prefixCls?: string;
4949
headerClass?: string;
5050
showArrow?: boolean;
5151
className?: string;
5252
classNames?: Partial<Record<SemanticName, string>>;
53-
style?: object;
53+
style?: React.CSSProperties;
5454
styles?: Partial<Record<SemanticName, React.CSSProperties>>;
5555
isActive?: boolean;
5656
openMotion?: CSSMotionProps;

0 commit comments

Comments
 (0)