为什么在使用“react-router”在页面之间切换时功能反应组件中的状态会重置

Why does the state reset in functional react component when changing between pages using `react-router`

为什么使用 react-router 在页面之间切换时,反应组件中的状态会重置?


据我了解,只要您使用 'react' 更改方式,您就应该能够使用 react-router 在路由(组件)之间切换,即。 <Link to="/otherRoute" />。我不是这种情况,我不明白为什么。这是代码:

App.js


import RoutesComp from "./RoutesComp";
import { Link } from "react-router-dom";

function App() {
  return (
    <div className="App">
      <p>
        <Link to="/state">State</Link>
      </p>
      <p>
        <Link to="/dummy">dummy</Link>
      </p>
      <RoutesComp />
    </div>
  );
}

export default App;

StateComp.js

import React, { useState } from "react";

const StateComp = () => {
  const [counter, setCounter] = useState(0);

  return (
    <>
      <button onClick={() => setCounter((prev) => prev + 1)}>click to increment</button>
      <p>{counter}</p>{" "}
    </>
  );
};

export default StateComp

RoutesComp.js

import React from "react";

import { Route, Switch } from "react-router-dom";
import StateComp from "./StateComp";
import Dummy from "./Dummy";

const RoutesComp = (props) => {
  return (
    <>
      <Switch>
        <Route path="/state" render={() => <StateComp />} />
        <Route path="/dummy" render={() => <Dummy />} />

// I also tried it the original way
        {/* <Route path="/state">
          <StateComp />
        </Route>
        <Route path="/dummy">
          <Dummy />
        </Route> */}
      </Switch>
    </>
  );
};

export default RoutesComp;

这会产生以下结果:

当您点击递增按钮时,计数增加,但是当您转到 'dummy' 页面并返回 'state' 页面时,计数器再次为 0。

根据我的研究, react router difference between component and render 如果您使用

创建路由,状态似乎会被重置
<Route path="/state">
    <StateComp />
</Route>
<Route path="/dummy">
    <Dummy />
</Route>

但是,让状态不被重置的方法似乎是使用render={() => <Comp/>}。 我也试过了,但没用。

任何人都可以提供一些关于我做错了什么的见解吗?


编辑: Dependencies/Versions

"dependencies": {
    "@testing-library/jest-dom": "^5.14.1",
    "@testing-library/react": "^11.2.7",
    "@testing-library/user-event": "^12.8.3",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router": "^5.0.0",
    "react-router-dom": "^5.0.0",
    "react-scripts": "4.0.3",
    "web-vitals": "^1.1.2"

Switch 组件只渲染一条路线,最早的匹配者获胜。路由不匹配的组件全部卸载

为避免这种情况,您需要将 Route 组件移到 Switch 组件之外,并使用 children 属性 渲染您的组件。

下面是一个实现上述方法的示例:example codesandbox link

其他一些解决方法包括:

  1. 使用 reduxuseContext 提升您的状态 API
  2. 使用url参数来存储状态(不适用于复杂的组件)

有用的链接: