Vue 3 或者 Svelte 中,从无限滚动列表页进入详情页,返回后如何滚动到之前的位置? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zwdsix
V2EX    前端开发

Vue 3 或者 Svelte 中,从无限滚动列表页进入详情页,返回后如何滚动到之前的位置?

  •  
  •   zwdsix 2022-11-03 20:38:29 +08:00 1456 次点击
    这是一个创建于 1148 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我最近一直在 Svelte 上尝试写手机端的 web app ,有这么几种方案:

    1. 离开列表前,在 sessionStorage 里记录位置,返回时读取位置,滚动到之前保存的位置;

      这种方法有几个问题:首先,每次切换 view 时,之前的 view 实例被销毁,加载新的 view, 然后加载数据。这种情况下,从详情回到表页,需要知道之前滚动到了第几页。

      而翻页又有起码两种实现方式,一种是往下滚动的时候不停地加载后面的页面,view 上保留着所有页面数据的内容;另一种是无论怎么滚动都只保留前一页、当前页和后一页的 3 页内容。如果用的是第一种方式,那么每次回到列表,都要加载完所有页面,然后再调用 window.scrollTo() 滚动到目标位置。试想想翻了 100 多页的情况,这显然不合理;如果用的是第二种方式,嗯… 实现起来会复杂很多,倒也不是不行。

    2. 离开 view 之前不让 view 实例销毁,而是隐藏起来。这样回来之后,自然恢复到原来的状态,但是这种方式需要路由或者框架本身的支持。而且如果离开列表的目标不是去查看详情,而是修改数据,回来之后还得刷新被修改的数据,似乎也不好搞。

    想请教一下大家平时都是怎么处理这个问题的?

    或者,web app 的开发有其它替代方案来解决这种编辑之后回不到原来位置问题,而不是在这一种方案的实现上死磕?

    7 条回复    2022-11-07 13:42:22 +08:00
    makelove
        1
    makelove  
       2022-11-03 21:17:39 +08:00
    返回还要重查数据不太合理吧?可以把已查出的列表数据存在全局状态管理里,返回时直接同步渲染出来并定位,用户应该察觉不到页面跳动。
    至于状态同步,都用状态管理方案了本地全局状态自然就是和后端同步的。
    VtoEXL
        2
    VtoEXL  
       2022-11-04 09:01:39 +08:00
    vue3 中使用 keep-alive ,和配置 vue-router 的 scroll-behavior 达到效果

    https://router.vuejs.org/zh/guide/advanced/scroll-behavior.html
    zwdsix
        3
    zwdsix  
    OP
       2022-11-04 16:28:09 +08:00
    @VtoEXL 谢谢。vue3 和 vue-router 的文档我也在看的,keep-alive 这个我知道。但是如果场景是从列表的某一项点进去编辑,保存之后回到刚刚的位置,用 keep-alive 的话,就看不到刚保存的值,还得刷新一下吧?
    VtoEXL
        4
    VtoEXL  
       2022-11-04 17:45:49 +08:00
    @zwdsix #3 keep-alive 可以只配置你需要的内容,我的场景是只让列表页 keep-alive 。
    zwdsix
        5
    zwdsix  
    OP
       2022-11-05 16:45:22 +08:00
    @VtoEXL 不知道是我没理解你的意思还是你没理解我的意思。我是说当你想编辑列表上的某一项的时候,进入编辑界面,无论是保存还是不保存,退出之后,仍然可以滚动到刚才离开列表时的位置。如果保存了,列表又用了 keep-alive, 那列表上刚刚被修改的那一项数据不就是旧的吗?如果不用 keep-alive, 不就不能回到刚才离开的位置吗?这两个需求用 keep-alive 来实现是冲突的啊。
    VtoEXL
        6
    VtoEXL  
       2022-11-07 09:22:09 +08:00
    @zwdsix 如果你有更新的话,你可以在编辑页面更新成功时,通过 event-bus 来通知列表页有更新,更新对应的一项,再返回的话就时新的数据了。
    lynan
        7
    lynan  
       2022-11-07 13:42:22 +08:00
    前几年我在用 vue2 的时候,子路由容器是绝对定位在父级路由上层的,所以父级没有被销毁,不需要考虑记录位置的问题,还可以直接修改父级路由数据。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5770 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 06:16 PVG 14:16 LAX 22:16 JFK 01:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86