Skip to content

Slidedown 折叠面板

折叠面板组件用于将内容区域折叠/展开,节省页面空间,适合 FAQ、配置项分组等场景。

基础用法

默认插槽为始终可见的标题区域,#content 插槽为可展开的内容区。通过 v-model 控制展开/收起状态。

vue

<TSlidedown v-model="isOpen">
  <span class="fw-semibold">标题区域</span>
  <template #content>
    <p>展开后的内容。</p>
  </template>
</TSlidedown>

无边框模式

设置 :border="false" 移除边框。

vue

<TSlidedown :border="false">
  <span>标题区域</span>
  <template #content>...</template>
</TSlidedown>

点击任意位置展开

设置 click-anywhere-expand,点击面板任意位置即可展开。

vue

<TSlidedown click-anywhere-expand>
  <span>标题区域</span>
  <template #content>...</template>
</TSlidedown>

隐藏箭头

设置 :arrow="false" 隐藏底部箭头。

vue

<TSlidedown :arrow="false">
  <span>标题区域</span>
  <template #content>...</template>
</TSlidedown>

前置拦截

通过 beforeToggle 函数可以在展开前做校验。返回 false 阻止切换,返回 true 正常执行。支持异步函数,可用于付费内容校验、权限检查等场景。

vue

<TSlidedown :before-toggle="beforeExpand">
  <span>付费内容</span>
  <template #content>
    <p>支付后才能看到的内容。</p>
  </template>
</TSlidedown>

<script setup>
  async function beforeExpand(next) {
    if (!next) return true // 收起不拦截
    const res = await fetch('/api/check-payment')
    const data = await res.json()
    return data.paid
  }
</script>

自定义箭头

通过 #arrow 作用域插槽可以完全自定义底部箭头区域,接收 expanded(展开状态)、loading(加载中)和 toggle(切换方法)三个参数。

vue

<TSlidedown>
  <span>高级设置</span>
  <template #content>...</template>
  <template #arrow="{ expanded }">
    <span class="badge">{{ expanded ? '收起' : '展开' }}</span>
  </template>
</TSlidedown>

API

Props

Prop说明类型默认值
v-model展开/收起状态booleanfalse
arrow显示底部箭头booleantrue
border显示边框booleantrue
clickAnywhereExpand点击任意位置展开booleanfalse
clickAnywhereCollapse点击任意位置收起booleanfalse
beforeToggle展开/收起前置拦截函数,返回 false 阻止切换(newValue: boolean) => boolean | Promise<boolean>undefined

Slots

插槽说明
default始终可见的标题/头部区域
content可展开的内容区域
arrow自定义底部箭头,作用域:{ expanded: boolean, loading: boolean, toggle: () => void }