小程序页面返回时,哪些数据需要重新取
一个订单列表页进入详情再返回,究竟要不要重新请求?每次显示都请求最省心,但滚动位置容易跳,接口也会多跑。只在首次加载时请求,又可能看不到详情页刚做的修改。
首次进入与再次显示分开
首次创建页面时,读取路由参数,初始化筛选条件,再请求第一页。页面再次显示时,先判断是否发生了影响列表的操作。例如详情页修改了备注,可以通知上一个列表页更新那一项;如果取消订单会改变列表成员,就标记列表需要重新获取。
关键是由操作结果决定是否刷新,而不是打开详情就先设一个“可能变了”的标记。请求失败时保留需要刷新的标记,成功拿到新列表后再清除,否则一次失败就会让页面长期展示旧内容。
不要让两次初始化同时跑
如果首次创建和页面显示都会调用加载函数,就要明确谁负责第一次请求。可以让显示回调统一触发,把创建回调留给参数初始化;也可以用一个正在加载的 Promise 合并重复调用。具体选哪种并不重要,重要的是首次进入只有一条清楚的路径。
保留用户正在看的位置
对于翻了多页的列表,我倾向于先更新已知的那一项,只有筛选条件改变或列表成员发生变化时才从第一页重取。必须重取时,给出可见的刷新提示,不要悄悄清空整页。
页面卸载时清掉订阅和定时器。否则下一次进入,同一条事件可能被旧页面和新页面各处理一次。排查这种问题时,在日志里附上页面实例编号,比只打印事件名称容易看清楚。