前言
折叠面板组件直观展示:
下面我们一起分析如何实现这个组件
分析
- 可以把组件拆分成父容器(collapse)和子组件(collapse-item)2个,然后在父组件上使用
v-model
进行双向绑定 - 子组件折叠有2种方式,第一种是普通展开模式,第二种是accordion(手风琴)模式
- 对折叠项内容展开和收起时运用动画,产生平滑过渡效果
实现
Collapse 父组件
模板代码如下:
1 | <template> |
上述代码有几点需要注意的地方:
- provide / inject 允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效
- 通过属性
value
和switch
方法中发射input
事件,让自定义组件实现双向绑定 - 当
accordion
属性为真时,展开的折叠项只有一个,记录到一个字符串中即可,当为假时,可以有多个折叠项同时是展开状态,这个时候我们需要用数组记录状态
Collapse Item 子组件
模板代码如下:
raf, cancel 源码见 →附录←
1 | <template> |
分析代码:
- 通过 inject 接收父组件的依赖,并在
created
生命周期中进行校验和初始化 - 子组件内容容器上同时运用
v-if
和v-show
这样保证了,第一次时不做全部渲染,又保证了后续切换时,不需要进行频繁的重新生成dom - 如果不显示设置
name
, 默认值为当前组件在折叠列表中的索引值 - 通过 currentName 与 父组件的 value 值进行比较判断确定当前子项的展开状态
- 它点击改变子项的状态时,监听展开状态,并在里面对展开内容,进行第一帧的raf动画,其他帧是css动画
- 通过
onTransitionEnd
捕捉过渡结束状态,并同时改变show
变量的状态
样式代码如下:
1 |
|
从上述代码可知,针对 height
做过渡,实现平滑折叠效果
DEMO展示
点击下方链接查看 👇:
http://wechat.hand-china.com/hippius-ui/#/zh-CN/collapse
- raf 源码分析见 raf