@@ -21,10 +21,14 @@ export type LabelTooltipType = TooltipProps | TooltipProps['title'];
2121
2222export declare type SizeType = 'small' | 'middle' | 'large' ;
2323
24+ function isControlled ( props : IBlockHeaderProps ) {
25+ return props . expand !== undefined ;
26+ }
27+
2428export interface IBlockHeaderProps {
25- // 标题
29+ /** 标题 */
2630 title : string ;
27- // 标题前的图标,默认是一个色块
31+ /** 标题前的图标,默认是一个色块 */
2832 addonBefore ?: ReactNode ;
2933 // 标题后的提示说明文字
3034 description ?: ReactNode ;
@@ -38,19 +42,24 @@ export interface IBlockHeaderProps {
3842 * 默认 中标题
3943 */
4044 size ?: SizeType ;
45+ /** 是否展示 Bottom,默认 false,Bottom 值 16px */
4146 hasBottom ?: boolean ;
47+ /** 自定义 Bottom 值 */
4248 spaceBottom ?: number ;
4349 // 标题的样式类名
4450 className ?: string ;
4551 // 标题的样式
4652 style ?: React . CSSProperties ;
47- // 是否显示背景, 默认 true
53+ /** 是否显示背景, 默认 true */
4854 background ?: boolean ;
49- // 是否默认展开内容, 默认 true
55+ /** 当前展开状态 */
56+ expand ?: boolean ;
57+ /** 是否默认展开内容, 默认 true */
5058 defaultExpand ?: boolean ;
59+ /** 展开/收起的内容 */
5160 children ?: ReactNode ;
52- // 展开/收起时的回调
53- onChange ?: ( expand : boolean ) => void ;
61+ /** 展开/收起时的回调 */
62+ onExpand ?: ( expand : boolean ) => void ;
5463}
5564const BlockHeader : React . FC < IBlockHeaderProps > = function ( props ) {
5665 const prefixCls = 'dtc-block-header' ;
@@ -66,12 +75,15 @@ const BlockHeader: React.FC<IBlockHeaderProps> = function (props) {
6675 background = true ,
6776 defaultExpand = true ,
6877 addonAfter,
78+ expand,
6979 children = '' ,
7080 addonBefore = < div className = { `title__addon-before--${ size } ` } /> ,
71- onChange ,
81+ onExpand ,
7282 } = props ;
7383
74- const [ expand , setExpand ] = useState ( defaultExpand ) ;
84+ const [ internalExpand , setInternalExpand ] = useState ( defaultExpand ) ;
85+
86+ const currentExpand = isControlled ( props ) ? expand : internalExpand ;
7587
7688 const preTitleRowCls = `${ prefixCls } __title` ;
7789
@@ -89,8 +101,8 @@ const BlockHeader: React.FC<IBlockHeaderProps> = function (props) {
89101
90102 const handleExpand = ( expand : boolean ) => {
91103 if ( ! children ) return ;
92- setExpand ( expand ) ;
93- onChange ?.( expand ) ;
104+ ! isControlled ( props ) && setInternalExpand ( expand ) ;
105+ onExpand ?.( expand ) ;
94106 } ;
95107
96108 return (
@@ -100,7 +112,7 @@ const BlockHeader: React.FC<IBlockHeaderProps> = function (props) {
100112 [ `${ preTitleRowCls } --background` ] : background ,
101113 [ `${ preTitleRowCls } --pointer` ] : children ,
102114 } ) }
103- onClick = { ( ) => handleExpand ( ! expand ) }
115+ onClick = { ( ) => handleExpand ( ! currentExpand ) }
104116 >
105117 < div className = "title__box" >
106118 { addonBefore ? < div className = "title__addon-before" > { addonBefore } </ div > : null }
0 commit comments