V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nishavayaZhou
V2EX  ›  React

react 如何实现先加载数据后跳转路由?

  •  
  •   nishavayaZhou · 56 天前 · 1763 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当用户点击列表中某一条数据时,先请求其对应的数据,等接口返回数据之后,再从列表页进入至详情页。

    12 条回复    2022-07-14 09:03:22 +08:00
    ericls
        1
    ericls  
       56 天前 via iPhone
    getData().then(history.push)
    demonzoo
        2
    demonzoo  
       56 天前
    这。。。你要看你跳转是怎么实现的。
    如果是通过 router link 实现的,那需要把 router link 干掉,用 onClick 来实现。onClick 里面先去发 API 获取数据,同时页面置成 loading state ,然后数据回来之后把 loading 取消,然后再用 react-router-dom 的 navigate 方法跳转路由
    nishavayaZhou
        3
    nishavayaZhou  
    OP
       56 天前
    我当前的做法是,拦截所有通过 link 的跳转,请求玩数据之后,将其存储到 context 中,然后再回复路由的跳转。
    但是这么实现感觉十分糟糕,需要考虑用户直接进入详情以及用户在历史记录中切换,这样会导致详情会有两个数据来源(一个从 context 中获取,一个直接从服务端获取)。
    bojue
        4
    bojue  
       56 天前
    你这个是做下一个页面的大量数据预加载?如果是获取数据的话跳转完毕加一个 loading 效果
    liiihhhh
        5
    liiihhhh  
       56 天前
    如果用的是 React Router 可以试试
    ```
    let navigate = useNavigate();

    const onClick=()=>{

    getData().then(data=> navigate("../page", { state: data }) ) ;

    }

    ```
    nishavayaZhou
        6
    nishavayaZhou  
    OP
       56 天前
    我在使用这个网站的时候发现的这个效果 https://filfox.info/,觉得这种先加载数据再跳转路由的功能,比加 loading 效果的用户体验很好。想在我的项目中实现这个功能。
    我在 react 的官网上关于 Suspense 描述的内容上也有提及先加载数据在渲染的思想,但是当我使用 Suspense 的时候发发现真的很难用
    wellerman
        7
    wellerman  
       56 天前
    这不就是缓存么,把 localStorage 和数据请求封装在一起不就行了么。可以用自定义 hook 。
    gouflv
        8
    gouflv  
       55 天前 via iPhone
    这活儿还是用 redux 或者 context 来搞吧,Suspense 可用场景不多
    yimity
        9
    yimity  
       55 天前
    没看过,但是应该满足你的需求,可以看一下。
    zepc007
        10
    zepc007  
       55 天前
    SSR 也算一种策略?
    darkengine
        11
    darkengine  
       54 天前
    一个思路:用户点击的时候直接跳转,把数据 id 作为参数加到跳转链接里(例如 /book?id=xxxx ),跳转的目标组件解析链接里带的 id 参数,再根据这个参数拉取数据进行渲染。
    ddch1997
        12
    ddch1997  
       26 天前
    用 react-qeury ,在列表页的时候后台自动拉取对应详情页的数据,等点击详情的时候,详情页拉取的接口就是缓存好的数据,这样不知可不可行
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1323 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:26 · PVG 07:26 · LAX 16:26 · JFK 19:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.