问题
在对象列表(数据模式 ObjectView)中,用户输入搜索词或设置高级筛选(FilterBuilder)条件后,通过侧边栏切换到其他页面,再切回该列表时,过滤条件全部丢失,又变回未过滤的全量列表。
根因:搜索词(searchTerm)和高级筛选(currentFilters)是 ListView 的组件本地 state,导航离开时 ListView 被卸载,state 随之销毁。虽然快速筛选会写入 uf_* URL 参数,但 URL 参数只在刷新 / 浏览器后退时保留 —— 通过应用内导航链接离开(该链接不带查询串)再回来时同样会丢。
期望
用户在列表里输入的过滤条件,切换到其他页面再回到该列表时应自动保留。
方案
按 用户 × 对象 × 视图 维度,把运行时过滤状态(高级筛选 + 搜索词)缓存到 localStorage,ListView 挂载时读取并恢复。
- 新增
packages/app-shell/src/views/listFilterStorage.ts:buildListFilterKey / read / write(300ms 防抖写入,状态为空时删除键)。
- 存储键形如
list-filters:<userId>:<对象>:<视图ID>,内嵌 userId,避免同一浏览器切换账号时互相读到对方的过滤条件(过滤值可能敏感)。列宽 grid-columns-* 是纯外观、故意不按用户隔离,这里不同。
ObjectView 在 onFilterChange / onSearchChange 时写入,挂载时经新增的 initialFilters / initialSearchTerm 恢复。ListView 用 key 在视图切换时重挂载,所以懒初始化能按视图正确重读。
- 不触碰服务端共享视图定义(
persistViewPatch);本永续层是纯用户个人、端末本地的附加层。
先只覆盖普通对象列表(ObjectView);InterfaceListPage 后续视需要再跟进。
问题
在对象列表(数据模式
ObjectView)中,用户输入搜索词或设置高级筛选(FilterBuilder)条件后,通过侧边栏切换到其他页面,再切回该列表时,过滤条件全部丢失,又变回未过滤的全量列表。根因:搜索词(
searchTerm)和高级筛选(currentFilters)是ListView的组件本地 state,导航离开时ListView被卸载,state 随之销毁。虽然快速筛选会写入uf_*URL 参数,但 URL 参数只在刷新 / 浏览器后退时保留 —— 通过应用内导航链接离开(该链接不带查询串)再回来时同样会丢。期望
用户在列表里输入的过滤条件,切换到其他页面再回到该列表时应自动保留。
方案
按 用户 × 对象 × 视图 维度,把运行时过滤状态(高级筛选 + 搜索词)缓存到
localStorage,ListView挂载时读取并恢复。packages/app-shell/src/views/listFilterStorage.ts:buildListFilterKey/read/write(300ms 防抖写入,状态为空时删除键)。list-filters:<userId>:<对象>:<视图ID>,内嵌 userId,避免同一浏览器切换账号时互相读到对方的过滤条件(过滤值可能敏感)。列宽grid-columns-*是纯外观、故意不按用户隔离,这里不同。ObjectView在onFilterChange/onSearchChange时写入,挂载时经新增的initialFilters/initialSearchTerm恢复。ListView用key在视图切换时重挂载,所以懒初始化能按视图正确重读。persistViewPatch);本永续层是纯用户个人、端末本地的附加层。先只覆盖普通对象列表(
ObjectView);InterfaceListPage后续视需要再跟进。