展开状态需在会话内保持
别名: 树展开记忆 · 折叠状态保持 · 会话内展开 · expanded nodes
概念解释
展开一棵树是在空间里铺出一条工作路径:打开哪些父节点、看到哪一段子树,本身就是用户刚做完的导航。会话内保持展开(session-persistent tree expansion)要求这条路径在同一次使用里不要被系统默默收回——切到别的页再回来、刷新局部数据、选中另一个节点,都不该把已经打开的枝折回去。它不管深度怎么画,只管「我铺开的现场还在不在」。
机制
树的可见形状是用户用一连串展开动作换来的外部记忆。工作记忆并不保存「我打开过哪七个夹」,这些夹之所以还在眼前,是因为界面替人记着。系统若在重绘时回到「全部折叠只留根」,等于把外部记忆擦掉,用户必须按刚才的顺序再点一遍。局部刷新、虚拟滚动回收节点、根据选中项自动折叠旁支,都是常见的擦除来源:对程序它们是状态重置,对用户它们是迷路。保持展开不是永久记住偏好,而是承认展开是导航状态,应与当前选中项、滚动位置同一级别被保留。跨会话是否记住是另一笔账;会话内先把现场保住,跨会话再决定要不要当偏好。
怎么研究
让被试按任务展开一条深层路径,然后插入一次会触发重绘的干扰(切换侧栏、应用筛选、选中旁支节点),再要求继续刚才的任务。记录重新展开的次数、找到原节点的时间、口头「树被收起来了」的报告。自变量:重绘类型、是否保留展开集、旁支是否被自动折叠。因变量:路径重建成本、错误地以为节点丢失的比例。不要用「好不好用」代替「展开集是否还在」。
边界
数据集的根被整体替换(换了仓库、换了账号)时,旧展开集指向的节点已经不存在,保持会变成指向幽灵,应清空。节点 id 不稳定、每次加载都换主键,所谓保持只是在折叠一棵新树。极深且分支极多的树把展开集持久化可能变成性能问题,那是实现上限,不能反过来变成「每次都收拢」的理由——可先保留最近的路径而不是全部枝。只读的演示树每次打开都从根讲起,重置反而是叙事需要。
怎么落地
- 把展开中的节点 id 当作导航状态,与选中项一起在会话里存;局部刷新时按 id 复原,而不是按位置复原。
- 选中新节点时不要自动折叠旁支,除非旁支与新选择在任务上互斥,并且折叠是用户能看见的动画而不是瞬切。
- 根数据替换时显式清空展开集,并让树从新根开始,避免展开指向已删除的节点。
- 验证:展开一条三层路径,去做一次会重绘树的操作,回来看路径是否还在。不在,就查是哪一次重置把它擦了。