为啥 react-router 在调度时会自动返回上一个路由

Posted

技术标签:

【中文标题】为啥 react-router 在调度时会自动返回上一个路由【英文标题】:why react-router automatically go back to previous route on dispatch为什么 react-router 在调度时会自动返回上一个路由 【发布时间】:2020-08-03 11:26:22 【问题描述】:

我有一个旧应用程序想要添加 react-router 到它。具体来说,我正在使用HashRouter。该应用程序还使用reduxreact-redux,但没有其他中间件,如 saga 或 thunk。

该应用程序有几个选项卡,每个挂载时都会调用loadData 从后端获取。当我在选项卡#1 中并尝试导航到选项卡#2 时,调用#2 的loadData 方法。但是在调用dispatch 时,页面会自动返回到标签#1。数据正在加载,当它被加载时(所有调度都已被调用),我尝试导航到 tab#2,这次它成功了。

我不明白为什么。看起来每次调用dispatch 时,路由器都会将窗口位置恢复到以前的位置。谁能给我提示一下如何解决它?

简化代码:

tab#1 和 tab#2 都有相似的结构

function tab1(props)
const [initialized, setInitialized] = useState(false);
const dispatch = useDispatch();

useEffect(()=>
  if(!initialized)
    loadData();
    setInitialized(true);
  
, [initialized])

function loadData()
  // if data already in store, exit function early.
  // otherwise:
  dispatch(type: 'REQUEST_DATA');
  // fetch backend
  // after receive json, dispatch
  dispatch(type:'RECEIVE_DATA', data: json);


return (
 // return
)


index.js

import React from "react";
import ReactDOM from "react-dom";
import  Provider  from "react-redux";
import  createStore, combineReducers, applyMiddleware  from "redux";
import  HashRouter, Switch, Route  from "react-router-dom";
import logger from "redux-logger";
import * as reducers from "./reducers";
import createPersistedState from './createPersistedState';
...

let middlewares = [];
if (!window.production) 
  middlewares = [logger]


const reducer = combineReducers( ...reducers );

const persistedState = createPersistedState();

const store = createStore(reducer, persistedState, applyMiddleware(...middlewares));

...

const render = () => 
  ReactDOM.render(
    <React.StrictMode>
      <Provider store=store>
          <div id="root-container">
            <HashRouter>
              <ErrorBoundary >
               <Header />
               <div className="app-wrapper">
                 <Switch>
                   <Route path='/tab1' component=tab1/>
                   <Route path='/tab2' component=tab2/>
                 </Switch>
               </div>
               <Footer />
             </ErrorBoundary>
           </HashRouter>
          </div>
      </Provider>
    </React.StrictMode>,
    document.getElementById("app")
  );
;

reducers/index.js

export default as reducer1 from './reducer1'
export default as reducer2 from './reducer2'
export default as reducer3 from './reducer3'
export default as reducer4 from './reducer4'

【问题讨论】:

你能把你的reducer的代码贴出来吗? @AdrianPascu 谢谢我编辑了上面的 index.js。我没有更改路由的原始减速器。 @AdrianPascu 我找到了原因,它在减速器上。 【参考方案1】:

好吧,结果证明 react-router 和 redux 都不是问题,而是我忽略了更新的旧减速器。在那个 reducer 中,window.location.hash 默认是重置的。这解释了一切——每次调度都会触发该减速器。删除后,一切都按预期工作。

【讨论】:

以上是关于为啥 react-router 在调度时会自动返回上一个路由的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Redshift 在加入时会自动修剪 varchar 列?

为啥 UISearchBar 在导航返回时会出现奇怪的闪烁?

为啥有些游戏在 iPhone 重新安装时会自动继续进行?

为啥numpy点积函数在传递两个TensorFlow变量对象时会返回错误?

为啥 Xcode 自动补全在导入时会提示 .m 文件?

为啥我的自动化测试在一起运行时会失败,但单独通过?