umijs / umi

A framework in react community ✨
https://umijs.org
MIT License
15.38k stars 2.65k forks source link

关于切换导航 页面请求发送两次问题 #2832

Closed lnden closed 5 years ago

lnden commented 5 years ago

What happens?

根据 语雀 https://www.yuque.com/umijs/umi 编辑页面,发现每次切换顶部导航页面请求都会发送两次,从任意页面进入导航页“/hero“、“/item”、“/summoner” subscriptions 里面执行判断pathname==='/hero'为true两次

Mini Showcase Repository(REQUIRED)

https://alitajs.github.io/alita-course/

How To Reproduce

Steps to reproduce the behavior: 1.本地启动项目 切换导航,查看控制台的请求,每切换一次,相同请求发送两次

Expected behavior 1.切换导航正常情况下pathname === '/hero'只有一次为true,走一次请求

Context

lnden commented 5 years ago

刚才看了一下已经关闭的问题,发现#2766、#2688 这两个问题和我提交的问题相同

sorrycc commented 5 years ago

给可复现仓库。

lnden commented 5 years ago

给可复现仓库。

我给你一个比较规范的作者仓库吧,我刚才试着clone这个仓库yarn start 也会出现请求发送两次 https://github.com/umijs/umi-course/tree/master/hero

dilidili commented 5 years ago

原因在于 subscriptions 里的 history listener 比 connected-react-router 里的 history listener 早注册,导致 subscriptions 中触发的 redux/dispatch 引起了下面这个代码的执行:

if (pathnameInHistory !== pathnameInStore || searchInHistory !== searchInStore || hashInHistory !== hashInStore) {
  _this.inTimeTravelling = true; // Update history's location to match store's location

  history.push({
    pathname: pathnameInStore,
    search: searchInStore,
    hash: hashInStore
  });
}

当轮到 connected-react-router 中的 history listener 执行时,又触发了一次 location 的修改,导致 subscriptions 中的 history listener 被重新触发了。

以前我遇到的时候是把 listeners.push(listener); 改成 listeners.unshift(listener)。不过可以把 dva/core 中的 run(_model.subscriptions, _model, app, onError); 执行顺序后置么,看起来影响很大。 @sorrycc

sorrycc commented 5 years ago

@dilidili 能修改 connected-react-router 解决这个问题么?我们可以 fork 一份出来。

dilidili commented 5 years ago

@dilidili 能修改 connected-react-router 解决这个问题么?我们可以 fork 一份出来。

应该是可以的。可以在 connected-react-router 的 middleware 里:

var routerMiddleware = function routerMiddleware(history) {
  history.listen(() => {
    history._locationChangeSentry = true;
  });
...
};

这样可以把所有在 history listeners 执行过程中产生的 dispatch 全部忽略掉。

WingWang2017 commented 5 years ago

这问题在最新 umi 还是出现了

Hexa-gram commented 5 years ago

上一页的请求在下一页切换时还会被执行一次 复现地址https://github.com/Hexa-gram/umi-bug

WingWang2017 commented 5 years ago

希望早点修复吧,我是在 .umirc.js 加dynamicImport:true解决的,可我不想开启这功能

Fuphoenixes commented 5 years ago

有解决办法吗?我现在在迁移umi1.0的项目到2.0时也遇到了相同的问题。

niufen0420 commented 5 years ago

遇到了同样的问题

howel52 commented 5 years ago

目前我们这边的做法是将 subscriptions 中的事件挪到了 didMount 里

Fuphoenixes commented 5 years ago

哎!本来不想迁移的,可是不迁移umi1.0的文档都打不开了

WingWang2017 commented 5 years ago

开启路由懒加载也可以

satanrabbit commented 5 years ago

dva 的问题, dva@2.4.x 的没问题,现在只能暂时使用dva 2.4.x版本,问题存在很久了,期待解决

ZH4L commented 5 years ago

dva 的问题, dva@2.4.x 的没问题,现在只能暂时使用dva 2.4.x版本,问题存在很久了,期待解决

终于看到个能用的解决方案,感动哭

Fuphoenixes commented 5 years ago

https://github.com/umijs/umi/issues/2693#issue-460232283

xiaohuoni commented 5 years ago

https://github.com/umijs/umi/issues/2693 相同问题