iview的menu组件垂直菜单有个自动展开属性open-names,可以指定一个数组,只要submenu子菜单组件的name属性的值在open-names数组之中,菜单组件渲染后,相应的子菜单就会被自动展开。
<template> <Row> <Col span="8"> <Menu :theme="theme2" :open-names="['1','2','3']"> <Submenu name="1"> <template slot="title"> <Icon type="ios-paper" /> 内容管理 </template> <Submenu name="2"> <template slot="title"> <Icon type="ios-people" /> 用户管理 </template> <MenuItem name="2-1">新增用户</MenuItem> <MenuItem name="2-2">活跃用户</MenuItem> <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> </Submenu> <MenuItem name="1-1">文章管理</MenuItem> <MenuItem name="1-2">评论管理</MenuItem> <MenuItem name="1-3">举报管理</MenuItem> </Submenu> </Menu> </Col> <Col span="8"> </Col> <Col span="8"> </Col> </Row> </template> <script> export default { data () { return { theme2: 'light' } } } </script>
这个示例是iview官方文档的示例上稍作修改。在线运行这个示例
open-names数组中的子菜单都展开了。这是给静态数据的,但在实际情况中,open-names的值不一定能在menu渲染前就得到。将open-names的值延时设置一下。
//menu的open-names的值设置成data中的变量 <Menu :theme="theme2" :open-names="openItems"> ... //script的修改 <script> export default { data () { return { theme2: 'light', openItems:[] } }, mounted(){ //设置延时 setTimeout(()=>{ this.openItems=['1','2','3']; },2000); } } </script>
修改后再次在线运行,可以看见菜单并没有因open-names属性的修改而同步展开,再看官方文档,在API中有这么一个方法。
有了这个方法,我们就可以让菜单组件重新渲染来展开子菜单了。修改相应代码。
<template> <Row> <Col span="8"> <Menu :theme="theme2" ref="m1" :open-names="openItems"> <Submenu name="1"> <template slot="title"> <Icon type="ios-paper" /> 内容管理 </template> <Submenu name="2"> <template slot="title"> <Icon type="ios-people" /> 用户管理 </template> <MenuItem name="2-1">新增用户</MenuItem> <MenuItem name="2-2">活跃用户</MenuItem> <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> </Submenu> <MenuItem name="1-1">文章管理</MenuItem> <MenuItem name="1-2">评论管理</MenuItem> <MenuItem name="1-3">举报管理</MenuItem> </Submenu> </Menu> </Col> <Col span="8"> </Col> <Col span="8"> </Col> </Row> </template> <script> export default { data () { return { theme2: 'light', openItems:[] } }, mounted(){ //设置延时 setTimeout(()=>{ this.openItems=['1','2','3']; //同理可以设置菜单选中项 //下个时间点更新菜单 this.$nextTick(()=>{ this.$refs["m1"].updateOpened(); //同理这里可以更新菜单选中项 }); },2000); } } </script>
修改后,再次在线运行,这样就能看到展开的效果了。