列表查询、分页和筛选怎么设计
先理解原理和示例,再练习完整口述与追问。
回答要点
区分编辑中的筛选项与已提交条件;条件变化时回到第一页;明确 loading、空数据、失败重试。连续查询要处理响应乱序,避免旧结果覆盖新结果。
原理拆解
表单草稿、已提交条件和响应结果属于不同状态。若分页直接读取正在编辑的输入框,用户还没点查询就可能把新关键词带进第二页请求。提交时固定条件快照,分页只改变 page;筛选变化重置 page。请求版本同时保护数据、错误、总数和 loading,才不会出现结果正确但加载状态错误。删除后的页码应基于真实总数或服务端结果修正。
示例与推演
条件快照可理解为 applied = {...draft, page:1}。请求开始保存本次序号 current = ++version;await 后仅在 current === version 时赋值;catch 和 finally 也做相同检查。用户点击重置时先清空 draft,再创建新的 applied 与新序号。URL 可以保存可公开的查询条件,敏感信息和超大对象不放 URL。
易错点
防抖只能减少发起频率,不能保证响应顺序。取消请求可以节省资源,但取消失败或服务端仍在执行时,仍需版本校验;空结果与失败也不能都显示成“暂无数据”。
参考回答可直接练习口述
我会把表单正在编辑的筛选项与实际提交的查询条件分开,点查询时固定一份条件并回到第一页,分页请求继续使用这份条件。列表明确维护 loading、成功、空结果和错误重试。每次请求增加标识,只允许最新请求修改列表、总数和 loading。删除当前页最后一条后,如果当前页已超出总页数,就回到仍存在的末页重查。是否保留条件和滚动,由返回页面的业务需求决定,不默认全部清空或全部缓存。
面试官可能继续问追问与完整解答展开收起
追问
删除当前页最后一条怎么办?请求还没结束又点重置怎么办?返回页面要不要保留查询条件?
追问回答
删除后页码超界就回到有效末页;重置时生成新请求标识并取消或忽略旧响应;返回是否恢复筛选和滚动应由业务定义,可放路由、页面缓存或专门状态中,并在数据失效时刷新。