TDesign的Menu菜单动态数据怎么保持展开状态?
我在用TDesign做左侧导航栏时遇到了问题,菜单项是通过v-for动态生成的,但每次刷新页面后展开状态就会重置。我尝试用v-model:selected-keys和default-expand-all属性都没搞定,代码大概是这样:
<template>
<t-menu mode="inline" theme="light" :default-expanded=["/dashboard"]
v-model:selected-keys="activeKeys">
<t-sub-menu v-for="item in menus" :key="item.path" :value="item.path">
<template #title>{{ item.title }}</template>
<t-menu-item v-for="child in item.children" :key="child.path">
{{ child.title }}
</t-menu-item>
</t-sub-menu>
</t-menu>
</template>
现在的问题是:手动展开的菜单在数据更新后会收起,怎么才能让展开状态持久保持?查了文档也没找到合适的属性组合,有没有类似场景的解决经验?
你应该用 v-model:expanded 和一个响应式数组来维护展开的 key。比如:
关键点有两个:一是必须给 t-menu 加上 v-model:expanded 绑定,二是要把这个状态存到 localStorage 里,不然刷新页面还是会丢。TDesign 的 menu 组件不会自己持久化状态,得自己手动存取。
另外注意每个 submenu 和 menuitem 都要带 value 属性,不然 key 对不上也会失效。我之前踩过这坑,看着结构对了但就是不展开,最后发现是 value 没传。
default-expanded是不行的,因为它只在初始化生效一次。真正要解决得用
expanded-keys这个受控属性,配合路由或者本地存储来持久化状态。我一般这样处理:先把展开的 key 用一个 ref 存起来
然后把组件上的
:default-expanded换成:expanded-keys和@expand-change来同步状态这样每次用户手动展开或收起,
expandedKeys都会更新。如果你想刷新后也保留,就再加一层 localStorage 同步这样更清晰,而且完全可控。TDesign 的文档确实没把这个讲清楚,但只要把
expanded-keys变成受控模式,问题就解开了。