nly-adminlte-vue
Version:
nly adminlte3 components
410 lines (335 loc) • 12.9 kB
Markdown
# Collapse
> 折叠板,支持任何元素折叠,支持手风琴模式
## 总览
折叠板有 2 个组件,一个是 `nly-collaspe`, 一个是`nly-collapse-noclass`.这 2 个折叠板组件的使用方法是一样的
**注意:**
- 区别在于 `nly-collaspe` 的动画需要依赖一些 admintle 3 自带的 css 式样:
```
css: true,
enterClass: "",
enterActiveClass: "collapsing",
enterToClass: "collapse show",
leaveClass: "collapse show",
leaveActiveClass: "collapsing",
leaveToClass: "collapse"
```
- `nly-collapse` 组件在某些情况下动画会失效. 比如被包裹的元素存在 `margin` 属性等.
- `nly-collapse`使用的动画组件是 `NlyCollapseTransition`
- `nly-collapse-noclass` 使用的动画组件是 `NlyCollapseNoclassTransition`
```html
<div>
<nly-button v-nly-toggle.collapse-1 variant="primary"
>Toggle 折叠板</nly-button
>
<nly-collapse id="collapse-1" class="mt-2">
<nly-card>
<nly-card-body>
<p class="card-text">折叠板内容</p>
<nly-button v-nly-toggle.collapse-1-inner variant="default" size="sm"
>嵌套折叠板</nly-button
>
<nly-collapse id="collapse-1-inner" class="mt-2">
<nly-card>
<nly-card-body>
Hello NlyadminlteVue!
</nly-card-body>
</nly-card>
</nly-collapse>
</nly-card-body>
</nly-card>
</nly-collapse>
</div>
<!-- 嵌套折叠板.name -->
<!-- nly-collapse.vue -->
```
## 其他元素使用折叠板
其他元素可以被 `<nly-collapse>` 包裹, 利用指令 `v-nly-toggle` 开控制收起展开
```html
<div>
<nly-button v-nly-toggle.collapse-2 class="m-1" variant="default"
>指令折叠板</nly-button
>
<nly-button v-nly-toggle="'collapse-2'" class="m-1" variant="default"
>指令折叠板</nly-button
>
<nly-collapse id="collapse-2">
<nly-card>
<nly-card-body>
折叠板内容
</nly-card-body>
</nly-card>
</nly-collapse>
</div>
<!-- 指令折叠板.name -->
<!-- nly-collapse-usage.vue -->
```
## 初始化展开状态
设置 prop visible 为 true,使 `<nly-collapse>` 初始状态为展开
```html
<div>
<nly-button v-nly-toggle.collapse-3 class="m-1" variant="info"
>指令折叠板</nly-button
>
<nly-collapse visible id="collapse-3">
<nly-card>
<nly-card-body>
初始状态为展开!
</nly-card-body>
</nly-card>
</nly-collapse>
</div>
<!-- visible设置初始状态.name -->
<!-- nly-collapse-visible.vue -->
```
默认状态下,折叠板的 `visible` 或者 `v-model` 为 `true` 的时候,初始打开的折叠板并不会在渲染的时候就有动画
请设置`<nly-collapse>`的 `prop appear` 为 `true` 来使得折叠板具有初始展开动画
## `v-model`
折叠板的 收起展开状态(visible)支持用 `v-model` 来控制,在组件中 `v-model` 输入的值会传给 `prop visible`
注意,当我们用 `v-model` 来控制 `<nly-collapse>` 折叠版的时候, `aria-*` 属性和 class `collapsed` 并不会自动变化, 我们需要手动设置函数或者做点什么事来修改他们
```html
<template>
<div>
<nly-button
:class="visible ? null : 'collapsed'"
:aria-expanded="visible ? 'true' : 'false'"
aria-controls="collapse-4"
@click="visible = !visible"
variant="danger"
>
折叠板
</nly-button>
<nly-collapse id="collapse-4" v-model="visible" class="mt-2">
<nly-card>
<nly-card-body>
初始状态为展开
</nly-card-body>
</nly-card>
</nly-collapse>
</div>
</template>
<script>
export default {
data() {
return {
visible: true,
}
},
}
</script>
<!-- v-model.name -->
<!-- nly-collapse-v-model.vue -->
```
## 控制多个折叠板
使用一个 `v-nly-toggle` 可以控制多个 `<nly-collapse>` 组件 ,只需要将多个折叠板的 id 以 modifiers 传入同一个 `v-nly-toggle` 指令即可
```html
<div>
<nly-button v-nly-toggle.collapse-a.collapse-b variant="outlineSuccess"
>同时控制AB折叠板</nly-button
>
<nly-collapse id="collapse-a" class="mt-2">
<nly-card><nly-card-body>折叠板A</nly-card-body></nly-card>
</nly-collapse>
<nly-collapse id="collapse-b" class="mt-2">
<nly-card><nly-card-body>折叠板B</nly-card-body></nly-card>
</nly-collapse>
</div>
<!-- 指令控制多个折叠板.name -->
<!-- nly-collapse-trigger-multiple.vue -->
```
## 手风琴模式
`<nly-collapse>` 组件的手风琴模式由 `prop accordion` 来分组,当你把多个折叠板的 `accordion`设置为相同的时候,这些折叠板一次只能打开一个
```html
<nly-card>
<nly-button variant="info" v-nly-toggle.collapseTest1 block>
collapseTest1
</nly-button>
</nly-card>
<nly-collapse id="collapseTest1">
<nly-card>
我的标识是collapseTest1 我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
</nly-card>
</nly-collapse>
<nly-card>
<nly-button variant="info" v-nly-toggle.collapseTest2 block>
collapseTest2
</nly-button>
</nly-card>
<nly-collapse id="collapseTest2">
<nly-card>
我的标识是collapseTest2 我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
我是一个非手风琴演示,我跟他们都没关系
</nly-card>
</nly-collapse>
<nly-card>
<nly-button variant="warning" v-nly-toggle.accordion1 block>
accordion1
</nly-button>
</nly-card>
<nly-collapse id="accordion1" accordion="accordion">
<nly-card>
我的标识是id="accordion1" accordion='accordion' 我是一个手风琴演示
我是一个手风琴演示 我是一个手风琴演示 我是一个手风琴演示 我是一个手风琴演示
</nly-card>
</nly-collapse>
<nly-card>
<nly-button variant="warning" v-nly-toggle.accordion2 block>
accordion2
</nly-button>
</nly-card>
<nly-collapse id="accordion2" accordion="accordion" visible>
<nly-card>
我的标识是id="accordion2" accordion='accordion' 我是一个手风琴演示
因为我有visible,所以我最开始就被打开了
</nly-card>
</nly-collapse>
<nly-card>
<nly-button variant="warning" v-nly-toggle.accordion3 block>
accordion3
</nly-button>
</nly-card>
<nly-collapse id="accordion3" accordion="accordion" visible>
<nly-card>
我的标识是id="accordion3" accordion='accordion' 我是一个手风琴演示
</nly-card>
</nly-collapse>
<!-- 手风琴模式.name -->
<!-- nly-accordion.vue -->
```
这列子是边侧导航栏,二级菜单有偏移属性,即 `padding-left: 1rem`.这是用使用 `nly-collapse` 动画会失效, 只能使用 `nly-collapse-noclass`. 在这里边侧导航栏是用 `nly-collapse-noclass`进行封装的, 有兴趣可以看源码
```html
<nly-sidebar-nav class="mt-2" pill child-indent>
<nly-sidebar-nav-tree
target="collapsenoclass1"
accordion="collapsenoclass"
icon="nav-icon fas nlyfont nly-logo-aperture"
link-class="bg-info"
visible
text="accordion1"
>
<template slot="linktool">
<nly-badge variant="primary" badge-class="right" pill> </nly-badge>
</template>
<nly-sidebar-nav-item
link-class="xxx zzz"
class="sss"
icon="nav-icon far nlyfont nly-logo-chrome"
>
i have props visible,so i opened here
<nly-badge bg-variant="fuchsia" badge-class="right" size="sm">
NEW
</nly-badge>
</nly-sidebar-nav-item>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="collapsenoclass2"
accordion="collapsenoclass"
icon="nav-icon fas nlyfont nly-nav-fill"
link-class="bg-info"
text="accordion2"
>
<nly-sidebar-nav-item
link-class="xxx zzz"
class="sss"
icon="nav-icon far nlyfont nly-nav-tool"
>
上面的有visible props,所以他最开始就打开了
</nly-sidebar-nav-item>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="collapsenoclass3"
accordion="collapsenoclass"
icon="nav-icon fas nlyfont nly-magic-cube"
link-class="bg-info"
text="accordion3"
>
<nly-sidebar-nav-item
link-class="xxx zzz"
class="sss"
icon="nav-icon far nlyfont nly-keypad"
exact
>
我跟上面的2个都是accordion='collapse',所以我们是同一组手风琴
</nly-sidebar-nav-item>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-item
link-class="xxx zzz"
class="bg-danger"
icon="nav-icon far nlyfont nly-keypad"
v-nly-toggle.collapseTest
>
我是一个非手风琴演示
</nly-sidebar-nav-item>
<nly-collapse id="collapseTest">
我是一个非手风琴演示,我跟他们都没关系
</nly-collapse>
</nly-sidebar-nav>
<!-- nly-collapse-noclass.name -->
<!-- nly-accordion.vue -->
```
**注意:**
- 在使用手风琴模式的时候,如果您需要使得屏幕阅读用户能够无障碍阅读,请保证 `<nly-collapse>` 和手风琴开关按钮组件都在同一个设有 `role="tablist"` 的元素中,并且给每个折叠板开关添加一个 `role="tab"`
- 在使用手风琴模式的时候,如果使用 `v-model` 来控制 `<nly-collapse>`,请不要将所有折叠板的`v-model` 和 `visible` 指向同一个变量
- 在手风琴模式中,请确认初始或者同时只有一个折叠板的 `visible` 或者 `v-model` 为 true,否则会造成死循环,导致页面无法渲染,卡死浏览器。
## 根据者的状态来显示和隐藏元素
使用 `v-nly-toggle` 指令时,`<nly-collapse>` 折叠板关闭的时候,绑定指令的元素会添加一个 class `collapsed`.折叠板展开的时候,这个 class 会移除。
可以根据这个 css 来写对应的 css 来显示或者隐藏,或者旋转某些元素,比如开关 icon 等。
**例子:**
```html
<template>
<div>
<nly-button v-nly-toggle.my-collapse variant="info">
<span class="when-opened">Close</span>
<span class="when-closed">Open</span> My Collapse
</nly-button>
<nly-collapse id="my-collapse">
<nly-card>
<nly-card-body>
演示
</nly-card-body>
</nly-card>
</nly-collapse>
</div>
</template>
<style>
.collapsed > .when-opened,
:not(.collapsed) > .when-closed {
display: none;
}
</style>
```
## 全局 \$root 事件
使用$root事件来发送和监听 `<nly-collapse>` 组件的展开和收起状态。 有关 $root 事件详细请查看[Vue 文档](https://vuejs.org/v2/guide/components-edge-cases.html#Accessing-the-Root-Instance).
### 使用 \$root 来监听折叠板折叠状态
这是一个监听折叠板展开状态的 js 例子
```js
export default {
mounted() {
this.$root.$on('nlya::collapse::state', (collapseId, isJustShown) => {
console.log('collapseId:', collapseId)
console.log('isJustShown:', isJustShown)
})
},
}
```
`collapseId` 是状态变化的折叠板的 id; `isJustShown` 返回的对应折叠板的展开状态,返回 true 或者 false
### 通过 \$root 控制折叠板展开状态
通过传递 id 和 `nlya::toggle::collapse`事件来控制对应 id 的折叠板状态
```js
this.$root.$emit('nlya::toggle::collapse', 'my-collapse-id')
```
## 可选范围默认插槽
<span class="badge badge-info small">New 0.4.0</span>
> 具体请查看下面 `slots` 表格
## 辅助技术
`v-nly-toggle` 会自动添加 ARIA attributes `aria-controls` 和 `aria-expanded` 到被绑定的组件上,被绑定的组件的 aria-expanded 属性将会反应对应的 `<nly-collapse>` 组件的展开状态,`aria-controls`会关联到对应的 `<nly-collapse>` 组件的 id
如果使用 `v-model` 来代替指令 `v-nly-toggle`,需要手动添加独赢的辅助属性。
在使用手风琴模式的时候,如果您需要使得屏幕阅读用户能够无障碍阅读,请保证 `<nly-collapse>` 和手风琴开关按钮组件都在同一个设有 `role="tablist"` 的元素中,并且给每个折叠板开关添加一个 `role="tab"`
**注意:**
- `<nly-collapse>` 组件有时候动画会失效,请使用 `<nly-collapse-noclass>` 代替