reactjs - 路由器无法与 Link 一起使用(React Router Dom 6)

标签 reactjs react-router-dom create-react-app

所以我在一个新的原始 CRA 5( typescript )应用程序上对此进行了测试。在 App.tsx 中,我刚刚将其内容替换为:

import { Router, Routes, Route, Link } from "react-router-dom";
import "./App.css";

interface IProps {
  appHistory: any;
}

function App(props: IProps) {
  const { appHistory } = props;

  return (
    <div className="App">
      <Router location={appHistory.location} navigator={appHistory}>
        <ul>
          <li>
            <Link to="/">
              <strong>Home</strong>
            </Link>
          </li>
          <li>
            <Link to="/about">
              <strong>About</strong>
            </Link>
          </li>
          <li>
            <Link to="/pricing">
              <strong>Pricing</strong>
            </Link>
          </li>
        </ul>

        <Routes>
          <Route path="/" element={<div>Home Page</div>}></Route>
          <Route path="/about" element={<div>About Page</div>}></Route>
          <Route path="/pricing" element={<div>Pricing Page</div>}></Route>
        </Routes>
      </Router>
    </div>
  );
}

export default App;

还有index.tsx:

import React from "react";
import ReactDOM from "react-dom/client";
import { createBrowserHistory } from "history";
import "./index.css";
import App from "./App";

const appHistory = createBrowserHistory();
const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);

root.render(
  <React.StrictMode>
    <App appHistory={appHistory} />
  </React.StrictMode>
);

这似乎不起作用。路由不起作用。无论您单击什么,它都会保留在主页上。没有控制台错误日志。

我想明确使用 Router 组件来满足应用程序设计要求。 (尝试微前端架构)。

有人知道我在这里错过了什么吗?

感谢任何帮助! 提前致谢!

库版本:

"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-router-dom": "^6.3.0",
"react-scripts": "5.0.1",
"typescript": "^4.6.3",
"history": "^5.3.0"

注释

  • 是的,我知道 BrowserHistory,是的,它工作得很好。
  • 我已经在有或没有history@5 lib的情况下对此进行了测试,但它仍然不起作用
  • 删除 CRA 上的测试文件,因为它会导致我上面的代码出现问题。

最佳答案

const appHistory = createBrowserHistory() 移出组件。您需要稳定的历史引用。

您还需要实现一些历史状态。使用BrowserRouter source代码作为高级路由器如何实例化其历史上下文的示例。

示例:

const history = createBrowserHistory();

function App() {
  const [state, setState] = useState({
    action: history.action,
    location: history.location
  });

  useLayoutEffect(() => history.listen(setState), [history]);

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>

      <Router
        location={state.location}
        navigationType={state.action}
        navigator={history}
      >
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
          <li>
            <Link to="/pricing">Pricing</Link>
          </li>
        </ul>
        <Routes>
          <Route path="/" element={<h1>Home</h1>} />
          <Route path="/about" element={<h1>About</h1>} />
          <Route path="/pricing" element={<h1>Pricing</h1>} />
        </Routes>
      </Router>
    </div>
  );
}

Edit router-does-not-work-with-link-react-router-dom-6

关于reactjs - 路由器无法与 Link 一起使用(React Router Dom 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71868736/

相关文章:

javascript - ReactJS 通过 API 调用保护路由

reactjs - 如何替换 componentWillRecieveProps

javascript - 子组件不更新 Prop 更新

javascript - react js : Error: useLocation() may be used only in the context of a <Router> component

reactjs - 使用 redux-saga 重定向 react 路由器

javascript - 更新到 Jest 26 后模拟中断

node.js - 在特定浏览器中运行 create-react-app

javascript - 在函数中初始化的 typescript 继承属性被覆盖

reactjs - React Native - StyleSheet.absoluteFill() 和 StyleSheet.absoluteFillObject() 有什么区别?

reactjs - 将按钮链接到另一个页面