# ZeenSlideToggle
Компонент ZeenSlideToggle создает скрывающий и раскрывающие поле с внутренним контентом. Принимает в себя текст и еще один необязательный слот с заголовком
# Примеры:
# props
Название | Тип | Обязательный | По умолчанию | Описание |
---|---|---|---|---|
open | Boolean | - | false | открыт/закрыт toogle |
duration | Number | - | 500 | Время анимации |
tag | String | - | div | html тег |
closedHeight | Number | - | 0 | Высота в закрытом состоянии |
# Source Code - исходный код компонента
<template lang="pug">
component(:style="style" ref="container" :is="tag" @transitionend="handleTransition")
slot
</template>
<script>
export default {
name: 'UiSlideToggle',
props: {
open: Boolean,
duration: {
type: Number,
default: 500,
},
tag: {
type: String,
default: 'div',
},
closedHeight: {
type: Number,
default: 0,
},
},
data() {
return {
scrollHeight: 0,
doneOpenTransition: false,
innerOpen: this.open,
}
},
mounted() {
window.addEventListener('resize', this.getHeight)
this.getHeight()
},
updated() {
this.getHeight()
},
destroyed() {
window.removeEventListener('resize', this.getHeight)
},
methods: {
getHeight() {
const {container} = this.$refs
this.scrollHeight = container.scrollHeight
},
handleTransition() {
if (this.innerOpen) {
this.doneOpenTransition = true
}
},
},
computed: {
style() {
if (this.innerOpen && this.doneOpenTransition) return null
const heightSize = this.innerOpen ? this.scrollHeight + 1 : this.closedHeight
return {
overflow: 'hidden',
transitionProperty: 'height',
height: `${heightSize}px`,
transitionDuration: `${this.duration}ms`,
}
},
},
watch: {
open(bool) {
if (!bool) {
this.getHeight()
this.doneOpenTransition = false
this.$nextTick().then(() => {
this.innerOpen = false
})
} else {
this.innerOpen = true
}
},
},
}
</script>