reactjs - 反应路由器不通过 history.push() 渲染组件
问题描述
import { React } from "react";
import { Router as MyRouter, Switch, Route } from "react-router-dom";
import NavBar from "./Components/NavBar";
import Article from "./Components/Article";
import Articles from "./Components/Articles";
var createBrowserHistory = require("history").createBrowserHistory;
const history = createBrowserHistory();
const Router = () => {
return (
<div>
<MyRouter history={history}>
<NavBar />
<Switch>
<Route exact path="/" component={Articles} />
<Route exact path="/home/:title/:id" component={Article} />
</Switch>
</MyRouter>
</div>
);
};
我有一个显示文章列表的组件,如果您单击其中一篇文章,您将被重定向到该文章的详细信息。此外,文章仅使用 id 参数从服务器获取内容。我通过使用实现了
const history = useHistory();
const onclick = (title, id) =>{
history.push(`/home/${title}/${id}`);
}
最初,我对这种结构没有任何问题。但是,当我添加了一篇随机测试文章并单击它时,url 发生了变化,但组件从未呈现(我试图在文章组件中记录“hello world”但它从未被打印出来)。奇怪的是,如果我手动输入localhost:3000/home/fijdaifjaid/100
带有一些随机标题和正确 id 的 url(路由器无法为其渲染组件的 id),组件的渲染没有问题,但是如果我手动输入正确的标题,它不会工作。(我的标题是“#1优先”)
关于这里的问题有什么建议吗?另外我应该注意这不是一个普遍的问题,我还有其他几个运行良好的测试 ID。
我的依赖:
"react": "^17.0.2",
"react-router-dom": "^5.2.0",
解决方案
代替路由器使用浏览器路由器:
import { React } from "react";
import { BrowserRouter as MyRouter, Switch, Route } from "react-router-dom";
import NavBar from "./Components/NavBar";
import Article from "./Components/Article";
import Articles from "./Components/Articles";
// var createBrowserHistory = require("history").createBrowserHistory;
// const history = createBrowserHistory();
const Router = () => {
return (
<div>
<MyRouter basename={process.env.PUBLIC_URL}>
<NavBar />
<Switch>
<Route exact path="/" component={Articles} />
<Route exact path="/home/:title/:id" component={Article} />
</Switch>
</MyRouter>
</div>
);
};
在构建之前不要忘记在你的 package.json 中添加主页:
"homepage": "https://xxxxx.github.io",
推荐阅读
- javascript - 跨域请求被阻止:同源策略不允许在 `localhost:...` 读取远程资源 - ExpressJS 和 npm Cors
- postgresql - Pg admin 4:MAC OS 上用户“postgres”的身份验证失败
- javascript - 未捕获的 TypeError:this.testFunction 不是函数
- r - 从工作区文件恢复以前的 R 代码
- c++ - 我应该使用 2 个 VBO 进行实例化吗?
- mathjax - 如何使用 Arithmatex 和 MathJax 获取 MkDocs 以将 \\[ ... \\] 识别为显示数学分隔符?
- python - 为什么单击功能在页面上不起作用,但在控制台上起作用?
- python - 为什么会说“TypeError:'Label' object is not callable”?
- node.js - 如何在 shell 中运行此命令?
- symfony - Symfony 5.3 用户通过用户名或电子邮件登录