1、需求导入
今天在修改Vue管理系统平台项目的左侧导航栏时发现,直接添加手风琴属性(即:最多只展开一个节点菜单)accordion
时是没有反应的,查阅官网的API
也没查不到具体是什么原因导致,下面是iview
官网的api
文档说明以及示例:
这是官网的示例代码:
<Col span="8">
<Menu :theme="theme2" :open-names="['1']" accordion>
<Submenu name="1">
<template slot="title">
<Icon type="ios-paper" />
内容管理
</template>
<MenuItem name="1-1">文章管理</MenuItem>
<MenuItem name="1-2">评论管理</MenuItem>
<MenuItem name="1-3">举报管理</MenuItem>
</Submenu>
<Submenu name="2">
<template slot="title">
<Icon type="ios-people" />
用户管理
</template>
<MenuItem name="2-1">新增用户</MenuItem>
<MenuItem name="2-2">活跃用户</MenuItem>
</Submenu>
<Submenu name="3">
<template slot="title">
<Icon type="ios-stats" />
统计分析
</template>
<MenuGroup title="使用">
<MenuItem name="3-1">新增和启动</MenuItem>
<MenuItem name="3-2">活跃分析</MenuItem>
<MenuItem name="3-3">时段分析</MenuItem>
</MenuGroup>
<MenuGroup title="留存">
<MenuItem name="3-4">用户留存</MenuItem>
<MenuItem name="3-5">流失用户</MenuItem>
</MenuGroup>
</Submenu>
</Menu>
</Col>
这确实能够实现手风琴,但是我在这个基础上修改,调用的视图是从后台那边拿过来的时候,却意外的发现用不了了,代码如下:
<Menu
class="menu-demo"
accordion
:active-name="$route.path"
:theme="theme"
v-for="item in list"
:key="item.id"
>
<!-- 展开没有子菜单 -->
<MenuItem
v-if="!item.children || item.children.length == 0"
:key="item.id"
:name="item.url"
:to="item.url"
>
<Icon :custom="item.src"></Icon>
<!-- <Icon :type="item.src"></Icon> -->
<span>{{ item.title }} </span>
</MenuItem>
<!-- 展开有子菜单 -->
<Submenu :name="item.id" v-else>
<template slot="title">
<!-- <Icon :type="item.src"></Icon> -->
<Icon :custom="item.src"></Icon>
<!-- {{item.name}} -->
<span>{{ item.title }} </span>
</template>
<MenuItem
v-for="i in item.children"
:key="i.id"
:name="i.title"
:to="i.url"
>
{{ i.title }}
</MenuItem>
</Submenu>
</Menu>
2、解决途径
直接添加属性上去是没有任何反应的,中午翻阅了下资料,得知,最好不要直接遍历MenuItem
元素,我就使用一个template
去包裹它在循环处理,为什么使用template
呢?因为template
是不会在页面渲染时会有dom
元素占位的,因为他编译后不会出现在元素的结构中去。
后来修改后的代码如下:
<Menu
:accordion="true"
:active-name="$router.path"
router
theme="light"
ref="child"
style="width: 200px"
>
<!-- 展示的数据视图列表 -->
<template v-for="item in list">
<template v-if="item.children && item.children.length > 0">
<Submenu :name="item.id" :key="item.id">
<template slot="title">
<Icon :custom="item.src"></Icon>
<span>{{ item.title }} </span>
</template>
<template v-for="child in item.children">
<MenuItem :key="child.id" :name="child.title" :to="child.url">
{{ child.title }}</MenuItem
>
</template>
</Submenu>
</template>
<template v-else>
<MenuItem :key="item.id" :name="item.url" :to="item.url">
<Icon :custom="item.src"></Icon>
<!-- <Icon :type="item.src"></Icon> -->
<span>{{ item.title }} </span>
</MenuItem>
</template>
</template>
</Menu>
经过处理后,手风琴效果便成功的展示了,但是中间有个问题,熟悉Vue
的都知道,v-for
需要绑定key
,这样才能让虚拟DOM
高效更新。问题就出在这里,如果试图给<template>
绑定key,那么控制台就会报错,这是为什么呢?原因也正是key
的优点导致的,key
值的绑定便于dom
高效更新,但是template
在编译后会是不会在出现在渲染的结果中的,意思说白了就是编译完它就不存在了,那么你的key
如果绑定在template
上,它都不存在了还如何去让它去高效更新呢?解决方法是可以用将key
值绑定在MenuItem
上,这样就很好的避免了上述问题,同时,如果还有其他的需求也可以利用api
的文档去修改,比如:我们想修改左侧导航栏的样式或者当点击某个导航栏的时候触发一些提醒或者什么的,都可以利用如下的api
去实现:

iview官网api.png
3、展示结果
导航栏展示效果.gif
© 著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务

喜欢的朋友记得点赞、收藏、关注哦!!!