react-collapsible
import Collapsible from "./Collapsible";
renderHead = () => {
return (
<div className="header">header</div>
)
}
<Collapsible
trigger={this.renderHead()}
onOpen={this.handleOnOpen}
onClose={this.handleOnClose}
onOpening={this.handleOnOpening}
onClosing={this.handleOnClosing}
>
<div className={className}>
content
</div>
</Collapsible>
Collapsible
内部的内容的高度height
共有三个值,auto/ 0 / this.innerRef.current.scrollHeight
,也就是根本就不用去计算,
react-bootstrap
中设置高度是offsetHeight + marginTop + marginBottom
transition
动画,设置属性为 height
,时间为用户设置的时间,默认的动画效果为linear
,动画效果可以提供给用户设置,可以设置的动画效果为 transition 动画效果集height
设置为具体的高度,然后再设置为0
或者是auto
,这个应该是为了触发动画,如果直接设置为0
或者auto
,很可能就没有动画效果了lazyRender
在折叠的时候不加载内部内容,直到展开的时候onOpening
事件onClosing
事件onTransitionEnd
事件,这时候判断当前状态是展开还是收起了,如果展开那就调用 onOpen
,如果结束就调用 onClose
事件triggerContainer
中触发的动画,用户可以自行接管,比如在 contentContainer 中设置默认的 transition
样式,当触发动画时className
为show
,也就是触发之后的动画属性, 这样就能够实现动画效果了。注:Idea 和源码参考 react-collapsible,但我觉得我写的更好,还给对方修复了多次触发导致动画失效的bug