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