nly-adminlte-vue
Version:
nly adminlte3 components
1,021 lines (936 loc) • 35.9 kB
Markdown
# Sidebar
> 一个可以收缩,展开,悬浮,支持多级子菜单的左侧导航栏
> 请注意, 本页的所有演示代码, 在打开之前,请关闭其他所有激活的示例, 不然会导致 bug。 `NlyAdminlteVue` 只允许一个 `sidebar` 存在,因为本页是文档演示, 使用 `v-if` 渲染多个 `sidebar`, 请保证本页同时只有一个 `sidebar` 被激活
- 左侧导航栏容器, 收起成只有 `icon` 的导航栏,需要 `body` 中有 `class='sidebar-mini sidebar-collapse'`,如果只有 `sidebar-collapse`,则会将左侧导航栏滑到左侧区域外,不可见。`sidebar-collapse` 用来控制左侧导航栏展开收缩。`sidebar-mini` 允许左侧导航栏收起到只有图标的状态
- `nly-sidebar-menu` 和 `nly-sidebar-container` 的收起和展开是由指令 `v-nly-sidebar-collapse` 来实现的,单独使用并无效果。
- `nly-sidebar-menu` 和 `nly-sidebar-container` 的差别在于使用 `nly-sidebar-menu` 可以传入一个数组来渲染菜单, 而 `nly-sidebar-container` 则需要使用嵌套组件一个一个写入。 当然也可以使用 `nly-render-function` 组件来传入数组渲染,详情请查看 [数组渲染页面组件](/docs/components/render-function)
- 下拉菜单元素组件 `nly-sidebar-nav-tree`,默认所有下拉菜单为手风琴模式,如需关闭,请给每个 `nly-sidebar-nav-tree` 设置 `accordion=null`
- 如果需要分组手风琴,请给同一组的 `nly-sidebar-nav-tree` 设置相同的 `accordion`
- 请保证 `nly-sidebar-nav-tree` 的 `target` 唯一, `nly-sidebar-nav-tree` 是通过 `target` 来控制对应元素收起展开的。 且 `target` 并没有设置默认值,多个相同,会导致一起展开收起。
- 如果有多个 `nly-sidebar-nav-tree` 的 `target` 相同,请勿设置 `visible=true`,会导致浏览器崩溃
- 如果有多级导航栏, 需要手风琴模式,请给同一级别的导航元素设置相同的 `accordion`, 不同级别导航 `accordion` 请设置唯一值
- `nly-sidebar-menu` 如果需要自动开启路由匹配模式, 给每一个 `nly-sidebar-nav-tree` 和 `nly-sidebar-nav-item` 传入 `exact: true`, 请不要给设置元素设置 `visible` 属性
- `sidebar` 需要布局容器 `nly-wrapper` 来配合布局, 请设置 `nly-wrappper`, 并使用其四个布局之一,具体请查看 [wrapper 布局](/docs/components/wrapper)
**示例:**
```html
<template>
<div>
<div>
<nly-button block @click="showSidebar" variant="info"
>点击渲染左侧菜单栏</nly-button
>
<nly-button
block
v-nly-sidebar-collapse.sidebar-collapse
class="navItem"
:disabled="!show"
bg-variant="pink"
>点击收起左侧菜单栏</nly-button
>
</div>
<nly-wrapper layout="fixed" v-if="show">
<nly-sidebar-container hover style="margin-top:66px" side-mini>
<nly-sidebar-brand to="#-">
<nly-sidebar-brandimg
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
elevation
circle
/>
<nly-sidebar-brandtext>NLY Adminlte Vue</nly-sidebar-brandtext>
</nly-sidebar-brand>
<nly-sidebar>
<nly-sidebar-userpanel class="mt-3 pb-3 mb-3 d-flex">
<nly-sidebar-userpanel-img
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
class="SSS"
/>
<nly-sidebar-userpanel-info to="#-"
>Nejinn lerity</nly-sidebar-userpanel-info
>
</nly-sidebar-userpanel>
<nly-sidebar-nav class="mt-2">
<nly-sidebar-nav-header>仪表盘</nly-sidebar-nav-header>
<nly-sidebar-nav-item
to="/"
icon="nav-icon fas nlyfont nly-icon-dashboard"
exact
>
首页
<nly-badge bg-variant="teal" badge-class="right">NEW</nly-badge>
</nly-sidebar-nav-item>
<nly-sidebar-nav-header>
组件
<nly-badge bg-variant="maroon" badge-class="float-sm-right"
>15</nly-badge
>
</nly-sidebar-nav-header>
<nly-sidebar-nav-tree
target="components-one"
visible
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="菜单树"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-logo-chrome"
exact
>菜单1</nly-sidebar-nav-item
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-nav-tool"
exact
>菜单2</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="components-two"
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="菜单树2"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单3</nly-sidebar-nav-item
>
<nly-sidebar-nav-tree
target="components-three"
accordion="components-three"
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="菜单树3"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单4</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="components-for"
accordion="components-three"
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="菜单树4"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
</nly-sidebar-nav-tree>
</nly-sidebar-nav>
</nly-sidebar>
</nly-sidebar-container>
<nly-overlay v-nly-sidebar-collapse.overlay sidebar />
</nly-wrapper>
</div>
</template>
<script>
export default {
data() {
return {
show: false
};
},
methods: {
showSidebar() {
if (this.show) {
this.show = false;
// 写这个是为了这里文档演示效果,清除掉 body 的 class, 因为 NlyAdminlteVue 是用 body 来控制菜单栏的
const bodyClassName = (document.body.className = "");
} else {
this.show = true;
}
}
}
};
</script>
<!-- sidebar.name -->
<!-- sidebar.vue -->
```
## 路由跳转
点击 `nly-sidebar-nav-item` 和 `nly-sidebar-nav-tree` 可以跳转到对应的路由。
设置 `to` prop 可以给组件传入对应的路由,可以是 `String` 或者 `key=value Object`。 比如 `/sidebar` 或者 `{name: sidebar}` 。 设置 `to` 的时候, 路由跳转是 `router-link router.push()`
设置 `replace` 为 `true` 会使路由跳转变成 `router-link router.replace()`
设置 `append` 为 `true` 会把 `to` 指向的路由添加到当前路由后面,再进行跳转
设置 `active` 为 `true`, 或使得`nly-sidebar-nav-item` 和 `nly-sidebar-nav-tree` 处于激活状态
设置 `active-class` 可以自定义路由激活状态的 css 类
设置 `exact` 为 `true` 会开启路由匹配模式, 如果当前路由与 `to` 指向的路由是相同的,则会使得 `nly-sidebar-nav-item` 和 `nly-sidebar-nav-tree` 处于激活状态
设置 `exact-active-class` 可以自定义路由匹配激活状态的 css 类
## 手风琴模式
`nly-sidebar-nav-tree` 可以设置手风琴模式, prop `accordion` 可以用来控制手风琴分组。 默认值是 `nly-sidebar-accordion`。 如果不需要手风琴模式,请设置 `accordion` 为 `null`。
如果需要给不同级别的 `nly-sidebar-nav-tree` 开启手风琴模式, 请给不同级别的 tree 设置不同的 `accordion` 值, 且给同一级别的 tree 设置 相同的 `accordion` 值。
`target` prop 是必传参数, 请保证 `nly-sidebar-nav-tree` 的 `target` 唯一, `nly-sidebar-nav-tree` 是通过 `target` 来控制对应元素收起展开的。 且 `target` 并没有设置默认值,多个相同,会导致一起展开收起。
`nly-sidebar-nav-tree` 中嵌入了一个 `nly-link` 组件, 关于 `to`, `repalce`, `active` 等 prop 跟 `nly-link` 用法是一样的, 具体请查看 [`nly-link`](/docs/components/link)
可以设置 `visible` prop 为 `true` 来使得 `nly-sidebar-nav-tree` 默认展开, 如果是手风琴模式, 请不要同时设置多个 `visible` prop 为 `true`,请保证只有 `visible` prop 为 `true`。
可以设置 `appear` prop 来设置初始渲染动画
avtive prop 可以设置当前 `nly-sidebar-nav-tree` 的激活状态
### 非手风琴模式
如果不需要手风琴模式,请设置 `accordion` 为 `null` 或者为不同的值
```html
<template>
<div>
<div>
<nly-button block @click="showSidebar" variant="info"
>点击渲染左侧菜单栏</nly-button
>
<nly-button
block
v-nly-sidebar-collapse.sidebar-collapse
class="navItem"
:disabled="!show"
bg-variant="pink"
>点击收起左侧菜单栏</nly-button
>
</div>
<nly-wrapper layout="fixed" v-if="show">
<nly-sidebar-container hover style="margin-top:66px" side-mini>
<nly-sidebar-brand to="#-">
<nly-sidebar-brandimg
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
elevation
circle
/>
<nly-sidebar-brandtext>NLY Adminlte Vue</nly-sidebar-brandtext>
</nly-sidebar-brand>
<nly-sidebar>
<nly-sidebar-userpanel class="mt-3 pb-3 mb-3 d-flex">
<nly-sidebar-userpanel-img
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
class="SSS"
/>
<nly-sidebar-userpanel-info to="#-"
>Nejinn lerity</nly-sidebar-userpanel-info
>
</nly-sidebar-userpanel>
<nly-sidebar-nav class="mt-2">
<nly-sidebar-nav-tree
target="components-one"
visible
active
accordion="components-one"
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="非手风琴1"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-logo-chrome"
exact
>菜单1</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="components-two"
accordion="components-two"
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="非手风琴2"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
</nly-sidebar-nav>
</nly-sidebar>
</nly-sidebar-container>
<nly-overlay v-nly-sidebar-collapse.overlay sidebar />
</nly-wrapper>
</div>
</template>
<script>
export default {
data() {
return {
show: false
};
},
methods: {
showSidebar() {
if (this.show) {
this.show = false;
// 写这个是为了这里文档演示效果,清除掉 body 的 class, 因为 NlyAdminlteVue 是用 body 来控制菜单栏的
const bodyClassName = (document.body.className = "");
} else {
this.show = true;
}
}
}
};
</script>
<!-- sidebar.name -->
<!-- sidebar.vue -->
```
### 手风琴模式
默认手风琴模式:
```html
<template>
<div>
<div>
<nly-button block @click="showSidebar" variant="info"
>点击渲染左侧菜单栏</nly-button
>
<nly-button
block
v-nly-sidebar-collapse.sidebar-collapse
class="navItem"
:disabled="!show"
bg-variant="pink"
>点击收起左侧菜单栏</nly-button
>
</div>
<nly-wrapper layout="fixed" v-if="show">
<nly-sidebar-container hover style="margin-top:66px" side-mini>
<nly-sidebar-brand to="#-">
<nly-sidebar-brandimg
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
elevation
circle
/>
<nly-sidebar-brandtext>NLY Adminlte Vue</nly-sidebar-brandtext>
</nly-sidebar-brand>
<nly-sidebar>
<nly-sidebar-userpanel class="mt-3 pb-3 mb-3 d-flex">
<nly-sidebar-userpanel-img
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
class="SSS"
/>
<nly-sidebar-userpanel-info to="#-"
>Nejinn lerity</nly-sidebar-userpanel-info
>
</nly-sidebar-userpanel>
<nly-sidebar-nav class="mt-2">
<nly-sidebar-nav-tree
target="components-one"
visible
active
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="手风琴1"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-logo-chrome"
exact
>菜单1</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="components-two"
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="手风琴2"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
</nly-sidebar-nav>
</nly-sidebar>
</nly-sidebar-container>
<nly-overlay v-nly-sidebar-collapse.overlay sidebar />
</nly-wrapper>
</div>
</template>
<script>
export default {
data() {
return {
show: false
};
},
methods: {
showSidebar() {
if (this.show) {
this.show = false;
// 写这个是为了这里文档演示效果,清除掉 body 的 class, 因为 NlyAdminlteVue 是用 body 来控制菜单栏的
const bodyClassName = (document.body.className = "");
} else {
this.show = true;
}
}
}
};
</script>
<!-- sidebar.name -->
<!-- sidebar.vue -->
```
多级手风琴模式:
```html
<template>
<div>
<div>
<nly-button block @click="showSidebar" variant="info"
>点击渲染左侧菜单栏</nly-button
>
<nly-button
block
v-nly-sidebar-collapse.sidebar-collapse
class="navItem"
:disabled="!show"
bg-variant="pink"
>点击收起左侧菜单栏</nly-button
>
</div>
<nly-wrapper layout="fixed" v-if="show">
<nly-sidebar-container hover style="margin-top:66px" side-mini>
<nly-sidebar-brand to="#-">
<nly-sidebar-brandimg
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
elevation
circle
/>
<nly-sidebar-brandtext>NLY Adminlte Vue</nly-sidebar-brandtext>
</nly-sidebar-brand>
<nly-sidebar>
<nly-sidebar-userpanel class="mt-3 pb-3 mb-3 d-flex">
<nly-sidebar-userpanel-img
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
class="SSS"
/>
<nly-sidebar-userpanel-info to="#-"
>Nejinn lerity</nly-sidebar-userpanel-info
>
</nly-sidebar-userpanel>
<nly-sidebar-nav class="mt-2">
<nly-sidebar-nav-tree
target="components-one"
visible
active
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="手风琴1"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-logo-chrome"
exact
>菜单1</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="components-two"
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="手风琴2"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
<nly-sidebar-nav-tree
target="components-three"
appear
accordion="level-2"
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="手风琴3"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-tree
target="components-four"
appear
accordion="level-2"
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="手风琴4"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
</nly-sidebar-nav-tree>
</nly-sidebar-nav>
</nly-sidebar>
</nly-sidebar-container>
<nly-overlay v-nly-sidebar-collapse.overlay sidebar />
</nly-wrapper>
</div>
</template>
<script>
export default {
data() {
return {
show: false
};
},
methods: {
showSidebar() {
if (this.show) {
this.show = false;
// 写这个是为了这里文档演示效果,清除掉 body 的 class, 因为 NlyAdminlteVue 是用 body 来控制菜单栏的
const bodyClassName = (document.body.className = "");
} else {
this.show = true;
}
}
}
};
</script>
<!-- sidebar.name -->
<!-- sidebar.vue -->
```
## 菜单标题
可以使用 `nly-sidebar-nav-header` 设置菜单 title 来给菜单进行分组
```html
<template>
<div>
<div>
<nly-button block @click="showSidebar" variant="info"
>点击渲染左侧菜单栏</nly-button
>
<nly-button
block
v-nly-sidebar-collapse.sidebar-collapse
class="navItem"
:disabled="!show"
bg-variant="pink"
>点击收起左侧菜单栏</nly-button
>
</div>
<nly-wrapper layout="fixed" v-if="show">
<nly-sidebar-container hover style="margin-top:66px" side-mini>
<nly-sidebar-brand to="#-">
<nly-sidebar-brandimg
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
elevation
circle
/>
<nly-sidebar-brandtext>NLY Adminlte Vue</nly-sidebar-brandtext>
</nly-sidebar-brand>
<nly-sidebar>
<nly-sidebar-userpanel class="mt-3 pb-3 mb-3 d-flex">
<nly-sidebar-userpanel-img
src="http://nly-adminlte-vue-demo.nejinn.com/img/NLYLOGO.b43761e2.png"
class="SSS"
/>
<nly-sidebar-userpanel-info to="#-"
>Nejinn lerity</nly-sidebar-userpanel-info
>
</nly-sidebar-userpanel>
<nly-sidebar-nav class="mt-2">
<nly-sidebar-nav-header>分组0 </nly-sidebar-nav-header>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-logo-chrome"
exact
>首页</nly-sidebar-nav-item
>
<nly-sidebar-nav-header>分组1 </nly-sidebar-nav-header>
<nly-sidebar-nav-tree
target="components-one"
visible
active
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="分组1"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-logo-chrome"
exact
>菜单1</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
<nly-sidebar-nav-header>分组2 </nly-sidebar-nav-header>
<nly-sidebar-nav-tree
target="components-two"
appear
icon="nav-icon fas nlyfont nly-icon-logo-polymer"
text="分组2"
>
<nly-sidebar-nav-item
to="/"
icon="nav-icon far nlyfont nly-icon-sr-chanxueyanhezuo-fill"
exact
>菜单5</nly-sidebar-nav-item
>
</nly-sidebar-nav-tree>
</nly-sidebar-nav>
</nly-sidebar>
</nly-sidebar-container>
<nly-overlay v-nly-sidebar-collapse.overlay sidebar />
</nly-wrapper>
</div>
</template>
<script>
export default {
data() {
return {
show: false
};
},
methods: {
showSidebar() {
if (this.show) {
this.show = false;
// 写这个是为了这里文档演示效果,清除掉 body 的 class, 因为 NlyAdminlteVue 是用 body 来控制菜单栏的
const bodyClassName = (document.body.className = "");
} else {
this.show = true;
}
}
}
};
</script>
<!-- sidebar.name -->
<!-- sidebar.vue -->
```
## 数组渲染 sidebar
`nly-sidebar-menu` 是一个接受数组,渲染 `sidebar` 的组件。
`sidebarList` 是接收渲染数组的 prop。通常格式如下:
```js
sidebarList: [
{
_type: "nly-sidebar-nav",
_class: "mt-2",
dataGroup: "zero",
_key: "one",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "一级菜单 item 1",
icon: "nav-icon fas nlyfont nly-icon-dashboard",
exact: true,
exactActiveClass: "active",
dataGroup: "one",
_key: "two",
to: { name: "SidebarMenuExact1" }
},
{
_type: "nly-sidebar-nav-tree",
target: "components-two",
icon: "nav-icon fas nlyfont nly-icon-dashboard",
text: "一级菜单 tree 1",
dataGroup: "one",
_key: "three",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "二级菜单 item 1",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
exact: true,
exactActiveClass: "active",
dataGroup: "three",
_key: "five",
to: { name: "SidebarMenuExact2" }
}
]
},
{
_type: "nly-sidebar-nav-tree",
target: "components-three",
icon: "nav-icon fas nlyfont nly-icon-dashboard",
text: "一级菜单 tree 2",
dataGroup: "one",
_key: "four",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "二级菜单 item 2",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact3" },
dataGroup: "four",
_key: "six"
},
{
_type: "nly-sidebar-nav-item",
_name: "二级菜单 item 3",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact4" },
dataGroup: "four",
_key: "seven"
},
{
_type: "nly-sidebar-nav-tree",
target: "components-four",
accordion: "sss",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
text: "二级菜单 tree 1",
dataGroup: "four",
_key: "eight",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "三级菜单 item 1",
icon: "nav-icon fas nlyfont nly-icon-logo-aperture",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact5" },
dataGroup: "eight",
_key: "nine"
}
]
},
{
_type: "nly-sidebar-nav-tree",
target: "components-five",
accordion: "sss",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
text: "二级菜单 tree 2",
dataGroup: "four",
_key: "ten",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "三级菜单 item 2",
icon: "nav-icon fas nlyfont nly-icon-logo-aperture",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact6" },
dataGroup: "ten",
_key: "11"
},
{
_type: "nly-sidebar-nav-tree",
target: "components-six",
accordion: "ssss",
icon: "nav-icon fas nlyfont nly-icon-logo-aperture",
text: "三级菜单 tree 1",
dataGroup: "ten",
_key: "12",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "四级菜单",
icon: "nav-icon fas nlyfont nly-icon-logo-pinterest",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact7" },
dataGroup: "12",
_key: "13"
}
]
}
]
}
]
}
]
}
];
```
`sidebarList` 支持的属性如下:
- `_type`, 组件名称或者 html 标签字符串
- `_name`, 插入到组件默认插槽的文本
- `attrs`, attrs 属性
- `directives`, 指令,但并不是所有的指令都支持,只支持 jsx 支持的指令
- `on`, 函数事件
- `nativeOn`, 原生函数事件
- `class`, css 类名
- `style`, 式样对象
- `domProps`, dom 参数
- `scopedSlots`, 作用于插槽
- `slot`, 插槽
- `key`, `vue :key`
- `ref`, `ref` 属性
- `refInFor`,
- `id`, dom 的 id
- `prop` name, 组件 prop, 比如上列中的 `to` prop, `exact` prop
其中 `_type` 为 `nly-sidebar-nav-tree` 的时候额外支持属性:
- `dataGroup`, 父组件的 `vue :key` 值
`nly-sidebar-menu` 支持全路由自动匹配激活模式, 配置该模式, `nly-sidebar-nav-item` 节点会自动激活,且此节点的父元素如果是 `nly-sidebar-nav-tree` 会自动激活且展开。
- 开启自动匹配激活模式的时候, 需要给 `nly-sidebar-nav-tree`, `nly-sidebar-nav-item` 传入属性`dataGroup`。
点击查看 [`demo`](http://nly-adminlte-vue-demo.nejinn.com/#/sidebar-menu-exact), demo 代码如下:
```html
<template>
<nly-wrapper layout="fixed">
<nly-wrapper-header style="height:57px">
<nly-button v-nly-sidebar-collapse.sidebar-collapse>点击收起</nly-button>
</nly-wrapper-header>
<nly-sidebar-menu :sidebarList="sidebarList" side-mini exact />
<router-view />
<nly-wrapper-footer style="height:57px">footer</nly-wrapper-footer>
<nly-overlay v-nly-sidebar-collapse.overlay sidebar />
</nly-wrapper>
</template>
<script>
export default {
data() {
return {
sidebarList: [
{
_type: "nly-sidebar-nav",
_class: "mt-2",
dataGroup: "zero",
_key: "one",
exact: true,
"child-indent": true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "一级菜单 item 1",
icon: "nav-icon fas nlyfont nly-icon-dashboard",
exact: true,
exactActiveClass: "active",
dataGroup: "one",
_key: "two",
to: { name: "SidebarMenuExact1" }
},
{
_type: "nly-sidebar-nav-tree",
target: "components-two",
icon: "nav-icon fas nlyfont nly-icon-dashboard",
text: "一级菜单 tree 1",
dataGroup: "one",
_key: "three",
exact: true,
_children: [
{
_type: "template",
_slot: "linktool",
_children: [
{
_name: `1`,
_type: "nly-badge",
variant: "info",
badgeClass: "right"
}
]
},
{
_type: "nly-sidebar-nav-item",
_name: "二级菜单 item 1",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
exact: true,
exactActiveClass: "active",
dataGroup: "three",
_key: "five",
to: { name: "SidebarMenuExact2" }
}
]
},
{
_type: "nly-sidebar-nav-tree",
target: "components-three",
icon: "nav-icon fas nlyfont nly-icon-dashboard",
text: "一级菜单 tree 2",
dataGroup: "one",
_key: "four",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "二级菜单 item 2",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact3" },
dataGroup: "four",
_key: "six"
},
{
_type: "nly-sidebar-nav-item",
_name: "二级菜单 item 3",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact4" },
dataGroup: "four",
_key: "seven"
},
{
_type: "nly-sidebar-nav-tree",
target: "components-four",
accordion: "sss",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
text: "二级菜单 tree 1",
dataGroup: "four",
_key: "eight",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "三级菜单 item 1",
icon: "nav-icon fas nlyfont nly-icon-logo-aperture",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact5" },
dataGroup: "eight",
_key: "nine"
}
]
},
{
_type: "nly-sidebar-nav-tree",
target: "components-five",
accordion: "sss",
icon: "nav-icon fas nlyfont nly-icon-logo-polymer",
text: "二级菜单 tree 2",
dataGroup: "four",
_key: "ten",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "三级菜单 item 2",
icon: "nav-icon fas nlyfont nly-icon-logo-aperture",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact6" },
dataGroup: "ten",
_key: "oneone"
},
{
_type: "nly-sidebar-nav-tree",
target: "components-six",
accordion: "ssss",
icon: "nav-icon fas nlyfont nly-icon-logo-aperture",
text: "三级菜单 tree 1",
dataGroup: "ten",
_key: "onetwo",
exact: true,
_children: [
{
_type: "nly-sidebar-nav-item",
_name: "四级菜单",
icon:
"nav-icon fas nlyfont nly-icon-logo-pinterest",
exact: true,
exactActiveClass: "active",
to: { name: "SidebarMenuExact7" },
dataGroup: "onetwo",
_key: "onethree"
}
]
}
]
}
]
}
]
}
]
};
}
};
</script>
```